Bounce...ich werd gleich zum Hirsch.....

Ich beschäftige mich im Moment mit der Bounce Library und komme nicht weiter. Ich versuche die Zeit zu ermittel wie lange der Taster gedrückt ist um nach 2Sec ein höheren Intervall zu benutzen. Also Wenn ich kurz den Taster Tippe soll er in "einer" Schritte höchzählen und wenn ich länger als 2 Sec. drauf bleibe soll er in 5er Schritten hochzählen. Das was mir aktuell Kopfschmerzen bereitet ist, das ich die Funktion bouncer.duration () nicht verstehe. Bzw. er macht nicht das was ich erwartet hätte und ich komme einfach nicht drauf.

if ( bouncer.update() ) { 
    if ( bouncer.read(); == LOW && Menu == 3) {
        bouncer.rebounce(200); // 200ms Entprellen
        if (PWMwert < 255 && bouncer.duration() > 2000 ) {
          PWMwert +=5;
        } else {
           PWMwert +=1;
           }
        UpdateLCD();
      }
   }

Benutze ich bouncer.duration() falsch?

Hi, ich weiß nicht genau, aber geht der PWMwert nicht nur bis 255?
Wenn er z.B. bei 254 ist, versuchst du ihn noch mal um 5 zu erhöhen, weil er kleiner als 255 ist und er bekommt einen Überlauf oder so.

Versuchs doch mal mit:

