Pages: [1]   Go Down
Author Topic: {gelöst} - [Einsteiger!] Frage zu Taster und "Modus schalten" [delay-Problem]  (Read 747 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
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
« Last Edit: December 29, 2012, 05:09:23 pm by sorath » Logged

Forum Moderator
BZ (I)
Offline Offline
Brattain Member
*****
Karma: 251
Posts: 21252
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 smiley-wink

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

Gruß
Chris
Logged

AREA COLOGNE
Online Online
Edison Member
*
Karma: 21
Posts: 1125
I am 1 of 10 who understands binary
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
 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
  }


« Last Edit: December 31, 2012, 06:04:32 am by volvodani » Logged

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

Offline Offline
Newbie
*
Karma: 0
Posts: 40
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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!  smiley-cool


Gruß
Chris
Logged

Pages: [1]   Go Up
Jump to: