Skocz do zawarto艣ci

Arduino sterowanie przyciskiem


kempa662

Pomocna odpowied藕

Witam,

Od dw贸ch dni "bawi臋 si臋 w Arduino" 馃檪聽staram si臋 robi膰 przyk艂ady zawarte w Kursie Arduino z Forbota i mi臋dzy innymi znalaz艂em sygnalizacj臋 艣wietln膮, kt贸r膮 postanowi艂em zrobi膰. Wszystko wysz艂o ok i postanowi艂em utrudni膰 sobie zadanie i doda膰 mo偶liwo艣膰 sterowania dwoma przyciskami, kt贸re b臋d膮 zmienia艂y dzia艂anie programu z 艣wiate艂 drogowych na 艣wiat艂a wy艂膮czone (czyli mruga tylko 偶贸艂ta dioda, tak jak w miastach po wy艂膮czeniu 艣wiate艂) i z tym mam problem...

Kombinowa艂em na r贸偶ne sposoby i mi nie wychodzi 馃榾

Dwa przypadki:

1) mog臋 sterowa膰 przyciskami, lecz p臋tla if wykonuje kod tylko raz i si臋 nie zap臋tla (jest to dla mnie wiadome)

void setup() {
  pinMode(10, OUTPUT); //Dioda czerwona
  pinMode(9, OUTPUT); //Dioda 偶贸艂ta
  pinMode(8, OUTPUT); //Dioda zielona
  pinMode(7, INPUT_PULLUP); //przycisk w艂膮czenie
  pinMode(6, INPUT_PULLUP); //przycisk wy艂膮czenie
 
  digitalWrite(10, LOW); //Wy艂膮czenie diod
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  int a=0;
  int b=0;
}
 
void loop()
{
  int przycisk1 = digitalRead(7);
  int przycisk2 = digitalRead(6);
  int a = 0;
  int b = 0;

  if (przycisk1 == LOW){
    a = 1;
    b = 0;
  }
  if (przycisk2 == LOW) {
    a = 0;
    b = 1;
  }

     if(a == 1){                // normalne dzia艂anie 艣wiate艂
  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomara艅czowa
  digitalWrite(8, HIGH); //Zielona

 delay(2000);

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

 delay(1000);

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

 delay(2000);
 
 
  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, HIGH); //Pomara艅czowa
  digitalWrite(8, LOW); //Zielona

 delay(1000);
 }

 if (b == 1) {              // 艣wiat艂a wy艂膮czone
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  delay (1000);

  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  delay (1000);  
 }
}

2) kod wykonuje si臋 w p臋tli, lecz nie mog臋 zmieni膰 dzia艂ania przyciskami, musz臋 resetowa膰 arduino i nacisn膮膰聽drugi przycisk

void setup() {
  pinMode(10, OUTPUT); //Dioda czerwona
  pinMode(9, OUTPUT); //Dioda 偶贸艂ta
  pinMode(8, OUTPUT); //Dioda zielona
  pinMode(7, INPUT_PULLUP); //przycisk w艂膮czenie
  pinMode(6, INPUT_PULLUP); //przycisk wy艂膮czenie
 
  digitalWrite(10, LOW); //Wy艂膮czenie diod
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  int a=0;
  int b=0;
}
 
void loop()
{
  int przycisk1 = digitalRead(7);
  int przycisk2 = digitalRead(6);
  int a = 0;
  int b = 0;

  if (przycisk1 == LOW){
    a = 1;
    b = 0;
  }
  if (przycisk2 == LOW) {
    a = 0;
    b = 1;
  }

     while(a == 1){                // normalne dzia艂anie 艣wiate艂
  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomara艅czowa
  digitalWrite(8, HIGH); //Zielona

 delay(2000);

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

 delay(1000);

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

 delay(2000);
 
 
  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, HIGH); //Pomara艅czowa
  digitalWrite(8, LOW); //Zielona

 delay(1000);
 }

 while (b == 1) {              // 艣wiat艂a wy艂膮czone
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  delay (1000);

  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  delay (1000);  
 }
}

Kombinowa艂em z 艂膮czeniem p臋tli w r贸偶ny spos贸b, oraz z do-while ale nic to nie daje...

Mo偶e kto艣 ma jak膮艣 rad臋?

Edytowano przez kempa662
Link do komentarza
Share on other sites

Wywal (dlatego pierwszy program nie zap臋tla si臋).

  int a = 0;
  int b = 0;锘

z funkcji loop, zamiast WHILE u偶yj IF.

lub

dodaj odczyt stanu przycisk贸w w p臋tlach while

lub聽

pobaw si臋 przerwaniami

Tak rzucam pomys艂ami, bo nie chc臋 narzuca膰 jednego rozwi膮zania. Te delaye sprawi膮, 偶e program b臋dzie mia艂 pewn膮 bezw艂adno艣膰, ale powinno dzia艂a膰.

Pami臋taj, 偶e funkcja setup() wykonuje si臋 raz, a loop() dzia艂a na okr膮g艂o.

A co si臋 stanie, gdy b臋d膮 wci艣ni臋te oba przyciski?

Edytowano przez Zero
Link do komentarza
Share on other sites

29 minut temu, kempa662 napisa艂:

1) mog臋 sterowa膰 przyciskami, lecz p臋tla if wykonuje kod tylko raz

Bo gdy loopy() wr贸ci do pocz膮tku zmienne a i b s膮 inicjowane i zerowane od nowa. Tak na marginesie taki fragment znajduj臋 i w setup() i w loop(). Po co?

int a=0;
int b=0;

Takie zmienne mo偶esz zadeklarowa膰 poza setup() i poza loop(). B臋d膮 one mia艂y zasi臋g globalny i b臋d膮 "widoczne" w ka偶dym miejscu i w ka偶dej funkcji programu.

32 minuty temu, kempa662 napisa艂:

2) kod wykonuje si臋 w p臋tli, lecz nie mog臋 zmieni膰 dzia艂ania przyciskami, musz臋 resetowa膰 arduino i nacisn膮膰聽drugi przycisk

Bo Tw贸j program wchodzi w p臋tl臋 while(a == 1).... i nie mo偶e z niej wyj艣膰 gdy偶 w p臋tli a si臋 nie zmienia i zawsze b臋dzie r贸wne 1. Tw贸j program "zawiesi艂" si臋 wewn膮trz tej p臋tli i dlatego tylko reset przywraca UNO do 偶ycia.

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

(edytowany)

Wyrzuci艂em inty przed setup() oraz聽loop() i z if-ami dzia艂a powiedzmy dobrze, tylko聽jak nacisn臋 przycisk1 program zaczyna dzia艂a膰 jak normalne 艣wiat艂a, ale 偶eby prze艂膮czy艂 si臋 na drugi tryb musz臋 trzyma膰 przycisk2 do momentu jak pierwsza p臋tla if si臋 zako艅czy (albo dobrze celowa膰 pod koniec馃槈聽). Czy jest mo偶liwe, 偶eby od razu po naci艣ni臋ciu przycisku, niezale偶nie od momentu, w kt贸rym znajduje si臋 program nast臋powa艂a zmiana z jednego wariantu na drugi? Chyba, 偶e zbyt du偶o wymagam od tak prostego programu 馃檪

Tak to teraz wygl膮da:

int a = 0;
int b = 0;
void setup() {
  pinMode(10, OUTPUT); //Dioda czerwona
  pinMode(9, OUTPUT); //Dioda 偶贸艂ta
  pinMode(8, OUTPUT); //Dioda zielona
  pinMode(7, INPUT_PULLUP); //przycisk w艂膮czenie
  pinMode(6, INPUT_PULLUP); //przycisk wy艂膮czenie
 
  digitalWrite(10, LOW); //Wy艂膮czenie diod
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  }
 
void loop()
{
  int przycisk1 = digitalRead(7);
  int przycisk2 = digitalRead(6);
  

  if (przycisk1 == LOW){
    a = 1;
    b = 0;
  }
  if (przycisk2 == LOW) {
    a = 0;
    b = 1;
  }

     if(a == 1){                // normalne dzia艂anie 艣wiate艂
  digitalWrite(10, LOW); //Czerwona
  digitalWrite(9, LOW); //Pomara艅czowa
  digitalWrite(8, HIGH); //Zielona

 delay(2000);

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

 delay(1000);

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

 delay(2000);
 
 
  digitalWrite(10, HIGH); //Czerwona
  digitalWrite(9, HIGH); //Pomara艅czowa
  digitalWrite(8, LOW); //Zielona

 delay(1000);
 }

 if (b == 1) {              // 艣wiat艂a wy艂膮czone
  digitalWrite(10, LOW);
  digitalWrite(9, HIGH);
  digitalWrite(8, LOW);
  delay (1000);

  digitalWrite(10, LOW);
  digitalWrite(9, LOW);
  digitalWrite(8, LOW);
  delay (1000);  
 }
}

Edytowano przez kempa662
Link do komentarza
Share on other sites

Szybko 艂apiesz. Teraz pewnie kto艣 wyskoczy, 偶e delaye() to samo z艂o (to akurat prawda 馃檪). Generalnie po dodaniu jeszcze kliku zmiennych typu bool (a mo偶e聽int jedna lub dwie) i u偶ycia do sterowania millis() lub przerwa艅 mo偶na by si臋 pokusi膰 o to, by program nie mia艂 tej bezw艂adno艣ci.聽

Na twoim miejscu zapisa艂bym sobie ten projekt do zrobienia p贸藕niej i lecia艂bym dalej przez kurs (millis() jest w II cz臋艣ci kursu zad.9 - je艣li jednak postanowisz troch臋 pokr膮偶y膰 dooko艂a tego tematu).

Edytowano przez Zero
Link do komentarza
Share on other sites

37 minut temu, kempa662 napisa艂:

musz臋 trzyma膰 przycisk2 do momentu jak pierwsza p臋tla if si臋 zako艅czy

No to sam widzisz, 偶e stosowanie delay() nie jest najlepszym pomys艂em jak wcze艣niej zauwa偶y艂 Zero. Pr贸bujesz w ten spos贸b sterowa膰 czasem. Wspomniane przerwania to chyba na razie porywanie si臋 z motyk膮 na s艂o艅ce, ale mo偶e takie narz臋dzie jak tu - zobacz bibliotek臋 Timers by艂oby prostsze? Korzysta艂em z tej biblioteki i dzia艂a nawet zgrabnie. By j膮 m贸c wykorzysta膰 ja bym stworzy艂 sobie zmienn膮 np. int program kt贸rej przypisywa艂bym warto艣ci odpowiadaj膮ce sekwencji di贸d LED. Po odmierzeniu zadanego czasu przez Timers odczytywa艂bym (modyfikowa艂) zawarto艣膰 tej zmiennej i zapala艂 odpowiedni膮 sekwencj臋 LED.

Mam nadziej臋, 偶e rozumiesz o co mi chodzi. Chocia偶 Ty lepiej wiesz jak program ma dzia艂a膰 i mo偶e znajdziesz inne zastosowanie Timers.h. Dzi臋ki tej bibliotece Tw贸j loop() mo偶e bez przestoj贸w odczytywa膰 klawisze, a ustawiony stan LED do czasu zmiany jest przecie偶 stabilny i nie wymaga ci膮g艂ego "podtrzymania".

To taki jeden z pomys艂贸w na gor膮co.

Edytowano przez Belferek
Link do komentarza
Share on other sites

Chyba zrobi臋 najpierw ca艂y kurs, 偶eby wiedzie膰 troch臋 wi臋cej o Arduino i dopiero b臋d臋 kombinowa艂 jak poprawi膰 to co mam teraz.聽

O delay-ach ju偶 poczyta艂em i wiedz臋, 偶e w wi臋kszo艣ci przypadk贸w mo偶na to lepiej rozwi膮za膰 馃檪

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

@kempa662, witam na forum 馃槈 Widz臋, 偶e to Twoje pierwsze kroki na Forbocie, oto najwa偶niejsze informacje na start:

  • Chcesz przywita膰 si臋 z innymi cz艂onkami naszej spo艂eczno艣ci? Skorzystaj z tematu powitania u偶ytkownik贸w.
  • Opis najciekawszych funkcji, kt贸re u艂atwiaj膮 korzystanie z forum znajdziesz w temacie instrukcja korzystania z forum - co warto wiedzie膰?
  • Poszczeg贸lne posty mo偶esz ocenia膰 (pozytywnie i negatywnie) za pomoc膮 reakcji - ikona serca w prawym dolnym rogu ka偶dej wiadomo艣ci.
Dnia 10.12.2018 o 21:43, kempa662 napisa艂:

Chyba zrobi臋 najpierw ca艂y kurs, 偶eby wiedzie膰 troch臋 wi臋cej o Arduino i dopiero b臋d臋 kombinowa艂 jak poprawi膰 to co mam teraz.聽

Je艣li 偶adne terminy Cie nie goni膮 to faktycznie najlepiej przejd藕 spokojnie przez ca艂y kurs, a najlepiej przez dwa. Zobaczysz jak wiele spraw si臋 upro艣ci. O wymianie delay() na lepsze rozwi膮zanie z millis()聽te偶 znajdziesz co艣 w dalszej cz臋艣ci kursu 馃槈

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.