2 If Abfragen

Hi Leute,
bin neu hier und leider war bei den Suchergebnissen nicht die passende Antwort dabei.

Ich hab ein Arduino Uno SMD Edition.

Dort habe ich jetzt einen Button auf DigiPin 2 angeschlossen.
Ich habe eine Variable i diese wird immer inkrementiert sobald man einmal auf den Button drückt.
Jetzt will ich, wenn man 3 Sekunden lang den Button drückt das er dekrementiert.

Frage 1: Wie kann ich messen ob der Button 3 Sekunden lang gedrückt wurde?
mit der Funktion millis?

ein kleiner Codeausschnitt wie es jetzt daweil aussieht:

if(Btn == 1)
  {
    digitalWrite(ledPin, HIGH);
    i++;
    delay(500);
    Serial.println(i,DEC);
  }
  else
  {
    digitalWrite(ledPin, LOW);
  }

Meine theoretische Lösung :
Man startet einen Timer wenn Btn == 1 und wenn Btn == 0 wieviel Zeit ist zwischen Button gedrückt und nicht gedrückt vergangen
wenn die Zeit höher oder gleich 3 ist dann Variable i dekrementieren. Soweit die Theorie wie setze ich das programmiertechnisch um?

Frage 2: Ich habe noch eine Abfrage z.B Variable a und Variable b. Nun möchte ich wenn Variable a größer b und 2 unterschied hat das er eine Anweisung ausführt. Ich weiß wie die IF-Abfrage lautet wenn a größer b ist , aber leider nicht wie die Abfrage funktioniert wenn noch 2 unterschied sein muss.

BeispielCode für a größer b:

if (a < b)
{
  Anweisung;
}

aber wie muss der Code aussehen wenn es auch noch 2 Unterschied haben soll?
Eigentlich was einfaches aber hab gerade eine Hirnblockade.

MFG prophet

Die Funktion millis() gibt die Zeit in Millisekunden ab Einschaltzeitpunkt zurück. Wenn der Taster gedrückt wird speicherst Du die Zeit ab und vergleichst bei jedem durchgang ob die Zeit verstrichen ist.
Siehe http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Grüße Uwe

hi,

if (a > (b + 1))
{
  Anweisung;
}

gruß stefan

Danke für die Anworten… würde es noch einen anderen Lösungsweg geben als millis zu benützen?

und bei mir funktioniert leider die IF-Abfrage so ganz

  if((a == 11) && (a < (b+2))
  {
    Serial.print ("Test");
  }

er führt die Anweisung gleich bei 11 aus.

er führt die Anweisung gleich bei 11 aus.

Ja das ist richtig.

Benutze millis(). alles andere ist ungenau, umständlich oder kompliziert.

int i =0; // Zählvariable 
int button = 2;
int buttonState = 0;           
unsigned long previousMillis  = 0;       

long wartezeit = 3000;           // wartezeit für dec

void setup() {
    pinMode(button, INPUT);      
}

void loop()
{
  if (digitalRead(button) == HIGH)
   {
   if ( buttonState ==0)         // das erste mal i wird erhöht
     {
       unsigned long previousMillis = millis();
       buttonState = 1;
       i++;
     }
    if ( buttonState ==1 )   //Taster gedrückt und variabile erhöht        
     {
       if (millis() - previousMillis >  wartezeit)               //Taster länger als 3 sek gedrückt, Variable decrementieren
       {  
        i--; 
        i--;
        buttonState ==2;
       } 
     }  
    if (digitalRead(button) == LOW)
     {
       buttonState = 0;
     } 
   }
}

Grüße Uwe

hi,

if((a == 11) && (a < (b+2))
  {
    Serial.print ("Test");
  }

und

Nun möchte ich wenn Variable a größer b und 2 unterschied

paßt nicht zusammen, wenn a um 2 größer als b sein soll. dann muß es eben (a > (b + 1)) sein oder meinetwegen
(a >= (b + 2)).

gruß stefan

es soll ja abgefangen werden ob schon 11 ist und es 2 unterschied zu b hat.

also quasi wie beim tischtennis.

bei 11 zu 10 ist das spiel noch nicht vorbei, weil immer 2 unterschied sein muss.

ich hoffe ich konnte rüberbringen was ich brauche :smiley:

lg

prophet2812:
es soll ja abgefangen werden ob schon 11 ist und es 2 unterschied zu b hat.

also quasi wie beim tischtennis.

bei 11 zu 10 ist das spiel noch nicht vorbei, weil immer 2 unterschied sein muss.

ich hoffe ich konnte rüberbringen was ich brauche :smiley:

lg

hab die Lösung:

if(a >= 11 && b > (b+1))

Hervorragend! Wann tritt denn die Bedingung ein?

prophet2812:
if(a >= 11 && b > (b+1))

Speziell: Wann ist denn b größer als b+1? :wink: Sollte man mal drüber nachdenken… :wink:

sth77:
Speziell: Wann ist denn b größer als b+1? :wink: Sollte man mal drüber nachdenken... :wink:

Wenn 1 keine Zahl ist sondern eine Variable und den Wert kleiner -1 annimmt. :wink: :wink: :wink:
Grüße Uwe

Oder beim Variablenüberlauf: Nimmt man b als vorzeichenloses Byte mit dem Wert 255, dann ist b+1=0 und somit kleiner als b - also ein Spezialfall.
Aber der Threadersteller hat sicher schon bemerkt, dass in die Zeile auch ein a reingehört...