Treker (Damian Szymański) Kwiecień 14, 2020 Udostępnij Kwiecień 14, 2020 @Lorenzini witam na forum i cieszę się, że forma kursu się podoba! Powodzenia podczas kolejnych eksperymentów 1
Wojtas002424 Kwiecień 14, 2020 Udostępnij Kwiecień 14, 2020 (edytowany) @Gieneq zrobiłem tak jak mówiłeś. Dodałem licznik który za każdym razem rozpoczęcia kodu zwiększa się o jeden, małe opóźnienie i warunek który wyświetla wartości fotorezystorów po osiągnięciu zadanej wartości. Po wszystkim zeruję licznik. Wszystko działa tak jak chciałem Edytowano Kwiecień 14, 2020 przez Wojtas002424 1
Bono Kwiecień 15, 2020 Udostępnij Kwiecień 15, 2020 Od paru dni zacząłem przygodę z Arduino i kursem. Miałbym pytanie o funkcję map(), wcześniej w kursie aby otrzymać liczbę zmiennoprzecinkową trzeba było napięcie zadeklarować jako float i dzielić/mnożyć przez .0. napiecie = odczytanawartosc * (5.0/1024.0); //przeliczanie wartosci na wolty Czy można za pomocą funkcji map() otrzymać liczbę zmiennoprzecinkową ? Próbuje w poniższy sposób ale nie wychodzi. Liczba jest typu float ale nie ma wartości po przecinku (jest 2.0; 3.0 itd) float napiecie = 0; napiecie = map(odczytanaWartosc,0,1023,1.0,5.0); //Skalowanie wartosci
ethanak Kwiecień 16, 2020 Udostępnij Kwiecień 16, 2020 (edytowany) 12 godzin temu, Bono napisał: Czy można za pomocą funkcji map() otrzymać liczbę zmiennoprzecinkową Nie - funkcja map działa na long int. Możesz zrobić podobną funkcję dla float/double: double fmap(double x, double in_min, double in_max, double out_min, double out_max) { return (x - in_min) * (out_max - out_min) / (in_max - in_min) + out_min; } W opisanym przypadku można jednak skorzystać z map() zmieniając np. zakres: float napiecie = map(odczytanaWartosc, 0, 1023, 0, 500) / 100.0; lub np. mierzyć napięcie w miliwoltach lub decywoltach: int napiecie = map(odczytanaWartosc, 0, 1023, 0, 5000); Polecam ten drugi sposób. Edytowano Kwiecień 16, 2020 przez ethanak 1
LuigiSu Kwiecień 18, 2020 Udostępnij Kwiecień 18, 2020 U mnie 4.6 wyszło tak: float odWarL = 0; //Zmienna do przechwytywania lewego float odWarP = 0; //Zmienna do przechwytywania prawego int suma; float wynik; void setup() { Serial.begin(9600); //uruchomienie komuniukacji pinMode(7, OUTPUT); //lewa pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); //prawa } void loop() { odWarL = analogRead(A4); // odczytuj wartości fotorezystorow odWarP = analogRead(A5); suma= odWarL + odWarP; wynik = (odWarL/suma); Serial.println(odWarL); Serial.println(odWarP); Serial.println(suma); Serial.println(wynik); //sprawdzanie próbkowania if (wynik <= 0.20){ digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); } else if (wynik <= 0.40){ digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); } else if (wynik <= 0.60){ digitalWrite(7, LOW); digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); } else if (wynik <= 0.80){ digitalWrite(7, LOW); digitalWrite(8, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } else { digitalWrite(7, HIGH); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); } delay(100); }
Treker (Damian Szymański) Kwiecień 19, 2020 Udostępnij Kwiecień 19, 2020 @LuigiSu witam na forum Można i tak, najważniejsze, że działa! Pamiętaj tylko, że podczas programowania tak małych mikrokontrolerów warto unikać operacji na liczbach zmiennoprzecinkowych (np. typu float) i stosować je tylko w ostateczności, bo pochłaniają stosunkowo dużo zasobów. Oczywiście w takim przypadku nie robi to wielkiej różnicy, ale jeśli się da to warto z nich rezygnować
LuigiSu Kwiecień 19, 2020 Udostępnij Kwiecień 19, 2020 (edytowany) @Treker Dziękuję za powitanie Starałem się zrealizować zadanie bez podglądania kodu innych użytkowników. Naturalnie zwrócę uwagę na inne możliwe rozwiązania i optymalizacje. Ps. Dzięki za ten kurs! Genialna robota, plus dzięki Tobie rozważam powrót na mechatronike Edit: Przy pisaniu funkcji sprawdzałem też odczyty i wartości jakie są podawane przez fotorezystory i zauważyłem, że czasami wartości są bardzo małe, stąd też chyba taka funkcja nie spełniłaby swojego zadania przy np słabym oświetleniu int FotorezLewy = 0; int FotorezPrawy = 0; float NapiecieLewy = 0; float NapieciePrawy = 0; void setup() { Serial.begin(9600); pinMode(8, OUTPUT); pinMode(9, OUTPUT); pinMode(10, OUTPUT); pinMode(11, OUTPUT); pinMode(12, OUTPUT); digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } void loop() { FotorezLewy = analogRead(A4); FotorezPrawy = analogRead(A5); FotorezLewy = map(FotorezLewy, 0, 1023, 1, 3); FotorezPrawy = map(FotorezPrawy, 0, 1023, 1, 3); Serial.println(FotorezLewy); Serial.println(FotorezPrawy); if (NapiecieLewy == 2) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, LOW); } else if (NapiecieLewy == 3) { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); } else if (NapieciePrawy == 2) { digitalWrite(8, LOW); digitalWrite(9, HIGH); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } else if (NapieciePrawy == 3) { digitalWrite(8, HIGH); digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); } else { digitalWrite(8, LOW); digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, LOW); digitalWrite(12, LOW); } delay(500); } Edytowano Kwiecień 20, 2020 przez Gieneq Zachęcam do używania bloku kodu
Treker (Damian Szymański) Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @LuigiSu miło słyszeć, że kurs się podoba Jeśli wartości są za małe to zawsze można jeszcze pokombinować z rezystorami, które są wpinane do dzielnika napięcia razem z fotorezystorami - zmiana wartości tych rezystorów powinna podbić wartości odczytywane przez Arduino.
LuigiSu Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @Treker Jasne, chętnie spróbuje, tylko czy nie będzie to dalej ustawiona wartość "na sztywno"? Mam tu na myśli, że zakładamy cały czas stały poziom naświetlenia. Stąd też mój pomysł na proporcje pomiędzy odczytami aby układ reagował niezależnie od mocy oświetlenia.
Treker (Damian Szymański) Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @LuigiSu ok, teraz rozumiem To możesz sobie dorobić np. jakiś system kalibracji takiego urządzenia - na początku badasz aktualny stan oświetlenia i uznajesz go za maksimum.
LuigiSu Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @Treker Naturalnie Czy tego typu funkcje wykorzystuje się też przy poważniejszych projektach czy są to jedynie zagadnienia wprowadzające do tematu Arduino? Mam na myśli wykorzystanie np w takich urządzeniach 1
Treker (Damian Szymański) Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @LuigiSu to są trochę bardziej rozbudowane układy, ale ogólna zasada działania jest podobna. Tutaj masz np. pośredni projekt: Arduino pomaga zwiększyć efektywność instalacji słonecznej, czyli coś bardziej rozbudowanego od tego z kursu, ale jednocześnie prostsze od projektu z Twojego filmiku. 1
BHBmacieg Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 32 minuty temu, LuigiSu napisał: @Treker Jasne, chętnie spróbuje, tylko czy nie będzie to dalej ustawiona wartość "na sztywno"? Mam tu na myśli, że zakładamy cały czas stały poziom naświetlenia. Stąd też mój pomysł na proporcje pomiędzy odczytami aby układ reagował niezależnie od mocy oświetlenia. Jeśli chcesz dorobić sobie "system kalibracji" - ustawiania minimalnego i natężenia światła, na które reaguje układ to ja coś na podobę robiłem tu: Może się przyda 2
LuigiSu Kwiecień 20, 2020 Udostępnij Kwiecień 20, 2020 @BHBmacieg Dzięki wielkie! Dziś planuje zrobić część 5 i 6 więc chętnie rzucę okiem 1
Pomocna odpowiedź
Bądź aktywny - zaloguj się lub utwórz konto!
Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony
Utwórz konto w ~20 sekund!
Zarejestruj nowe konto, to proste!
Zarejestruj się »Zaloguj się
Posiadasz własne konto? Użyj go!
Zaloguj się »