Skocz do zawartości

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


Komentator

Pomocna odpowiedź

Cześć,

Mam pytanie o pętle while w poniższym szkicu. 

Zastanawia mnie dlaczego gdy przestaje wciskać przycisk to dioda się dalej świeci?

Rozumiem że dopóki przycisk jest wciśnięty i jesteśmy w pętli while to dioda miga, tylko dlaczego nie gaśnie gdy wychodzę z pętli while? 

(Na mój rozum program powinien się kręcić w kółko w pętli loop a dioda powinna być wygaszona, bo nie ma żadnego warunku gdy digitalRead(7) jest w stanie wysokim. ale mój rozum to nie język C więc proszę o wyjaśnienie 😉 )

void setup() {
pinMode(8,OUTPUT); //Dioda niebieska
pinMode(7,INPUT_PULLUP); //Przycisk
digitalWrite(8,LOW); //Wyłączenie diody
}

void loop() {
  while(digitalRead(7)==LOW){ //Jeśli przycik wciśniety
    digitalWrite(8,LOW); //niebieska wyłącz
    delay(1000);
    digitalWrite(8,HIGH); //niebieska włącz
    delay(1000);
  }
 }

kurs jest ekstra, mega wciąga 🙂

 

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

1 minutę temu, dastawowy napisał:

kurs jest ekstra, mega wciąga 🙂

Dzięki, miło słyszeć 🙂

1 minutę temu, dastawowy napisał:

Rozumiem że dopóki przycisk jest wciśnięty i jesteśmy w pętli while to dioda miga, tylko dlaczego nie gaśnie gdy wychodzę z pętli while? 

A wyobraź sobie, że ta pętla się wykonuje tylko raz. Jaki będzie stan diody po jednokrotnym przejściu tej pętli? Wchodzisz do pętli, wyłączasz diodę, czekasz, włączasz diodę, czekasz, wychichocesz z pętli.

  • Lubię! 1
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

19 minut temu, Treker napisał:

A wyobraź sobie, że ta pętla się wykonuje tylko raz. Jaki będzie stan diody po jednokrotnym przejściu tej pętli? Wchodzisz do pętli, wyłączasz diodę, czekasz, włączasz diodę, czekasz, wychichocesz z pętli.

W takim wypadku dioda będzie się święcić ciągle, ( czekać z włączoną diodą? 🙂 ) ale czy to oznacza że jak się wychodzi z pętli while to program "pamięta" ostatnią komendę pętli?

nie wiem jak to rozumieć? 

 

Link do komentarza
Share on other sites

17 godzin temu, dastawowy napisał:

le czy to oznacza że jak się wychodzi z pętli while to program "pamięta" ostatnią komendę pętli?

@dastawowy nie tyle co "pamięta", tylko jeśli nie zmieniłeś nigdzie stanu diody to dlaczego miałaby zgasnąć? 😉 Ostatnim Twoim poleceniem w pętli jest "włącz diodę". Więc przed wyjściem z pętli jest ona włączana i tyle. Nigdzie poza pętlą jej nie gasisz, więc nie ma żadnych podstaw, aby była ona wyłączana. Jeśli chcesz, abyś się gasiła to musisz odwrócić kolejność poleceń w pętli (najlepiej) lub po prostu gasić diodę po wyjściu z pętli while.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

Podczas uruchamiania programu bazującego po części na światłach drogowych z kursu (moja wersja za naciśnięciem jednego z dwóch przycisków przełącza pojedyncze ledy cyklicznie w jednym lub drugim kierunku) na innym sprzęcie niż Arduino (konkretnie NodeMCU v3) zauważyłem ciekawe problemy, jestem ciekaw czy występują również w przypadku Arduino (niestety nie posiadam jeszcze płytki Arduino, tak że sam nie mam jak przetestować):

- pusta pętla while powoduje zawieszenie się i reset płytki (na wyjściu szeregowym widać ciągłe restarty poprzedzone komunikatem błędu) - rozwiązaniem jest zaimplementowanie obsługi przycisków z użyciem if zamiast while

- rezystory podciągające dla niektórych pinów na płytce są zbyt słabe, przez co input przycisku ma losowe wartości mimo użycia INPUT_PULLUP - pomaga dołączenie własnego rezystora podciągającego

- niektóre piny w trakcie uruchamiania się płytki mają wymuszone startowe wartości (lub wręcz inne działanie), przez co próba uruchomienia płytki w pewnych teoretycznie poprawnych konfiguracjach może się zakończyć niepowodzeniem (np. jeśli płytka podczas startu na danym pinie wymusza stan niski, a logika naszego układu wymusza wysoki, to płytka/program się w ogóle nie uruchomi)

Link do komentarza
Share on other sites

4 godziny temu, Przemat napisał:

pusta pętla while powoduje zawieszenie się i reset płytki (na wyjściu szeregowym widać ciągłe restarty poprzedzone komunikatem błędu)

Poszukaj sobie coś na temat funkcji yield().

Watchdog jest resetowany za każdym wyjściem z loop oraz przy delay i yield. Jeśli przez jakiś czas foop wykonuje się zbyt długo - watchdog stwierdza że coś się pewnie zawiesiło i robi reset. Można oczywiście wyłączyć watchdoga, ale prościej jest zapisać pętlę jako:

while (cośtam) delay(1);

albo

while (cośtam) yield();

 

4 godziny temu, Przemat napisał:

rezystory podciągające dla niektórych pinów na płytce są zbyt słabe,

Jak mniemam chodzi o GPIO16 (czyli D0)?

4 godziny temu, Przemat napisał:

niektóre piny w trakcie uruchamiania się płytki mają wymuszone startowe wartości (lub wręcz inne działanie)

I dlatego zanim zacznie się pisać program na daną płytkę warto poczytać, jak ona działa. Na forum wszystko było wyjaśniane po pięć razy.

 

Link do komentarza
Share on other sites

1 godzinę temu, ethanak napisał:

Poszukaj sobie coś na temat funkcji yield().

Ooo, tego nie znałem, dzięki, przyda się 🙂

1 godzinę temu, ethanak napisał:

Jak mniemam chodzi o GPIO16 (czyli D0)?

1 godzinę temu, ethanak napisał:

I dlatego zanim zacznie się pisać program na daną płytkę warto poczytać, jak ona działa. Na forum wszystko było wyjaśniane po pięć razy.

 

I tak zrobiłem 😉 O D0 wiedziałem już wcześniej (korzystam z tej ściągawki), problemy z INPUT_PULLUP sprawił mi port D8 (GPIO15) - pomocny okazał się wpis na Arduino Stackexchange.

 

Link do komentarza
Share on other sites

nie wiem czy coś mi nie działa czy co, ale nie widzę różnicy pomiędzy działaniem programu  z nawiasami klamrowymi które miały powodować czekanie programu czy bez nich - dla pewności, że mam dobrze napisany program skopiowałem go z kursu

Aktualizacja:

Pytanko:

jak to się dzieje, że na tym obrazku jest przycisk i jeśli go wciśniemy to mamy stan niski, a jeśli nie wciśniemy to wysoki - nie rozumiem skąd się bierze różnica potencjałów = 5V gdy przycisk nie jest wciśnięty (gdy napięcie mierzymy między jednym a drugim wyprowadzeniem przycisku).

obraz.png

Link do komentarza
Share on other sites

@YURYS witam na forum 🙂 Jeśli chodzi o pierwsze pytanie to umieść proszę dokładny kod oraz pokaż swój układ (wystarczy zdjęcie) - łatwiej będzie pomóc. Jeśli chodzi o drugą kwestię to wynika to z faktu konfiguracji danego wejścia jak INPUT_PULLUP, oznacza to, że włączony został wewnętrzny rezystor podciągający - w takiej sytuacji brak zwarcia wejścia do masy będzie intepretowany właśnie jako 5 V. Pomocny w zrozumieniu tego tematu może być ten krótki wpis, który wyjaśnia czym jest rezystor pull-up.

  • Pomogłeś! 1
Link do komentarza
Share on other sites

3 godziny temu, Treker napisał:

 

3 godziny temu, Treker napisał:

 Jeśli chodzi o drugą kwestię to wynika to z faktu konfiguracji danego wejścia jak INPUT_PULLUP, oznacza to, że włączony został wewnętrzny rezystor podciągający - w takiej sytuacji brak zwarcia wejścia do masy będzie intepretowany właśnie jako 5 V. Pomocny w zrozumieniu tego tematu może być ten krótki wpis, który wyjaśnia czym jest rezystor pull-up.

Witam. Reasumując część układu którą zaznaczyłem na czerwonoobraz.thumb.png.cf266616a584dd20f51cc8c2499c2380.png znajduje się w Arduino i automatycznie zaczyna działać gdy program dojdzie do rozkazu zawierającego "INPUT_PULLUP" ?

 

(Na pierwszy problem znalazłem odpowiedź)

Link do komentarza
Share on other sites

Chyba nie do konca rozumiem różnice między pętlą if a while, mógłbyś jakos inaczej "łopatologicznie" objaśnić?

Mianowicie chcialem przerobić program, by działał jak sygnalizacja świetlna z dodatkiem przycisku w ten sposób, aby przycisk działał na zasadzie, naciśnięcia go przez "przechodnia" by pojawiło mu się zielone światło na pasach. W programie mam, że światło zielone przez 10s, potem pomarańcz i zmiana na czerwone (i tak w kółko gdy przycisk nie został naciśnięty.) Nie wiem jak uzyc pętli, aby po naciśnięciu przycisku, po 5 sekundach światło zmieniło się na pomarańczowe i dalej na czerwone i na czerwonym było określony czas i po tym, aby program dalej sam działał poza pętla while.

Edytowano przez matiowoz98
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.