Skocz do zawartości

Kurs Arduino - #2 - podstawy programowania, porty I/O


Komentator

Pomocna odpowiedź

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

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

Zarejestruj się lub zaloguj, aby ukryć tę reklamę.
Zarejestruj się lub zaloguj, aby ukryć tę reklamę.

jlcpcb.jpg

jlcpcb.jpg

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, 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

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

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.

  • Lubię! 1
Link do komentarza
Share on other sites

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

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

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

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Anonim
Dołącz do dyskusji! Kliknij i zacznij pisać...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.

×
×
  • Utwórz nowe...

Ważne informacje

Ta strona używa ciasteczek (cookies), dzięki którym może działać lepiej. Więcej na ten temat znajdziesz w Polityce Prywatności.