Skocz do zawartości

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


Komentator

Pomocna odpowiedź

@matiowoz98 witam na forum 🙂 

17 godzin temu, matiowoz98 napisał:

Chyba nie do konca rozumiem różnice między pętlą if a while,

Podstawowa różnica, to że if to warunek a while to pętla 😉 

If to takie rozdroże, zrób tak lub tak, a while to pętla z takim rozdrożem - coś jak zjazd z ronda - jedziesz w kółko szukając znaku Warszawa - znajdziesz, to zjeżdżasz na Warszawę.

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

@Gieneq Mimo wielu prób, to chyba nadal nie pojmuję.. próbowałem zastosować pętlę "goto" ale nie wiem jak zadeklarować w niej słowo, do którego ma program przejść i w tym słowie, aby program wiedział co ma robić.. Mianowicie próbuję do sygnalizacji świetlnej dodać, aby po kliknieciu przycisku, program zaczął wykonywać pewien program i po wykonaniu go jednorazowo, wrócił do  miejsca wykonywnania, gdzie przycisk nie został wcisniety.

W skrócie ( Światła działąją w odstępach czasowych, dopóki osoba przed pasami nie nacisnie przycisku, aby włączyć sobie zielone, by przejść. Po wcisnieciu przycisku chcialem, by po 5 sekundach program przeszedł do tego co mam w IF, po wykonaniu przeszedł spowrotem do ELSE.

Przepraszam też za moje trudności, w zrozumieniu tego.

void setup()
{
pinMode(7,INPUT_PULLUP); // przycisk

pinMode(8, OUTPUT); //dioda zielona
pinMode(9, OUTPUT); //dioda żółta
pinMode(10,OUTPUT); //dioda czerwona

digitalWrite(8, LOW); // \
digitalWrite(9, LOW); //  wyłączenie diod
digitalWrite(10,LOW); // /

}

void loop() 
{
    
if (digitalRead(7) == LOW) { //jesli przycisk wcisniety
 delay(5000);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,HIGH); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona
delay(2500);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,LOW); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona
delay(5000);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,HIGH); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona
delay(2500);

}

else (digitalRead(7) == HIGH); { //jesli przycisk NIE wcisniety
delay(2500);
digitalWrite(8,HIGH); //dioda zielona
digitalWrite(9,LOW); //dioda zolta
digitalWrite(10,LOW); //dioda czerwona
delay(5000);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,HIGH); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona
delay(2500);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,LOW); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona
delay(5000);
digitalWrite(8,LOW); //dioda zielona
digitalWrite(9,HIGH); //dioda zolta
digitalWrite(10,HIGH); //dioda czerwona

}
}


 
  

 

Link do komentarza
Share on other sites

23 minuty temu, matiowoz98 napisał:

próbowałem zastosować pętlę "goto"

A tego nie wolno robić - od tego masz wszystkie ify, while, switche i tak dalej abyś nie musiał się w to bawić. W artykule użyłem "goto" aby pokazać jak działa np. while, i tylko po to.

Tak przy okazji:

