09-12-2018, 08:03
Witam, na wstępie zaznaczę (jak prawie każdy w tym dziale), że dopiero zaczynam swoją przygodę z arduino, i będę wdzięczny za wyrozumiałość. Teraz przejdę do rzeczy, borykam się z pewnym problemem, który uniemożliwia poprawną pracę sterownika (samoróbka, arduino wraz z odbiornikiem Rop02 będą odpowiedzialne za sterowanie). Ogólny zamysł jest taki:
Po wciśnięciu przycisku stan na wyjściu nr. 4 powinen się zmienić z niskiego na wysoki i w nim pozostać.
Przy następnym wciśnięciu pin4=LOW pin5=HIGH, następnie pin5=LOW pin6=HIGH i podczas ostatniego naciśnięcia wszystkie wyjścia cyfrowe powinny zmienić stan na niski. Niestety zamiast tego program wykonuje całą sekwencję po kolei bez zatrzymania się w pętli. W tym celu umieściłem opóznienie w pętli, które miało nie pozwolić na wykonanie wszystkich instrukcji zawartych w while, przy pojedynczym naciśnięciu przycisku. Niestety nic to nie dało, dlatego zwracam się z jednym pytaniem:
Z jakiego powodu pętla wykonuje się kilkukrotnie przy pojedynczym kliknięciu? Przecież stan niski na wejściu występuje przez milisekundy (tak długo jak trzymam przycisk) a delay powinen temu skutecznie zaradzić. Wiem, wiem delay jest fe, ale aktualnie nie znam zgrabniejszego rozwiązania. Zdaje sobie sprawę, że kod który zamieszczam nie ma prawa zadziałać tak jak to opisałem, ale chodzi mi tylko o tego while, to on jest dla mnie głównym problemem. Oczywiście nie proszę o gotowca, jedynie wskazówkę. Poniżej zamieszczam kod i z góry dziękuje za wszystkie odpowiedzi, pozdrawiam.
Po wciśnięciu przycisku stan na wyjściu nr. 4 powinen się zmienić z niskiego na wysoki i w nim pozostać.
Przy następnym wciśnięciu pin4=LOW pin5=HIGH, następnie pin5=LOW pin6=HIGH i podczas ostatniego naciśnięcia wszystkie wyjścia cyfrowe powinny zmienić stan na niski. Niestety zamiast tego program wykonuje całą sekwencję po kolei bez zatrzymania się w pętli. W tym celu umieściłem opóznienie w pętli, które miało nie pozwolić na wykonanie wszystkich instrukcji zawartych w while, przy pojedynczym naciśnięciu przycisku. Niestety nic to nie dało, dlatego zwracam się z jednym pytaniem:
Z jakiego powodu pętla wykonuje się kilkukrotnie przy pojedynczym kliknięciu? Przecież stan niski na wejściu występuje przez milisekundy (tak długo jak trzymam przycisk) a delay powinen temu skutecznie zaradzić. Wiem, wiem delay jest fe, ale aktualnie nie znam zgrabniejszego rozwiązania. Zdaje sobie sprawę, że kod który zamieszczam nie ma prawa zadziałać tak jak to opisałem, ale chodzi mi tylko o tego while, to on jest dla mnie głównym problemem. Oczywiście nie proszę o gotowca, jedynie wskazówkę. Poniżej zamieszczam kod i z góry dziękuje za wszystkie odpowiedzi, pozdrawiam.
Kod:
#define BUTTON 2 //PRZYCISK 2
#define RED 4 //DIODY CZERWONE 4
#define GREEN 5 //DIODY ZIELONE 5
#define BLUE 6 //DIODY NIEBIESKIE 6
int PIN=3;
int PINw=2;
int buttonState=0;
void setup () {
Serial.begin(9600);
pinMode(2,INPUT_PULLUP);
pinMode(4,OUTPUT);
pinMode(5,OUTPUT);
pinMode(6,OUTPUT);
digitalWrite(RED,LOW); //OFF
digitalWrite(GREEN,LOW);
digitalWrite(BLUE,LOW);
}
void loop() {
buttonState=digitalRead(BUTTON); //zmienna przyjmuje wartosc pinu 2
while(buttonState==LOW) { //wykonuj jezeli przycisk jest wcisniety
PIN++; //inkrementuj zmienna PIN
PINw++; //inkrementuj zmienna PIN2
Serial.println(PIN);
digitalWrite(PIN,HIGH); //Podaj stan wysoki na Pin:
digitalWrite(PINw,LOW); //Podaj stan niski na Pin:
delay(500);
if(PIN==6)
break;
}
if(PIN==6) { //jezeli PIN>=6 wroc do wartosci poczatkowej
PIN=PIN-3;
PINw=PINw-3;
}
digitalWrite(RED,LOW); //OFF
digitalWrite(GREEN,LOW);
digitalWrite(BLUE,LOW);
}