Go Down

Topic: {gelöst} - [Einsteiger!] Frage zu Taster und "Modus schalten" [delay-Problem] (Read 887 times) previous topic - next topic

sorath

Hallo!

Ich bin ganz neu, und habe vor kurzem einen anderen Thread eröffnet, in dem ich mein Ziel beschrieben habe (Terrarium-Steuerung).

Heute ist mein Starterkit gekommen, und ich bin direkt an ein Problem gestoßen, zu dem ich so noch keine Erläuterung finden konnte.
Liegt vielleicht auch daran, dass ich nicht genau weiß, wonach ich suchen soll  :smiley-mr-green:


Ganz simpel:
Eine LED, ein Taster.

Mit dem Taster möchte ich 3 Umschalt-Modi herstellen.

1x drücken = Modus 1,
2x = Modus 2,
3x = Modus 3

Klappt auch soweit.

Die Modi machen folgendes:
1 = LED an
2 = LED blinkt
3 = LED aus


Habe ich folgendermaßen gelöst:

Code: [Select]
int ledPin = 10;
int buttonPin = 3;
int mode = 3;      // Beim Start LED aus

void setup(){
 pinMode(ledPin, OUTPUT);
 pinMode(buttonPin, INPUT);
 
 for (int i = 0; i < 4; i++){  //kleines Sequenz, dass Programm bereit ist  
   digitalWrite(ledPin,HIGH);
   delay(250);
   digitalWrite(ledPin,LOW);
   delay(250);
 }
   digitalWrite(ledPin,HIGH);
   delay(1000);
   digitalWrite(ledPin,LOW);  //Signal vorbei, nun kanns losgehn...
   
}

void loop(){
 if (digitalRead(buttonPin)==HIGH){  //Wenn Taster gedrückt, Modus um 1 erhöhen
   mode++;
   if (mode==4){mode = 1;}           //Wenn Modus > 3, dann zurück zu Modus 1
   //else {mode = 1;}
 }
 if (mode==1){
   digitalWrite(ledPin,HIGH);        //Modus 1 = an
 }
 else if (mode==2){

   digitalWrite(ledPin,HIGH);        //Modus 2 = blinken
   delay(250);
   digitalWrite(ledPin,LOW);
   delay(250);
}
 else if (mode==3){                  //Modus 3 = aus
   digitalWrite(ledPin,LOW);
 }
 
 delay(200);                        // kurzes Delay, um mehrere Anschläge durch 1x drücken zu verhindern
}  



Mein Problem, auf das ich nun gestoßen bin:

Wenn in Modus 2 (blinken) der Taster gedrückt wird, während Arduino im Delay "hängt", reagiert natürlich Arduino auf den Tastendruck nicht.

Gibt es eine Möglichkeit, dies zu verhindern?
Falls ja, wie?

Besten Dank

Gruß
Chris

uwefed

Schau Dir mal dieses Beispiel an:
http://arduino.cc/en/Tutorial/BlinkWithoutDelay
Grüße Uwe

sorath

Vielen Dank Uwe !


Mir war gerade noch die idee gekommen, das delay auf z.b. 50ms runterzuschrauben und das in ne for-schleife zu packen, mit ner zusätzlichen Abfrage des Pins ;)

Danke für den Link, sehr schöne Lösung!

Gruß
Chris

volvodani

Hier mal ne kleine Routine von mir ich habe hier eine One Button Steuerung:
langer Druck=> wird ausgewertet >750ms z.B. zum Umschlalten einer Uhr in den Stellen modus
kurzer Druck(>10ms und <750ms)=> zum verändern eines Wertes

#define TIME 750 muss natürlich definiert werden

Der Code muss in die void loop()

Code: [Select]

 druck=digitalRead(BUTTON);            // Einlesen des Button (Achtung invertierte Logik da intrener Pull Up Widerstand aktiviert)
 if (druck==false&&ldruck==true){      // Fallende Flanke des Button
   start=millis();                     // Startzeit des Bettätigen
   ldruck=false;                       // Hilfsflag zur Flanken erkennung
 }
 if (druck==true&&ldruck==false){      // Steugende Flanke des Buttons
   ptime=millis()-start;               // Die Länge in ms des Gedückten Zustandes
   ldruck=true;
 }
 if (ptime>=TIME){                    // Wenn der Druck länger (Hier750ms)
   longpress=true;                    // War ein Langer druck
   ptime=0;                           // Zeit wieder Zurücksetzten
 }
 if (ptime<TIME&&ptime>=50) {         // Wenn der Druck kürzer 750ms und länger 50ms (gegen prellen)
   shortpress=true;                   // War ein kurzer Durck
   ptime=0;                           // Zeit wieder zurücksetzuten
 }
 if (shortpress==true){                    // Routine Kurzes drücken
                                                  // Hier dein Zeug rein für einen kurzen Druck
   shortpress=false;
 }
 if (longpress==true){                      // Routine Langes drücken
// z.B.    setmode++;                               // Stellmodus erhöhen
                                                // Hier dein Zeug für den langen Druck
 longpress=false;                         // Rücksetzten des Flags Langes Drücken
 }


So ist das Leben:
Manchmal bis du das Denkmal, manchmal die Taube!

sorath

Danke volvodani!

Darauf werde ich zurückgreifen, sobald ich ans echte bauen meiner Steuerung kommen werde, das is viel sauberer als meine zusammengezimmerte Version zum Testen!  8)


Gruß
Chris

Go Up