Skocz do zawartości

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


Komentator

Pomocna odpowiedź

@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

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

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

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  // put your main code here, to run repeatedly:

digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
delay(5000);
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);


if (digitalRead(7) == LOW) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
delay(1000);
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
delay(1000);
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
  delay(3000);
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
  delay(1000);
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
else {digitalWrite(5, HIGH);
}

}

Cześć

Próbuję zrobić światła drogowe działające tak:

-cały czas sekwencja ziel4, żółte3, czer2, czer2 i zół3, ziel4.... a na przejsciu cały czas czerw5

-chyba, że wcisnę przycisk7 to żół3, czerw2 > na przejściu ziel6, czerw5 i wracam do początku

Mają powyższy program w miarę to działa ale są dwa problemy:
-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
- i mniejszy problem - idzie czerw2, zół3, czerw2 i dopiero wtedy if - macie na to jakiś pomysł?

Edytowano przez RysiekUP
Link do komentarza
Share on other sites

7 minut temu, RysiekUP napisał:

-muszę długo przytrzymać przycisk7 żeby uruchomić if - Dlaczego tak się dzieje?
 

Delay() to taka funkcja ktora "zamraza" kod na czas jaki zostal ustalony...nie zrobisz z tym nic, jedyny ratunek to funkcja millis() ktora nie blokuje i program reaguje bardzo szybko na jakies zdarzenia...poprostu kod wykonuje sie w kolko bardzo szybko..

Link do komentarza
Share on other sites

Ok znalazłem artykuł o millis: https://forbot.pl/blog/kurs-arduino-ii-wielozadaniowosc-opoznienia-z-millis-id18418
Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛

Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze... może za stary na to jestem hehe
Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele....

 

Link do komentarza
Share on other sites

12 minut temu, RysiekUP napisał:

Dopiero zaczynam więc na razie odpuszczę ten temat bo to nie takie proste 😛

 

przyjdzie z czasem...😉

 

13 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..😉

 

14 minut temu, RysiekUP napisał:

 Ale ciekawi mnie jak sobie z tym poradzą uczniowie podstawówek i ich nauczyciele....

 

nie od razu rzym zbudowano..😉

void setup() {
  // put your setup code here, to run once:
pinMode(2, OUTPUT);
pinMode(3, OUTPUT);
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
pinMode(6, OUTPUT);
pinMode(7, INPUT_PULLUP);

digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, LOW);

digitalWrite(6, LOW);

}

void loop() {
  static int tab[] = {1000,5000,1000,1000};
  static int tab1[] = {1000,1000,3000,1000,1000};
  static int i = 0;
  static byte stan = 0;
  static long last = 0;
  
  if (millis() - last > tab[i]) {
    i++;
    last = millis();
    if (i == 4) {
      i = 0;
    }
  }
  if (stan == 0) {
if (i == 0) {
digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 1) {
digitalWrite(2, LOW);
digitalWrite(3, LOW);
digitalWrite(4, HIGH);
}
if (i == 2) {
digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
if (i == 3) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
  }

if (digitalRead(7) == LOW) {
stan = 1;
i = 0;
delay(1000);
}

if (millis() - last > tab1[i]) {
    i++;
    last = millis();
  }
    if (i == 5) {
      i = 0;
      stan = 0;
    }
  if (stan == 1) {
    if (i == 0) {
 digitalWrite(2, LOW);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
    }
if (i == 1) {
digitalWrite(2, HIGH);
digitalWrite(3, LOW);
digitalWrite(4, LOW);
}
if (i == 2) {
digitalWrite (6, HIGH);
 digitalWrite (5, LOW);
}
if (i == 3) {
  digitalWrite (6, LOW);
  digitalWrite (5, HIGH);
}
if (i == 4) {
  digitalWrite(2, HIGH);
digitalWrite(3, HIGH);
digitalWrite(4, LOW);
}
}


}

sprawdz...moze zadziala

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

10 minut temu, farmaceuta napisał:
28 minut temu, RysiekUP napisał:

 Ogólnie to wydawało mi się, że mikrokontrolery będą łatwiejsze w obsłudze...

 

Panie to i tak chyba najprostsza wersja programowania...w sensie adruino ide..

Nawet mnie nie załamuj 😞 A ja myślałem, że zmienię branżę hehe

Kod, który wysłałeś lepiej działa ale rozgryzienie go pewnie zajęłoby mi całą noc 😝
 

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.