Treker (Damian Szymański) Kwiecień 3, 2018 Udostępnij Kwiecień 3, 2018 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). 1 Link do komentarza Share on other sites More sharing options...
leidan88 Maj 16, 2018 Udostępnij Maj 16, 2018 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 More sharing options...
Treker (Damian Szymański) Maj 16, 2018 Udostępnij Maj 16, 2018 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 More sharing options...
leidan88 Maj 20, 2018 Udostępnij Maj 20, 2018 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 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
kirysiomik2 Maj 29, 2018 Udostępnij Maj 29, 2018 ma 10 lat i zaczynam programować ... wow jedyny kurs z którego da się czegos dowiedzieć Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Maj 29, 2018 Udostępnij Maj 29, 2018 kirysiomik2, miło słyszeć - powodzenia w nauce programowania 🙂 Link do komentarza Share on other sites More sharing options...
Grzesiek Lipiec 15, 2018 Udostępnij Lipiec 15, 2018 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 More sharing options...
karol2003 Lipiec 15, 2018 Udostępnij Lipiec 15, 2018 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 1 Link do komentarza Share on other sites More sharing options...
Treker (Damian Szymański) Lipiec 15, 2018 Udostępnij Lipiec 15, 2018 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). 1 Link do komentarza Share on other sites More sharing options...
boo Lipiec 23, 2018 Udostępnij Lipiec 23, 2018 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 More sharing options...
Treker (Damian Szymański) Lipiec 23, 2018 Udostępnij Lipiec 23, 2018 boo, witam na forum! "Zjadłeś" jeden nawias po "LOW" - zapewne to spowodowało ten błąd 😉 1 Link do komentarza Share on other sites More sharing options...
boo Lipiec 23, 2018 Udostępnij Lipiec 23, 2018 Wow, dziękuję za ekspresową odpowiedź 🙂 Szukałem tego brakującego nawiasu... nie widziałem... Jeszcze raz dzięki Link do komentarza Share on other sites More sharing options...
SzponWP Lipiec 31, 2018 Udostępnij Lipiec 31, 2018 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 More sharing options...
Treker (Damian Szymański) Lipiec 31, 2018 Udostępnij Lipiec 31, 2018 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) 🙂 1 Link do komentarza Share on other sites More sharing options...
kris2k Październik 25, 2018 Udostępnij Październik 25, 2018 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?) 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ę »