Skocz do zawartości

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


Komentator

Pomocna odpowiedź

Różnica jest ogromna. Instrukcja if to instrukcja warunkowa, która pozwala nam sprawdzić czy zaszły pewne okoliczności. While to pętla, dzięki której możemy wykonywać kilka operacji (nie)skończoną liczbę razy.

Zastanów się jak działają Twoje programy. Gdy używasz pętli while, to w momencie wciśnięcia przycisku, Arduino zaczyna wykonywać w koło tylko ten kod, który znajduje się wewnątrz tej pętli (miga diodami). W momencie puszczenie przycisku program wychodzi z tej pętli i robi pozostałe instrukcje. Druga wersja programu (z if'em) działa w taki sposób, że w każdym obiegu pętli loop() sprawdzany jest warunek i wykonywana jest odpowiednia część kodu, a oprócz tego wykonywany jest pozostały kod z pętli loop().

Programy nie robią nic więcej, więc w tym wypadku działają identycznie. Jednak jeśli w pętli loop() (poza while/if) byłoby cokolwiek innego to działały by już inaczej. Przy while fragment kodu poza tą pętlą nie byłby wykonywany jeśli przycisk byłby wciśnięty. W przypadku if'a wciskanie przycisku nie robiłoby żadnej różnicy - kod poza warunkiem i tak zawsze by się wykonywał (bo jest wewnątrz loop).

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

Witam, mam pytanie odnośnie stanu HIGH/LOW przycisku.

Przestudiowałem dosyć uważnie rozdział II kursu Arduino oraz odpowiedzi, które zostały udzielone na forum na różne pytania ale nie znalazłem odpowiedzi na moje pytanie.

Pytanie brzmi:

Dlaczego w kursie w przykładowych programach jest raz przypisany stan wysoki (HIGH), a raz stan niski (LOW) dla wciśniętego przycisku?

Odpowiedź na forum, która jest najbardziej właściwa i zgodna z prawdą to:

igor,
while(digitalRead(7)==HIGH)

oznacza tyle, że jeśli przycisk nie jest wciśnięty, to program sobie biega w tej pętli tak długo dopóki, dopóty nie wciśniesz go z powrotem, jak już go naciśniesz, to pętlę omija, bo jej warunek nie jest spełniony, innymi słowami trzymając przycisk wciśnięty cały czas, pętle while w tym kodzie są po prostu omijane. Chyba, że się mylę, to niech mnie ktoś poprawi.

Nie mniej jednak w dwóch miejscach przykładowych programów mam sprzeczne informacje.

Oto wersja pierwsza (z którą się zgadzam):

void setup() {
 pinMode(8, OUTPUT); //Dioda jako wyjście
 pinMode(7, INPUT_PULLUP); //Przycisk jako wejście
 :arrow:  digitalWrite(8, LOW); //Wyłączenie diody
}

void loop()
{
 if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty
   digitalWrite(8, HIGH); //Włącz diodę
   delay(10000); //Czekamy 10 sekund
   digitalWrite(8, LOW); //Wyłączamy diodę
 }
}

A to wersja druga, która tak bardzo miesza mi w głowie:

void setup() {
 pinMode(10, OUTPUT); //Dioda czerwona
 pinMode(9, OUTPUT); //Dioda żółta
 pinMode(8, OUTPUT); //Dioda zielona

 pinMode(7, INPUT_PULLUP); //Przycisk

 digitalWrite(10, LOW); //Wyłączenie diod
 digitalWrite(9, LOW);
 digitalWrite(8, LOW);
}

void loop()
{
 digitalWrite(10, LOW); //Czerwona
 digitalWrite(9, LOW); //Pomarańczowa
 digitalWrite(8, HIGH); //Zielona

 delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
 while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 

 digitalWrite(10, LOW); //Czerwona
 digitalWrite(9, HIGH); //Pomarańczowa
 digitalWrite(8, LOW); //Zielona

 delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
 while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 

 digitalWrite(10, HIGH); //Czerwona
 digitalWrite(9, LOW); //Pomarańczowa
 digitalWrite(8, LOW); //Zielona

 delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
 while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 

 digitalWrite(10, HIGH); //Czerwona
 digitalWrite(9, HIGH); //Pomarańczowa
 digitalWrite(8, LOW); //Zielona

 delay(1000); //Zatrzymujemy program przed wejsciem do pętli na 1 sekunde
 while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 
}

I teraz jak to rozumieć?