if (PWMwert < 250 && bouncer.duration() > 2000 ) {

So müßte der Überlauf vermieden werden. Hoffe ich.

Gruß
Taquino

Du kannst auch nach dem Erhöhen kontrollieren, ob der Wert größer als 255 ist und wenn ja auf 255 setzen.

Sag uns bitte die Quelle der bounce Bibliothek.

Grüße Uwe

Hallo zusammen,

ich benutze diese hier:
http://playground.arduino.cc//Code/Bounce

Ja, das mit dem Überlauf muss ich mir noch ansehen, aber das ist ja aktuell nicht mein Problem ^^

du schreibst aber nur, er macht nicht das, was du erwartet hättest.
dann sag doch mal, was überhaupt dein problem ist.

Ok, sorry. Vielleicht habe ich mich falsch ausgedrückt.

Ich möchte wie bereits oben Beschrieben in meiner if Anweisung herausfinden ob der Taster länger als 2sec gedrückt ist. Wenn ja, soll er in 5er Schritten höchzählen, wenn kleiner 2 sec. dann nur in einer Schritten. Ich hatte mir vorgestellt das

if (PWMwert < 255 && bouncer.duration() > 2000 ) {
          PWMwert +=5;
        } else {
           PWMwert +=1;
           }

Genau dies bezweckt. Also ich bin davon ausgegangen das die Anweisung erst dann erfüllt ist wenn bouncer.duration größer 2Sec. ist. Die Schreife ist dauernd NICHT erfüllt, also im "einer" Bereich.

Mir ist bewusst das ich auch noch mit millis etc. arbeiten kann um meine gewünschte Funktion zu bekommen, jedoch möchte ich hiervon Lernen und verstehen was genau mein Denkfehler ist :slight_smile:

doch. ich glaube, daß sie für kurze zeit erfüllt ist.
und zwar bis PWMwert = 251 ist. das geht schnell.
dann aber wird abermals um 5 erhöht, macht gleich 256.
von nun an ist die bedingung (PWMwert < 255) NIE WIEDER erfüllt und er müßte bis ultimo den PWMwert weiter erhöhen oder eben einen überlauf kriegen oder sonstwas. wir kennen den rest deines codes nicht.

eine andere idee wäre, wenn der PWMwert > 255 ist, ihn auf 255 zurückzusetzen, damit er nicht über den höchstwert kommt.

So, Code angepasst, geht aber noch immer nicht

if ( bouncer.update() ) { 
    int value = bouncer.read();
      if ( value == LOW && Menu == 3 && SubMenu == 3 && Backlight == LOW) {
        // Make the button retrigger in 200 milliseconds
        bouncer.rebounce(200);
        if (PWMwert > 254) {
          PWMwert = 255; 
        } else if (PWMwert < 255) {
          PWMwert +=5;
          } else {
            PWMwert +=1;
          }
        UpdateLCD();
      }
   }

so ist es auch noch nicht richtig.
zwar setzt du oben den PWMwert auf 255 zurück, falls zu hoch,
aber darunter in der schleife kann der wert immer noch über 255 gehen wie vorher.
im else if mußt du 250 eintragen, damit kein überlauf passiert.
so wie es jetzt ist, kann genau ein überlauf passieren, bevor zurückgesetzt wird.

Ja das liebe entprellen... :~

Hab mich damit auch erst beschäftigt und hier in einem Fred wurde mir dann geholfen bzw. kam der wichtige Hinweis. Benutze die rising- bzw. fallingedge Funktionen:

  void loop() {
  bouncer.update();
  if (bouncer.fallingEdge() ) {  //Taster wurde gedrückt
    ulTimeTast=millis();

  if (ulTimeTast > 0) {
    if ((millis()-ulTimeTast)>2000) { //Taste ist länger als 2 Sekunden gedrückt
      ... mach irgendwas ...
      ulTimeTast=0;  //Zähler wieder auf 0 zurückstellen
    }
  }

  if (bouncer.risingEdge() ) { //Taster wurde wieder losgelassen
   ... mach irgendwas ...
  ulTimeTast=0;
   }


 }

Gruß - Markus

warum eigentlich?

ich bin erst seit zwei monaten im arduino-thema und wenn ich was über schalter entprellen lese, wird mir immer nur schlecht so daß ich nur noch potis benutzen will. die funktionieren ohne viel code.
einen schalter nur, um die LCD-hintergrundbeleuchtung auszuschalten. direkt.

aber kannst du trotzdem den link von dem fred zeigen?
früher oder später werde ich wohl nicht drum herumkommen, mich mit dem thema zu beschäftigen.

grüßle
taq

Hi,

@MarkusH: Danke für deine Antwort. Natürlich kann man das so machen. Ich habe es mittlerweile über einen Zähler gelöst welches meinen Anforderungen genügt. Das mit Millis hatte ich mir auch überlegt, jedoch "herkömmlich" wie im Beispiel "Blink without delay". Ich hatte nur gehofft das ich die Funktion bouncer.duration() nutzen könnte. Leider scheint es so das hier niemand einen Tip hat, wie genau man diese Funktion zu benutzen hat. Habe es bis heute nicht hinbekommen..... Trotzdem Danke für deinen Tip. Deine Version gefällt mir :slight_smile:

@Taquino: Ich mache auch noch nicht so lange im Arduino..... Tue mich oft noch schwer da ich "Gelegenheits" Programmierer bin^^ heißt, ich müsste mehr Zeit inverstieren um das Programmieren besser zu lernen / verstehen..... Nun zum Code. Du hattest mit deinem Überlauf natürlich die ganze Zeit recht, jedoch beantwortete dies nicht meine eigentliche Frage. Danke Dir trotzdem für den Hinweis. Anbei mal ein Auszug aus meinem Code. Wenns mal fertog ist, wird dieser hier veröffentlicht, falls ihn irgendwer brauchen kann.......

P.s. Mit der Bouncer lib ist es doch gar nicht viel Code.

if ( bouncer.update() ) { 
  int value4 = bouncer.read();
    if (value4 == LOW) {
      Zeit++;
    } else {
        Zeit = 0;
      }
    if ( value4 == LOW && Menu == 5 && SubMenu == 4 && Backlight == LOW) {
      // Make the button retrigger in 200 milliseconds
      bouncer.rebounce(200);
      if (PWMwert > 254) {
        PWMwert = 255;
      } else if (PWMwert <= 250 && Zeit > 15) {
          PWMwert +=5;
        } else {
            PWMwert +=1;
          }
      UpdateLCD();
    }
  }

Hat jetzt den tollen nebeneffekt das wenn er Anfängt nach 15 durchgängen schneller zu werden, er kurz vor Ende wieder Langsam wird. Ist echt toll und gefällt mir. Natürlich gibt es noch die möglichkeit das ganz für den 1ner Bereich zu machen. Mal sehen ob ich das noch mache...... Das ist aber momentan nicht mein Ziel