• Witaj na Forum Arduino Polska! Zapraszamy do rejestracji!
  • Znajdziesz tutaj wiele informacji na temat hardware / software.
Witaj! Logowanie Rejestracja


Ocena wątku:
  • 0 głosów - średnia: 0
  • 1
  • 2
  • 3
  • 4
  • 5
Przełączanie diod za pomocą przycisku
#1
Cześć, jestem nowym użytkownikiem arduino uno i potrzebuję pomocy z programem.
Moim celem jest napisanie programu, który umożliwi przełączanie diod po każdorazowym wciśnięciu przycisku. 
1. Po pierwszym wciśnięciu powinien zapalić diodę na pinie 5.
2. Po drugim powinien wykonać funkcję, która będzie gasiła i zapalała diody (KnightRider).
3. Po trzecim powinien zapalić wszystkie diody prócz tej na pinie 5.
4. Po czwartym powinien znowu zapalić diodę na pinie 5 i zgasić pozostałe diody.
itd...

Do punktu nr.2 (włącznie) wszystko działa jak założyłem. Niestety po wciśnięciu przycisku program nie reaguje i nie wychodzi z pętli Knightridera.

Proszę o pomoc, nakierowanie gdzie doczytać ewentualnie o pomoc w kodzie. 
Kod programu:

int stan=0;
int val;
int val2;
int buttonState;


void setup() {

    for(int i=3;i<=7;i++)
    pinMode(i,OUTPUT);
    pinMode(2,INPUT_PULLUP);
    buttonState = digitalRead(2);
}

void loop() {
 
  val=digitalRead(2);
  delay(10);
  val2=digitalRead(2);
  if(val == val2){
    if(val != buttonState) {
      if(val == LOW){
        if(stan == 0){
          stan=1;
        } else {
          if(stan == 1) {
            stan=2;
          } else {
            if (stan == 2){     
              stan=0;   
            }
          }
            }
          }
        }
    buttonState = val;
  }

///////////

      if(stan==0){
        digitalWrite(3,HIGH);
        digitalWrite(4,HIGH);
        digitalWrite(5,LOW);
        digitalWrite(6,HIGH);
        digitalWrite(7,HIGH);
      }
      if(stan==1){
        digitalWrite(3,LOW);
        digitalWrite(4,LOW);
        digitalWrite(5,HIGH);
        digitalWrite(6,LOW);
        digitalWrite(7,LOW);
      }
      if(stan==2){
        for (int i=3;i<=7;i++)
          {
            digitalWrite(i,HIGH);
            digitalWrite(i-1,LOW);
            delay(200);   
          } 
        for (int i=7;i<=7 && i>=5;i--)
          {
            digitalWrite(i,LOW);
            digitalWrite(i-1,HIGH);
            delay(200);
            if(i==5){
            digitalWrite(4,LOW);
            }
        }
    }
}
 
Odpowiedź
#2
for (int i=7;i<=7 && i>=5;i--) co to za babol???
no i tu też for (int i=3;i<=7;i++)

Skoro początek nadania i=3 a koniec pętli i<=7 to przecież już się wykonało wiec pętla się nie wykona. Nie uważasz ze 3 spełnia warunek mniejsze lub równe od 7??

to raczej powinno być
int i=3;i>=7;i++

wtedy 3 będzie dobijać do 7 aż zostanie spełnione że i jest większe lub równe od7
Arduino zostało wymyślone po to, by robić dobrze jedną prostą rzecz – migać diodą. 
 
Odpowiedź
#3
(18-01-2022, 21:31)Jarewa0606 napisał(a): for (int i=7;i<=7 && i>=5;i--)  co to za babol???
no i tu też for (int i=3;i<=7;i++)

Skoro początek nadania i=3 a koniec pętli i<=7 to przecież już się wykonało wiec pętla się nie wykona.  Nie uważasz ze 3 spełnia warunek  mniejsze lub równe od 7??

to raczej powinno być
int i=3;i>=7;i++   

wtedy 3 będzie dobijać do 7 aż zostanie spełnione że i jest większe lub równe od7

Pętla ma działać do momentu wciśnięcia przycisku. Po wciśnięciu ma przejść w stan 0 i to było moje pytanie.
Kod do stanu drugiego działa tak jak chcę. Zaświeca i gasi diody od 3 do 7 i spowrotem. Niestety później nie reaguje na przycisk.
JAK TO ZROBIĆ???
Jeżeli nie rozumiesz pytania to nie udzielaj odpowiedzi. Swoją drogą dziwne jak na kogoś z tyloma dodanymi postami.
 
Odpowiedź
#4
Jak wstawiasz w taki kod delay to nigdy nie będzie działać zgodnie z oczekiwaniami, przez czas działania pętli for program nie będzie ani reagował ani zliczał wciśnięć przycisku. Będzie trwał w takim stanie przez (i x delay), a wychodził na kilka us gdzie wciśnięcie przycisku może być zauważone i zmieniona zmienna stan.
Cała konstrukcja programu jest pokraczna, nie ma w nim czego naprawiać, porób tutoriale, przeanalizuj gotowe programy, opanuj millis(), opanuj trochę więcej "słówek" tego języka by zacząć spisywać własne pomysły.
Miło być decenianym https://buycoffee.to/kaczakat
 
Odpowiedź
#5
(18-01-2022, 21:31)Jarewa0606 napisał(a): for (int i=7;i<=7 && i>=5;i--)  co to za babol???
no i tu też for (int i=3;i<=7;i++)

Skoro początek nadania i=3 a koniec pętli i<=7 to przecież już się wykonało wiec pętla się nie wykona.  Nie uważasz ze 3 spełnia warunek  mniejsze lub równe od 7??

to raczej powinno być
int i=3;i>=7;i++   

wtedy 3 będzie dobijać do 7 aż zostanie spełnione że i jest większe lub równe od7


Nie wiem o co ta spina, bo z punktu widzenia poprawności nie ma w tym zapisie nic złego:

- pierwszy for wykona się dla i = 7, 6, 5

- drugi dla i = 3, 4, 5, 6, 7

Program blokuje się ze względu na nieodpowiednie gospodarowanie czasem tak jak pisze kolega kaczakat.

Na początek millis() i biblioteka button.

Zauważ, że na przykład cały ciąg ifów mający na celu zmianę wartości stan można zastąpić jedną linijką:
stan = (stan + 1) % 3
 
Odpowiedź
  


Skocz do:


Przeglądający: 1 gości