Go Down

Topic: 2 If Abfragen (Read 1 time) previous topic - next topic

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:
Code: [Select]

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:
Code: [Select]

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
   

uwefed

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

Eisebaer

hi,

Code: [Select]

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


gruß stefan
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

#3
Aug 16, 2012, 11:04 pm Last Edit: Aug 16, 2012, 11:16 pm by prophet2812 Reason: 1
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

Code: [Select]

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


er führt die Anweisung gleich bei 11 aus.

uwefed

Quote
er führt die Anweisung gleich bei 11 aus.


Ja das ist richtig.

Benutze millis(). alles andere ist ungenau, umständlich oder kompliziert.
Code: [Select]

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




Eisebaer

hi,

Code: [Select]

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

und
Quote
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
nimm abblockkondensatoren!  100nF.  glaub mir, nimm abblockkondensatoren!

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

lg


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

lg


hab die Lösung:

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

sth77

Hervorragend! Wann tritt denn die Bedingung ein?

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

Speziell: Wann ist denn b größer als b+1? ;) Sollte man mal drüber nachdenken... ;)
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

uwefed


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

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

sth77

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...
Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Go Up