else (digitalRead(7) == HIGH); { //jesli przycisk NIE wcisniety

Co to ma znaczyć?

Twój program działa tak:

  • jeśli przycisk jest wciśnięty, wykonaj pewną sekwencję; w przeciwnym wypadku nie rób nic, tylko porównaj sobie stan przycisku z wartością HIGH i natychmiast o tym zapomnij.
  • niezależnie od stanu przycisku wykonaj drugą sekwencję.

Jesteś pewien, że o to Ci chodziło?

Rozpisz sobie słownie to co ma robić program (tak jak ja parę linijek wyżej) a potem dopiero przełóż na kod.

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

@ethanak A... to dziękuję, że mi powiedziałeś jak ten program teraz działa, analizując go i pisząc byłem pewien, że będzie działać inaczej...

Ja chcę, aby mój program działał w ten sposób:

  • Program wykonuje w kółko pewną sekwencję ( u mnie zawartą w ELSE)
  • Po naciśnięciu (chciałbym, żeby nie trzeba było go trzymać, tylko kliknąć) wykonuje pewną sekwencje i po jej wykonaniu wraca do mojej sekwencji zawartej w ELSE.

I to tyle... czuję, że to jest tak banalnie proste, a ja nie mogę do tego dojść..

Myślałem, że ten fragment - 

else (digitalRead(7) == HIGH); { //jesli przycisk NIE wcisniety

Będzie powodować wykonywanie sekwencji pod ELSE, kiedy przycisk nie bedzie wciśniety, a IF kiedy go nacisnę.

Link do komentarza
Share on other sites

2 minuty temu, matiowoz98 napisał:

Myślałem, że ten fragment

Przede wszystkim:
 

else // prawidłowo

(digitalRead(7) == HIGH) // czyli porównujesz coś z czymś, ale nie używasz nigdzie wyniku

; // średnik czyli koniec instrukcji

{ cośtam dalej } // czyli blok instrukcji zupełnie niezależny od ifa, elsa czy innego whila przedtem

Teoretycznie powinno to wyglądać mniej więcej tak:

else if (digitalRead(7) == HIGH) { cała druga sekwencja}

Porównaj sobie rozpiskę:

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B.

i

Jeśli (cośtam) wykonaj A, w przeciwnym razie porównaj X i Y. Wykonaj B.

Które jest tym co chciałeś?

I jeszcze drobiazg:
 

if (przycisk_jest_naciśnięty) {cośtam};
else if (przycisk_nie_jest_naciśnięty) {cośinnego};

Czy Twoim zdaniem może zajść taka sytuacja, że w czasie wykonywania else przycisk będzie naciśnięty? Przecież to już sprawdzałeś. digitalRead zwraca LOW albo HIGH, nie ma trzeciej możliwości!

Czyli po prostu:

if (przycisk_jest_naciśnięty) {cośtam};
else {cośinnego};

Chociaż zaraz zaraz... ależ taka sytuacja może zajść! Wyobraź sobie, że:

  • przycisk nie jest naciśnięty
  • program wykonuje sprawdzenie w instrukcji if i stwierdza, że przycisk nie jest naciśnięty
  • w tym momencie ktoś naciska przycisk
  • program sprawdza w drugim ifie czy przycisk nie jest naciśnięty, stwierdza że jest

w efekcie nie wykona się ani jeden ani drugi kod. Dlatego taka nadmiarowość może prowadzić do trudnych w znalezieniu błędów w czasie wykonania programu (szczególnie że taka sytuacja będzie zachodzić bardzo rzadko).

 

 

 

 

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

@ethanak Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE i w tym czasie nacisnę przycisk, to nie przejdzie do IF tak?

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem

Edytowano przez matiowoz98
Link do komentarza
Share on other sites

6 godzin temu, matiowoz98 napisał:

Czyli dobrze rozumiem, że jeżeli program wykonuje pentlę ELSE

Nie, nie rozumiesz. Nie ma żadnej "pentli else" - co to w ogóle ma znaczyć?

I tak, owszem, jeśli program coś robi a Ty w tym czasie naciśniesz przycisk, to nie przejdzie magicznie do wykonywania czegoś innego. Jeśli np. oglądasz serial na Polsacie to jeśli w tym samym czasie TVP poda jakieś wielce ważne informacje - raczej sam się odcinek MacGyvera nie przerwie żeby przełączyć na Teleekspres.

7 godzin temu, matiowoz98 napisał:

Jeśli (cośtam) wykonaj A, w przeciwnym razie wykonaj B. - Tą opcję chciałem

No to teraz zapisz to ładnie w kodzie. Możesz dla uproszczenia na razie założyć, że A to Serial.println("A") a B to Serial.println("B"). (ot tak, żeby za dużo nie pisać).

Link do komentarza
Share on other sites

Dzień dobry, jest ktoś w stanie wyjaśnić dlaczego dioda nie mruga co 1 sekundę mimo iż wszystko (kod oraz podłączenie) zrobiłem zgodnie z instrukcją na kursie? Chodzi o pierwszy przykład.

Edytowano przez Bartroz
Link do komentarza
Share on other sites

Mam problem jak chodzi o petle for.

Teoretycznie powinno świecić 4 razy świeci dużo razy więcej.

Czy to winna że wartość i jest nadpisywana przez 0 w warunku?

A jak tak to jak można eliminować zjawisko?

Pozdrawiam

for (int i =0; i<5; i++){
  digitalWrite(led , HIGH);
delay(500);
digitalWrite(led , LOW);
delay(500);
}

 

 

Link do komentarza
Share on other sites

19 minut temu, Antagonista99 napisał:

Teoretycznie powinno świecić 4 razy świeci dużo razy więcej.

Teoretycznie powinno swiecic 5 razy...zmienna w petli bedzie miala wartosci 0/1/2/3/4...czyli 5 obiegow...najpierw sprawdza warunek, potem petla sie wypelnia, potem nastepuje inkrementacja, potem sprawdza znow warunek itp...

 

19 minut temu, Antagonista99 napisał:

Czy to winna że wartość i jest nadpisywana przez 0 w warunku

Tak...po kazdym obiegu loop() zmienna w for jest tworzona od nowa i inicjowana zerem wiec for sie powtorzy...

 

19 minut temu, Antagonista99 napisał:

A jak tak to jak można eliminować zjawisko

Mozesz stworzyc zmienna globalna i to wystarczy, ale(!) trzeba pamietac zeby ta zmienna wyzerowac przed kazdym wejsciem do for...

int i = 0; //zmienna globalna

for ( i; i<5; i++)

Jednak wtedy nie mozesz tej zmiennej zerowac przed petla for bo bedzie taka sama sytuacja jaka teraz masz...musisz utworzyc jakis warunek ktory w okreslonym momencie bedzie zerowac ta zmienna zeby mozna bylo wykonac for...

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