if (digitalRead(7) == LOW) { //Jeśli przycisk wciśnięty

czy

while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty

W przykładzie drugim programu, który wkleiłem jest pętla while (digitalRead(7) == HIGH) {}, która nie pozwala na kontynuowanie kodu ponieważ przycisk nie jest wciśnięty. Wciśnięcie przycisku pozwala na zmianę świateł.

Gdy zmienię while (digitalRead(7) == LOW) {} to wtedy program nie zatrzymuje się do momentu wciśnięcia przycisku.

Generalnie musiałem się cofnąć z rozdziału 5 do początku bo mi się już wszystko z tego programowania pomieszało 😋

Bardzo fajny kurs!

Link do komentarza
Share on other sites

leidan88, wszystko się zgadza, może po prostu ten komentarz jest dla Ciebie mylący:

while (digitalRead(7) == HIGH) {} //Jeśli przycisk jest wciśnięty 

Lepiej byłoby gdyby brzmiał "Jeśli przycisk wciśnięty to idź dalej". Jeśli podłączamy przycisk do masy, czyli w 99% przypadków to jego wciśnięcie zawsze oznacza stan niski na wejściu Arduino. W przypadku cytowanej pętli while program się zatrzymuje (kręci się w pustej pętli while) tak długo, jak długo na wejściu jest stan wysoki. Czyli po wciśnięciu przycisku (stan niski, LOW) program wyjdzie z pętli i pójdzie dalej.

Linijkę tę można również zapisać tak:

while (digitalRead(7) != LOW) {}

Może taka wersja będzie mniej myląca 🙂?

Link do komentarza
Share on other sites

Dzięki za odpowiedź "Treker" ale jednak ciężko jest mi to jeszcze wszystko objąć "moim" kompilatorem.

Rękawic jeszcze nie składam i uczę się dalej! 🙂

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

Witam wszystkich użytkowników forum.

Mam pytanie - nie bardzo rozumiem dlaczego wciśnięty przycisk generuje sygnał typu LOW,
przecież właśnie zwarcie (wg mnie) powinno powodować przesłanie sygnału HIGH do Arduino i trochę to zaburzyło moje dotychczasowe rozumowanie, tj : jakikolwiek sygnał = HIGH, jego brak = LOW.

Link do komentarza
Share on other sites

Grzesiek,

odnośnie Twojego pytania: Pin D7 na Arduino jest ustawiony jako wejście, czyli pobiera dane z otoczenia. Gdyby nie dochodziłby żaden sygnał, to ten pin D7 zbierałby szumy z otoczenia i odczyt (HIGH czy LOW) byłby przypadkowy. Aby temu zapobiec, w programie ustawiono ten pin jako INPUT_PULLUP, czyli wejście, które jest podciągnięte do góry, czyli do 5V (HIGH). Dlatego, kiedy przycisk nie jest wciśnięty, dochodzi do niego sygnał HIGH. Natomiast po wciśnięciu przycisku pin D7 zostaje zwarty do GND (0V), i dlatego odczytuje sygnał niski. W zrozumieniu zasady działania przycisków podciągniętych do góry pomoże Ci ta ilustracja z tego tematu: link

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

Mam pytanie - nie bardzo rozumiem dlaczego wciśnięty przycisk generuje sygnał typu LOW, przecież właśnie zwarcie (wg mnie) powinno powodować przesłanie sygnału HIGH do Arduino i trochę to zaburzyło moje dotychczasowe rozumowanie, tj : jakikolwiek sygnał = HIGH, jego brak = LOW.

Jeśli wciśnięcie przycisku miałoby wywoływać stan wysoki (HIGH), to musiałby zwierać wejście Arduino z VCC, a nie z masą. W tej chwili przycisk zwiera wejście z masą, czyli właśnie po wciśnięciu na wejściu mamy wtedy "brak napięcia" (LOW).

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

Witam Wszystkich 🙂

Jestem już po pierwszym kursie podstaw elektroniki (dzięki).

Teraz na podstawach Arduino coś się zablokowałem... Poproszę o pomoc 🙂

Wydaje mi się, że wszystko wpisałem poprawnie, ale pokazuje mi błąd.

Link do komentarza
Share on other sites

Hej, witam,
właśnie rozpocząłem przygodę z Waszym kursem 😉

Od razu nasunęło mi się pytanie:

czy przy każdej ingerencji w podłączony układ, albo program zmieniając tym samym używane wejścia trzeba odłączyć Arduino od zasilania?

Dzięki za kurs 🙂

Link do komentarza
Share on other sites

SzponWP, witam na forum 🙂 Zmiana programu nie wymaga wyłączania/włączania Arduino. Jeśli chodzi o zmiany sprzętowe to dobrą praktyką byłoby odłączać układ na czas zmian (i nie dotyczy to tylko tego kursu). Jeśli jednak czujesz się w miarę pewnie i wiesz, że przypadkiem nie zrobisz zwarcia to możesz próbować podpinać peryferia do włączonego Arduino (ale nie polecam tego) 🙂

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

Szybkie pytanie o zaznaczone piny.

Czy GND z lewej i prawej strony czymś się różnią?

Czy Vin od 3,3V i 5V oznacza że można tam podać do 12V? (Zasilanie z akumuatora samochodowego, wiem, może nie bezpośrednio ale przez stabilizator?)

Zasilanie.JPG

Link do komentarza
Share on other sites

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ę »
×
×
  • 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.