Kacper_112 Kwiecień 5, 2016 Udostępnij Kwiecień 5, 2016 Natomiast ja po tej części kursu poszedłem o kroczek dalej i wykorzystując poznane komendy spróbowałem napisać kod sygnalizacji świetlnej z przejściami dla pieszych i dodatkowym brzęczykiem, który w założeniach miał informować tych teoretycznych pieszych o możliwości przejścia.Niestety nie wiedzieć czemu mój kod mi nie działa... Bez zbędnego przedłużania, mój kod wygląda następująco: void setup() { //określanie wyjść/wejść i początkowych, jednorazowych działań pinMode(0, OUTPUT); //brzęczyk - sygnał możności przejścia pieszego przez jezdnię pinMode(1, INPUT_PULLUP); //Przycisk pieszy 1 pinMode(2, INPUT_PULLUP); //Przycisk pieszy 2 pinMode(3, OUTPUT); //zielone pieszy 1 pinMode(4, OUTPUT); //czerwone pieszy 1 pinMode(5, OUTPUT); //zielone pieszy 2 pinMode(6, OUTPUT); //czerwone pieszy 2 pinMode(7, OUTPUT); //pomarańczowe ostrzegające pieszy 2 pinMode(8, OUTPUT); //zielone auto 1 pinMode(9, OUTPUT); //żółte auto 1 pinMode(10, OUTPUT); //czerwone auto 1 pinMode(11, OUTPUT); //zielone auto 2 pinMode(12, OUTPUT); //żółte auto 2 pinMode(13, OUTPUT); //czerwone auto 2 //USTAWIENIA POCZĄTKOWE //zielone auto 2 digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); //czerwone pieszy 1 digitalWrite(3, LOW); digitalWrite(4, HIGH); //zielone auto 1 digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, HIGH); //czerwone pieszy 2; brak sygnału ostrzegawczego digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); } void loop() //pętla główna nie mająca wpływu na funkcje drugiego i większego poziomu (?) { if (digitalRead(1) == LOW) { //jeżeli naciśnięty przycisk pieszy 1 // żółte auto 1 po 5s delay(5000); digitalWrite(10, LOW); digitalWrite(9, HIGH); digitalWrite(8, LOW); digitalWrite(3, LOW); digitalWrite(4, HIGH); // czerwone auto 1 po 3s delay(3000); digitalWrite(10, HIGH); digitalWrite(9, LOW); digitalWrite(8, LOW); // zielone pieszy 1 po 1s delay(1000); digitalWrite(4, LOW); digitalWrite(3, HIGH); // miga zielone pieszy 1 po 8s przez 4s delay(8000); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(500); digitalWrite(4, LOW); digitalWrite(3, LOW); delay(500); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(500); digitalWrite(4, LOW); digitalWrite(3, LOW); delay(500); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(500); digitalWrite(4, LOW); digitalWrite(3, LOW); delay(500); digitalWrite(4, LOW); digitalWrite(3, HIGH); delay(500); digitalWrite(4, LOW); digitalWrite(3, LOW); delay(500); digitalWrite(4, LOW); digitalWrite(3, HIGH); //przerywane brzęczenie informujące o możności przejścia while(digitalWrite(3) == HIGH) { digitalWrite(0, HIGH); delay(500); digitalWrite(0, LOW); delay(500); } //po 0,5s czerwone pieszy 1 delay(500); digitalWrite(4, HIGH); digitalWrite(3, LOW); digitalWrite(0, LOW); // czerwone i żółte auto 1 po 1,1s delay(1100); digitalWrite(10, HIGH); digitalWrite(9, HIGH); digitalWrite(8, LOW); //zielone auto 1 po 1s delay(1000); digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); } else { //lub gdy nie wciśnięty przycisk pieszy 1 digitalWrite(10, LOW); digitalWrite(9, LOW); digitalWrite(8, HIGH); digitalWrite(3, LOW); digitalWrite(4, HIGH); digitalWrite(0, LOW); } if (digitalRead(2) == LOW) { //jeżeli naciśnięty przycisk pieszy 2 // żółte auto 2 po 5s delay(5000); digitalWrite(13, LOW); digitalWrite(12, HIGH); digitalWrite(11, LOW); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); // czerwone auto 2 po 3s delay(3000); digitalWrite(13, HIGH); digitalWrite(12, LOW); digitalWrite(11, LOW); // zielone pieszy 2 po 1s delay(1000); digitalWrite(6, LOW); digitalWrite(5, HIGH); // miga zielone pieszy 2 po 8s przez 4s delay(8000); digitalWrite(6, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(500); digitalWrite(6, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(500); digitalWrite(6, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(500); digitalWrite(6, LOW); digitalWrite(5, HIGH); delay(500); digitalWrite(6, LOW); digitalWrite(5, LOW); delay(500); digitalWrite(6, LOW); digitalWrite(5, HIGH); //przerywane brzęczenie informujące o możności przejścia while(digitalWrite(5) == HIGH) { digitalWrite(0, HIGH); digitalWrite(7, HIGH); delay(500); digitalWrite(0, LOW); digitalWrite(7, LOW); delay(500); } //po 0,5s czerwone pieszy 2 delay(500); digitalWrite(6, HIGH); digitalWrite(5, LOW); digitalWrite(7, LOW); digitalWrite(0, LOW); // czerwone i żółte auto 2 po 1,1s delay(1100); digitalWrite(13, HIGH); digitalWrite(12, HIGH); digitalWrite(11, LOW); //zielone auto 1 po 1s delay(1000); digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, HIGH); } else { //lub gdy nie wciśnięty przycisk pieszy 2 digitalWrite(13, LOW); digitalWrite(12, LOW); digitalWrite(11, HIGH); digitalWrite(5, LOW); digitalWrite(6, HIGH); digitalWrite(7, LOW); digitalWrite(0, LOW); } } Wykorzystałem tu wszystkie trzynaście pinów cyfrowych dostępnych w arduino UNO. Co jest nie tak ? Aha, podczas wgrywania jakiegoś tam prostego programu, któregoś z kolei, zauważyłem, że gdy przed wgrywaniem podłączę coś pod pin nr 13, to wyłącza się ta pomarańczowa lampka i tak jakby dioda którą podłączę do tego pinu przejmuje funkcję tej diody na płytce - ale tylko na chwile. Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Kwiecień 5, 2016 Udostępnij Kwiecień 5, 2016 Kacper_112, a na czym dokładnie polega problem? Co to znaczy, że kod nie działa? Jakie są objawy? Link do komentarza Share on other sites More sharing options...
Kacper_112 Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Kacper_112, a na czym dokładnie polega problem? Co to znaczy, że kod nie działa? Jakie są objawy? Po naciśnięciu przycisku wgrywania, czy li jak mi się wydaje też wcześniejszego sprawdzenia tego kodu, wyskakuje taki oto błąd (tam na dole w kolorze pomarańczowym): sygnalizacja_swietlna.ino: In function 'void loop()': sygnalizacja_swietlna.ino:88:25: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)' In file included from sygnalizacja_swietlna.ino:1:0: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:126:6: note: declared here void digitalWrite(uint8_t, uint8_t); ^ sygnalizacja_swietlna.ino:165:25: error: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)' In file included from sygnalizacja_swietlna.ino:1:0: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:126:6: note: declared here void digitalWrite(uint8_t, uint8_t); ^ Błąd kompilacji. Mam w związku z tym dwa pytania, mianowicie: Co to oznacza? i jak się do tego zabrać? Próbowałem to wyszukiwać w internecie, ale z mizernymi efektami. Proszę o pomoc i pozdrawiam. Link do komentarza Share on other sites More sharing options...
Chumanista Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Kacper_112, i dla tego właśnie angielski to podstawa robotyki, ważniejsza nawet niż fizyka: too few arguments to function 'void digitalWrite(uint8_t, uint8_t)' Wywołujesz digitalWrite z za małą liczbą argumentów. Link do komentarza Share on other sites More sharing options...
Polecacz 101 Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Zarejestruj się lub zaloguj, aby ukryć tę reklamę. Produkcja i montaż PCB - wybierz sprawdzone PCBWay! • Darmowe płytki dla studentów i projektów non-profit • Tylko 5$ za 10 prototypów PCB w 24 godziny • Usługa projektowania PCB na zlecenie • Montaż PCB od 30$ + bezpłatna dostawa i szablony • Darmowe narzędzie do podglądu plików Gerber Zobacz również » Film z fabryki PCBWay
Kacper_112 Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Kacper_112, i dla tego właśnie angielski to podstawa robotyki, ważniejsza nawet niż fizyka:too few arguments to function 'void digitalWrite(uint8_t, uint8_t)' Wywołujesz digitalWrite z za małą liczbą argumentów. Dzięki za odpowiedź, ale musi Pan pamiętać, że ja jestem bardzo początkującym użytkownikiem. Czy mógłby Pan zatem przedstawić mi ten problem bardziej dosłownie, tak żeby laik, taki jak ja, zrozumiał? Link do komentarza Share on other sites More sharing options...
Mechano Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Chodzi o to, że funkcja digitalWrite() potrzebuje dwóch wartości w nawiasie. Jeżeli jest inaczej to nie zadziała. Podajesz jej w nawiasie dwie liczby i będzie działać, linia (chyba) 88. 1 Link do komentarza Share on other sites More sharing options...
Chumanista Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Mechano dobrze mówi. Dwie liczby, numer pinu oraz 0 lub 1. Masz wszystko w dowolnym opisie tej funkcji w internecie. 1 Link do komentarza Share on other sites More sharing options...
Kacper_112 Kwiecień 6, 2016 Udostępnij Kwiecień 6, 2016 Chodzi o to, że funkcja digitalWrite() potrzebuje dwóch wartości w nawiasie. Jeżeli jest inaczej to nie zadziała. Podajesz jej w nawiasie dwie liczby i będzie działać, linia (chyba) 88. Dobra, już wiem o co chodzi. Rozwiązaniem jest użycie komendy "digitalRead" aby program odczytał bieżący stan pinu, a nie "digitalWrite", tak jak ja to zrobiłem w obu komendach "while" Dziękuję wam wszystkim bardzo za pomoc i zaangażowanie. Pozdrawiam,Kacper_112 Link do komentarza Share on other sites More sharing options...
Jaroslaw Kwiecień 9, 2016 Udostępnij Kwiecień 9, 2016 A to nie powinno być tak, że podane schematy połączeń powinny pierw przechodzić przez opornik następnie diodę i do masy? Link do komentarza Share on other sites More sharing options...
Sabre Kwiecień 10, 2016 Udostępnij Kwiecień 10, 2016 A to nie powinno być tak, że podane schematy połączeń powinny pierw przechodzić przez opornik następnie diodę i do masy? Przy połączeniu szeregowym, a takie tu występuje, kolejność elementów nie ma znaczenia. 1 Link do komentarza Share on other sites More sharing options...
LeOn_85 Maj 28, 2016 Udostępnij Maj 28, 2016 HEJ mam pytanie... Pętla void loop() { while (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona wyłącz delay(1000); digitalWrite(10, HIGH); //Czerwona włącz delay(1000); } } Zachowuje się tak samo jak pętla void loop() { if (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona wyłącz delay(1000); digitalWrite(10, HIGH); //Czerwona włącz delay(1000); } } Czyli jednak można migać diodą z pomocą pętli if?? __________ Komentarz dodany przez: Treker Kod programu, dla lepszej czytelności, należy umieszczać w tagach . Proszę to poprawić. Link do komentarza Share on other sites More sharing options...
Chumanista Maj 28, 2016 Udostępnij Maj 28, 2016 LeOn_85, IF TO NIE PĘTLA. Ale za to void loop() to pętla while(1). Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 28, 2016 Udostępnij Maj 28, 2016 LeOn_85, w tym wypadku będzie to działało, ale jeśli program zostanie rozbudowany, to już niekoniecznie. W przypadku użycia pętli while w chwili, gdy wciśnięty jest przycisk w pętli wykonywane są te linie: digitalWrite(10, LOW); //Czerwona wyłącz delay(1000); digitalWrite(10, HIGH); //Czerwona włącz delay(1000); I tylko one 🙂 W przypadku wykorzystania if'a (warunku, a nie pętli) wykonywany jest cały program w koło, czyli: if (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona wyłącz delay(1000); digitalWrite(10, HIGH); //Czerwona włącz delay(1000); } Po prostu cały czas wykonuje się pętla loop, a jeśli wciśnięty jest przycisk to dodatkowo migamy. Gdy program będzie rozbudowany i dojdą jakieś inne instrukcje, to miganie zostanie zakłócone przez rzeczy znajdujące się przed po if'ie. void loop() { // Jakiś kod umieszczony tutaj też się wykona i zakłóci miganie if (digitalRead(7) == LOW) { //Jeśli przycisk jest wciśnięty digitalWrite(10, LOW); //Czerwona wyłącz delay(1000); digitalWrite(10, HIGH); //Czerwona włącz delay(1000); } // Jakiś kod umieszczony tutaj też się wykona i zakłóci miganie } W efekcie uzyskasz 1 sekundowe mignięcia niekoniecznie w równych odstępach. Link do komentarza Share on other sites More sharing options...
LeOn_85 Maj 28, 2016 Udostępnij Maj 28, 2016 I wszystko jasne 🙂 dzięki wielkie 🙂 tak w ogóle Arduino wymiata 🙂 Link do komentarza Share on other sites More sharing options...
borewicz79 Czerwiec 26, 2016 Udostępnij Czerwiec 26, 2016 Witam Dopiero zaczynam z Arduino a programowanie pamiętam jedynie z mojej Atarynki 65XE 🙂 Potrzebuje prostego modułu monitorującego styki przekaźnika. Jeśli załączone to ma sterować innym przekaźnikiem generując 7 krótkich i 1 długi impuls. (chodzi o zmianę sygnału alarmowego z ciągłego na powyższy). Program jakoś napisałem ale czy jest inna opcja monitorowania spełnienia warunku i przerwania pętli w każdym momencie, niż taka, że po każdej linijce programu pętli wstawiamy "if" i "break" ??? #define relay1 2 // sygnał włączenia alarmu, switch/przekaźnik #define relay2 3 // wyjście sterujące przekaźnikiem void setup () { pinMode(relay2, OUTPUT); pinMode(relay1, INPUT_PULLUP); } void loop () { delay (25); digitalWrite(relay2,LOW); while (digitalRead(relay1)==LOW) { digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(1000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,HIGH); delay(5000); if (digitalRead(relay1)==HIGH) break; digitalWrite(relay2,LOW); delay(500); if (digitalRead(relay1)==HIGH) break; } } Link do komentarza Share on other sites More sharing options...
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ę »