Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Pages: [1]   Go Down
Author Topic: 2 If Abfragen  (Read 1433 times)
0 Members and 1 Guest are viewing this topic.
Austria
Offline Offline
Newbie
*
Karma: 0
Posts: 5
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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

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
Logged

Wien
Offline Offline
Edison Member
*
Karma: 30
Posts: 2017
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

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

gruß stefan
Logged

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

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:
  if((a == 11) && (a < (b+2))
  {
    Serial.print ("Test");
  }

er führt die Anweisung gleich bei 11 aus.
« Last Edit: August 16, 2012, 04:16:52 pm by prophet2812 » Logged

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

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



 
Logged

Wien
Offline Offline
Edison Member
*
Karma: 30
Posts: 2017
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

hi,

Code:
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
Logged

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

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-grin

lg
Logged

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

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-grin

lg

hab die Lösung:

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

Germany
Offline Offline
Edison Member
*
Karma: 50
Posts: 2372
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hervorragend! Wann tritt denn die Bedingung ein?
if(a >= 11 && b > (b+1))
Speziell: Wann ist denn b größer als b+1? smiley-wink Sollte man mal drüber nachdenken... smiley-wink
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

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

Speziell: Wann ist denn b größer als b+1? smiley-wink Sollte man mal drüber nachdenken... smiley-wink
Wenn 1 keine Zahl ist sondern eine Variable und den Wert kleiner -1 annimmt.  smiley-wink smiley-wink smiley-wink
Grüße Uwe
Logged

Germany
Offline Offline
Edison Member
*
Karma: 50
Posts: 2372
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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...
Logged

Mein Arduino-Blog: http://www.sth77.de/ - letzte Einträge: Teensy 3.0 - Teensyduino unter Window 7 - Teensyduino unter Windows 8

Pages: [1]   Go Up
Arduino Forum upgrade scheduled for Monday, October 20th, 11am-4pm (CEST). Sorry for the inconvenience!
Jump to: