Gieneq Styczeń 12, 2021 Udostępnij Styczeń 12, 2021 @Benji_Tomek ciekawa sprawa, ale to dalej mały rozrzut. W botlandzie dostępne są 4 warianty fotorezystorów opisanych przez rezystancję jasną - przy oświetleniu 10 luxami 5-10k, 10-20k, 20-30k, 50-100k. Spróbuj zmierzyć rezystancję każdego z nich wyciągniętego z płytki, w podobnej pozycji tak by załapał się na jeden z minimalnych progów rezystancji i wtedy porównaj. Rezystor powinien mieć rezystancję jasną od 20 do 30 k czyli jeżeli trafisz na egzemplarze które mają rozrzut poniżej 10k to jest OK 1
Treker (Damian Szymański) Styczeń 13, 2021 Udostępnij Styczeń 13, 2021 @Benji_Tomek faktycznie różnica jest całkiem spora, ale raczej po prostu trafiłeś na takie same elementy, które faktycznie mają spory rozrzut wartości. Między innymi właśnie dlatego podczas korzystania z czujników analogowych bardzo często trzeba dokonywać kalibracji, aby mieć większą pewność co do ich odczytów.
Opinel Styczeń 14, 2021 Udostępnij Styczeń 14, 2021 (edytowany) Hej, Zrobiłem zadanie 4.6 w następujący sposób: #define leftR A4 #define rightR A5 //zdefiniowanie czujników #define greenL 3 #define yellowL 4 #define red 5 #define yellowR 6 #define greenR 7 // zdefiniowanie diod int readingL = 0; //odczyty lewego fotorezystora int readingR = 0; // odczyt z prawego fotorezystora int diff = 0; // różnica odczytów void setup() { Serial.begin(9600); pinMode(greenL, OUTPUT); pinMode(yellowL, OUTPUT); pinMode(red, OUTPUT); pinMode(yellowR, OUTPUT); pinMode(greenR, OUTPUT); // ustawienie diod digitalWrite(greenL, LOW); digitalWrite(yellowL, LOW); digitalWrite(red, LOW); digitalWrite(yellowR, LOW); digitalWrite(greenR, LOW); // ustawienie domyślnego trybu diod } void loop() { readingL = analogRead(leftR); readingR = analogRead(rightR); // przypisanie odczytów delay(300); // opóźnienie zwiększające płynność. diff = readingL - readingR; // przypisanie różnicy Serial.println(diff); //wyświetlenie różnicy if (diff > 100 && diff < 300){ // jeżeli różnica jest z zakresu 100 - 300 zaświeca się lewa żółta digitalWrite(greenL, LOW); digitalWrite(yellowL, HIGH); digitalWrite(red, LOW); digitalWrite(yellowR, LOW); digitalWrite(greenR, LOW); delay(50); } if (diff > 301) { // jeżeli różnica jest ponad 301 zaświeca się lewa zielona digitalWrite(greenL, HIGH); digitalWrite(yellowL, LOW); digitalWrite(red, LOW); digitalWrite(yellowR, LOW); digitalWrite(greenR, LOW); delay(50); } if (diff < -100 && diff > -500){ // jeżeli różnica jest pomiędzy -100 - -500 zaświeca się dioda prawa żółta digitalWrite(greenL, LOW); digitalWrite(yellowL, LOW); digitalWrite(red, LOW); digitalWrite(yellowR, HIGH); digitalWrite(greenR, LOW); delay(50); } if (diff < -501){ // jeżeli różnica jest mniejsza od -501 zaświeca się dioda prawa zielona digitalWrite(greenL, LOW); digitalWrite(yellowL, LOW); digitalWrite(red, LOW); digitalWrite(yellowR, LOW); digitalWrite(greenR, HIGH); delay(50); } else { // zaświeca się dioda czerwona digitalWrite(greenL, LOW); digitalWrite(yellowL, LOW); digitalWrite(red, HIGH); digitalWrite(yellowR, LOW); digitalWrite(greenR, LOW); delay(50); } } Jednak przy zmianie położenia źródła światła, diody zaczynają mrugać na zmianę z czerwoną (warunek else) nawet wtedy kiedy spełniane są wyłącznie warunki z pozostałych diod. Przy modyfikacji else na if w taki sposób: if (diff < 99 && diff > -99) { // jeżli różnica jest pomiędzy 99 a -99 zaświeca się dioda czerwona digitalWrite(greenL, LOW); digitalWrite(yellowL, LOW); digitalWrite(red, HIGH); digitalWrite(yellowR, LOW); digitalWrite(greenR, LOW); delay(50); } Wszystko zdaje się działać poprawnie. Nie rozumiem jednak czemu przy else zachowanie jest tak dziwne, skoro przy wyżej wypisanym IFie wsadziłem pozostałe warunki czyli de facto to samo co powinno się wykonywać przy "else" Edytowano Styczeń 14, 2021 przez Opinel literówka 1
Gieneq Styczeń 15, 2021 Udostępnij Styczeń 15, 2021 @Opinel możliwe że nie masz konstrukcji else if i wtedy tylko ostatni if ma wpływ na końcowy else. Fajnie że kod działa, ale możesz spróbować potraktować zadanie inaczej, bez infów zadanie z 2 gwiazdkami, ale możesz popróbować 1
crus7pl Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 Cześć! Prośba o konsultację do zadania 4.4. Rodziło się w bólach, ale widzę, że ktoś już walczył z funkcją while. Wydaje mi się, że mój kod działa i chyba nawet robi co trzeba , ale pewnie można by to zrobić lepiej. Poniżej kod: int odczytanaWartosc = 0; //zmienna do przechowywania odczytu ADC int prog = 0; //próg włączenie światła ustawiany potencjometrem float napiecie=0; //wartość przeliczona na napięcie w V void setup() { pinMode(8, OUTPUT); //konfirguracja wyjść pod diodę LED Serial.begin(9600); //uruchomienie komunikacji USART } void loop() { odczytanaWartosc = analogRead(A5); //odczytanie wartości z ADC prog = analogRead(A4); if (odczytanaWartosc < prog) { napiecie = odczytanaWartosc * (5.0/1024.0); //przeliczenie wartości na napięcie Serial.println(napiecie); // wyświetlenie napięcia z dzielnika digitalWrite(8, HIGH); //włączenie diody while (odczytanaWartosc < prog) { odczytanaWartosc = analogRead(A5); //odczytanie wartości z ADC } } else { digitalWrite(8, LOW); //wyłączenie diody } delay(50); } Musiałem wstawić "odświeżanie" odczytanej wartości do środka funkcji while inaczej dioda zaczynała świecić po spełnieniu warunku i już nie chciała przestać. Intuicja mi podpowiada, że while to nie jest zbyt finezyjne rozwiązanie (takie zawieszanie programu). A także, że użycie tej funkcji w poważniejszym zastosowaniu raczej byłoby bez sensu. Pytanie czy działa "wystarczająco dobrze" na tym etapie edukacji i czy ewentualnie można coś poprawić. Być może ktoś już wpadł na podobne rozwiązanie i gdzieś tu jest na forum, ale czytanie cudzych kodów w takiej ilości na razie zawiesza mi system. Więc jak robię powtórkę to przepraszam! Pozdrawiam i czekam na uwagi!
Gieneq Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 @crus7pl zauważ że zdarzenie ma się pojawić raz - sterujesz diodą co każdy obrót pętli, a tu musisz wykryć pewne zdarzenie podobne do obśługi przycisku. Sprawdź ten wpis, tylko że zamiast przycisku trzymasz poprzednią wartość zmiennej:
crus7pl Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 @Gieneq Dzięki za odpowiedź! Postaram się wieczorem przestudiować podlinkowany wpis. Natomiast jeśli dobrze zrozumiałem polecenie z zadania po każdym włączeniu diody arduino ma wysłać tylko raz do komputera napięcie jakie pojawiło się na dzielniku. Wydawało mi się, że ten kod to robi. Chyba, że problem leży w tym, że zatrzymuję całość "programu". Ale to nie było zabronione. Jeśli dobrze rozumiem to co napisałem, to jeśli warunek jest odpowiedni do włączenia diody to dioda zostaje włączona, napięcie jest wysłane na komputer i zawieszamy się w pętli while. Jej warunek jest tożsamy z warunkiem funkcji if, czyli dopóki warunek świecenia diody jest spełniony to utknęliśmy w while. Jeśli warunek nie jest spełniony wypadamy do else, dioda gaśnie i znowu całość rusza w pętli dopóki warunek do włączenia diody nie zostanie spełniony. Ewentualnie w while mógłbym jeszcze odświeżać próg włączenia diody, inaczej przy zmianie/regulowaniu progu przy włączonej diodzie mogę się z pętli while nie wydostać. Czy jeszcze bardziej nie rozumiem, niż mi się wydaje, że nie rozumiem? Tak czy inaczej przejrzę podesłany wpis, spróbuję go zrozumieć (bo to dopiero 4 lekcja) i zastosować. Pozdrawiam
Opinel Styczeń 16, 2021 Udostępnij Styczeń 16, 2021 Dnia 15.01.2021 o 07:52, Gieneq napisał: @Opinel możliwe że nie masz konstrukcji else if i wtedy tylko ostatni if ma wpływ na końcowy else. Fajnie że kod działa, ale możesz spróbować potraktować zadanie inaczej, bez infów zadanie z 2 gwiazdkami, ale możesz popróbować Faktycznie. Dałem konstrukcje if -> else if -> else i teraz działa. Zaczynam rozumieć też dlaczego tak się dzieje. Dzięki! Próbowałem jeszcze bez Ifów. Zastąpiłem je while, ale wtedy odczyt z potencjometrów zaczytuje się tylko raz, po czym uruchamia się odpowiedni zakres while i wszystko stoi
crus7pl Styczeń 17, 2021 Udostępnij Styczeń 17, 2021 @Gieneq czy o to chodziło? Czy coś namieszałem? #define czujnik_swiatla A5 #define czujnik_progu A4 #define dioda_led 8 int odczytana_wartosc = 0; int prog = 0; float napiecie=0; boolean ostatni_komunikat = false; boolean wyslany_komunikat = false; void setup() { // put your setup code here, to run once: pinMode (dioda_led, OUTPUT); Serial.begin (9600); } void loop() { // put your main code here, to run repeatedly: odczytana_wartosc = analogRead(czujnik_swiatla); prog = analogRead(czujnik_progu); napiecie = odczytana_wartosc * (5.0/1024.0); if (odczytana_wartosc<prog) { digitalWrite (dioda_led, HIGH); wyslany_komunikat = true; } else { digitalWrite (dioda_led, LOW); wyslany_komunikat = false; } if (wyslany_komunikat == true && ostatni_komunikat == false) { Serial.println (napiecie); delay(1000); } ostatni_komunikat = wyslany_komunikat; } Pozdrawiam 1
Gieneq Styczeń 18, 2021 Udostępnij Styczeń 18, 2021 @crus7pl tak, teraz wygląda lepiej Możesz jeszcze w podobny sposób sterować LEDem - ustawić podczas detekcji zmiany stanu. Ciągła próba wpisania wartości LED nic nie psuje ale praktyczniej byłoby wpisywanie wartości tylko gdy coś się zmienia. Dobrze jest, ale możesz jeszcze rozwinąć to zadanie w ramach nauki
crus7pl Styczeń 18, 2021 Udostępnij Styczeń 18, 2021 @Gieneq Dzięki! Podejmuję rękawicę, ale muszę dopytać w takim razie. Czy uważasz, że zmianę stanu diody na HIGH wystarczy przerzucić do funkcji wysyłającej komunikat? Czy lepiej zrobić to oddzielną funkcją, gdybym w przyszłości chciał rozwodu tych dwóch funkcjonalności w tej jakże wypasionej lampce? Pytanie dodatkowe(zapewne z tych głupich), ale nigdzie nie rzuciła mi się w oczy odpowiedź. W omawianym nawet wcześniej kodzie ustawiłem pin diody jako wyjście i ustawiam sobie na nim stan wedle potrzeby. Pytanie czy to rozsądne/bezpieczne/możliwe napisać funkcję weryfikującą stan wyjścia, np.: if (dioda_led = HIGH) { } Czy mogę zapytać o stan wyjścia w ten sposób? Czy to jakaś herezja, wejść wyjściem lub wyjść wejściem?
Gieneq Styczeń 18, 2021 Udostępnij Styczeń 18, 2021 56 minut temu, crus7pl napisał: Czy uważasz, że zmianę stanu diody na HIGH wystarczy przerzucić do funkcji wysyłającej komunikat? Tak, możesz tak zrobić. Dorób drugą funkcję która wykrywa zdarzenie przeciwne go tego co już masz, zmiana stanu w drugą stronę i tam gaś diodę. Jedynie pozostanie warunek na porównywanie z progiem. 57 minut temu, crus7pl napisał: Czy mogę zapytać o stan wyjścia w ten sposób? Czy to jakaś herezja, wejść wyjściem lub wyjść wejściem? Niestety to może nie herezja, ale to nie zadziała. Jak chcesz uzyskać wartość to robisz: bool wynik = dioda_led == HIGH; == oznacza przyrównanie, więc powyższe to odpowiedź na pytanie czy dioda_led jest HIGH? Więc jeżeli ma to być w warunku to robisz tak: if (dioda_led == HIGH) { } albo prościej: if (dioda_led) { } jak będzie HIGH (czyli 1) to warunek będzie spełniony. 1
crus7pl Styczeń 18, 2021 Udostępnij Styczeń 18, 2021 @Gieneq Dzięki za dotychczasową pomoc! Wprowadziłem zmiany. Wydaje mi się, że zgodnie z sugestiami i że program robi swoje. Jeśli nie będzie dodatkowych zastrzeżeń do kodu biorę się za kolejną pracę domową... #define czujnik_swiatla A5 #define czujnik_progu A4 #define dioda_led 8 int odczytana_wartosc = 0; int prog = 0; float napiecie=0; boolean ostatni_komunikat = false; boolean wyslany_komunikat = false; void setup() { // put your setup code here, to run once: pinMode (dioda_led, OUTPUT); Serial.begin (9600); } void loop() { // put your main code here, to run repeatedly: odczytana_wartosc = analogRead(czujnik_swiatla); prog = analogRead(czujnik_progu); napiecie = odczytana_wartosc * (5.0/1024.0); if (odczytana_wartosc<prog) { wyslany_komunikat = true; } else { wyslany_komunikat = false; } if (wyslany_komunikat == true && ostatni_komunikat == false) { Serial.println (napiecie); digitalWrite (dioda_led, HIGH); delay(100); } if (wyslany_komunikat == false && ostatni_komunikat == true) { digitalWrite (dioda_led, LOW); delay(100); } ostatni_komunikat = wyslany_komunikat; } Pozdrawiam! 1
Gieneq Styczeń 19, 2021 Udostępnij Styczeń 19, 2021 @crus7pl wygląda dobrze tylko jeszcze jedna uwaga: if (odczytana_wartosc<prog) { wyslany_komunikat = true; } else { wyslany_komunikat = false; } można zawinąć do: wyslany_komunikat = odczytana_wartosc<prog; 1
wobyty Styczeń 31, 2021 Udostępnij Styczeń 31, 2021 Witam Mam dwa pytania 1. Działania funkcji AnalogRead czy funkcja ta odpowiada za zamianę sczytanego napięcia analogowego na sygnał cyfrowy w bitach od 0 do 1023 czy te bity sygnał analogowy zamieniony na reprezentację przez bity? 2. W programie woltomierza napięcie się zwiększa w sposób przewidywalny tzn. im bardziej kręcę potencjometrem w lewo od wartości równej 0.00V tym większe napięcie się na nim odkłada tak do momentu kiedy napięcie na potencjometrze zaczyna wynosić około 4.40 V wtedy zaczyna dziwnie zmieniać swoje wartości. Mam pytanie czy to jest związane z złym potencjometrem, coś może jest źle z kodem, czy Arduino. int odczytanawartosc = 0;//UTWORZENIE ZMIENNEJ int O NAZWIE odczytanawartosc JAKO ZERO float napiecie = 0;//UTWORZENIE ZMIENNEJ foat O NAZWIE napiecie JAKO ZERO void setup() { Serial.begin(115200);//ROZPOCZĘCIE TRANSMISJI Z ARDUINO O ZADANEJ PRĘDKOŚCI } void loop() { odczytanawartosc = analogRead(A0);//ODCZYTYWANIE WARTOŚĆ NAPIĘCIA Z PINU A0 PRZY POMOCY ADC(ANG ANALOG TO DIGITAL CONVERTER) KONWERSJA WARTOŚCI CIĄGŁEJ NA WARTOŚĆ CYFROWĄ OD 0 DO 1023 I PRZYPISANIE NIEJ DO ZMIENNEJ odczytanawartosc napiecie=odczytanawartosc*(5.0/1024.0);//ZAMIANA ODCZYTANEJ WARTOŚCI CYFROWEJ NA WARTOŚĆ ANALOGOWĄ NAPIĘCIA OD 0V DO 5V Serial.println(napiecie);//POKAZANIE ZMIENIONEJ WARTOŚCI NA MONITORZE PORTU SZEREGOWEGO delay(200);//OPÓŹNIENIE 0,2 s W CELU LEPSZEGO WYŚWIETLANIA SIĘ ODCZYTANEJ WARTOŚCI NA MONITORZE PORTU SZEREGOWEGO }
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ę »