Go Down

Topic: [Solved] Probleme mit dem Entprellen mehrerer Taster (Read 328 times) previous topic - next topic

NovNicH

Schönen guten Abend zusammen,

ich bin aktuell dabei eine Steuerung für mein Aquarium zu entwerfen. In diesem konkreten Beispiel soll es darum gehen, die Beleuchtung im Unterschrank einzuschalten wenn die Türen geöffnet werden. Zusätzlich soll dann ebenfalls die Hintergrundbeleuchtung des LCD eingeschaltet werden und noch ein paar andere Sachen. Hierdurch wird die Verwendung eines Schalters, der nicht mit dem Arduino verbunden ist, ausgeschlossen. Die Funktion soll später ebenfalls noch einen Taster überwachen.


Kurze Beschreibung meines Problems:
Ich habe einen Beispielcode geschrieben, der die interne LED des Arduinos, entsprechend dem Rückgabewert der 'debounceButton' Funktion schalten soll. Die Logic der Funktion ist mehr oder weniger aus dem Buch 'Mit Arduino die elektronische Welt entdecken' von Erik Bartmann entnommen. Leider funktioniert der Sketch nur, wenn das Zeitinterval 'DEB_INTERVAL' gleich Null ist. Für andere Werte wie z.B. 20 Millisekunden funktioniert es nicht mehr.

Leider bin ich bisher nicht dahinter gekommen und hoffe hier nun auf kompetente Hilfe.

Ich danke euch vielmals für jede Rückmeldung.


VG
Nicolas




Code: [Select]

// Pin where the button is connected to
const byte CABINET_LIGHT_BUTTON =  17; // A3

// Pin where the LED for the cabinet lighting is connected to
const byte LED_PIN = 13;

// Initializing the cabinet lighting as off
boolean cabinet_light_prev_state = LOW;

// Last time when an edge change was recognized on the button pin
unsigned long cabinet_light_last_bounce_time = 0;

// Interval which has to be passed without edge change to ensure a stable state
const int DEB_INTERVAL = 0;


// Initializing the pin modes
void setup() {
  pinMode(CABINET_LIGHT_BUTTON, INPUT_PULLUP);
  pinMode(LED_PIN, OUTPUT);
}


// Running the main program
void loop() {
  digitalWrite(LED_PIN, debounceButton(CABINET_LIGHT_BUTTON));
}



/* ---------------------------------------------------------------------------
                            DEBOUNCE BUTTON FUNCTION
  ----------------------------------------------------------------------------
  This function will return a debounced state of the button on the input pin.
  The switch function was implemented because multiple buttons are used in the
  later set up.*/

boolean debounceButton(byte pin) {

  boolean prev_state;
  unsigned long last_bounce_time;

  // Assigning the required values according to the current pin / button
  switch (pin) {
    case CABINET_LIGHT_BUTTON:
      prev_state = cabinet_light_prev_state;
      last_bounce_time = cabinet_light_last_bounce_time;
      break;
  }

  // Getting the current pin state and time in milli seconds
  boolean current_state = digitalRead(pin);
  unsigned long current_time = millis();

  // Checking if the button state has changed since the last iteration.
  // If so, the time when this button has bounced at last will be updated
  if (current_state != prev_state) {
    last_bounce_time = current_time;
  }

  // If the difference between the current time and the time when the button
  // bounced the last time is greater than the debounce interval, we can
  // assume this as a static state.
  if ((current_time - last_bounce_time) >= DEB_INTERVAL) {
    prev_state = current_state;
  }

  // Writing back the values according to the current pin / button
  switch (pin) {
    case CABINET_LIGHT_BUTTON:
      cabinet_light_prev_state = prev_state;
      cabinet_light_last_bounce_time = last_bounce_time;
      break;
  }

  // Returning the stable pin state
  return prev_state;
}



agmue

Versuche mal

Code: [Select]
  if (current_state == prev_state) {
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

NovNicH

#2
Jan 04, 2019, 11:54 pm Last Edit: Jan 04, 2019, 11:56 pm by NovNicH
Hi ...

so einfach kann es sein ^^. Jetzt funktioniert es wie gewollt.
Stimmt eigentlich, ich möchte an der Stelle ja nicht prüfen ob ein Flankenwechsel vorliegt, sondern ob der Wert wieder auf den Ausgangswert zurückgesprungen ist.

Mit einer Intervallzeit von ein paar hundert Millisekunden kann man die Funktionalität gut validieren.

Vielen Dank für Deinen Stupser.


VG
Nicolas


agmue

so einfach kann es sein ^^. Jetzt funktioniert es wie gewollt.
Kaum macht man es richtig, schon funktioniert es :)

ich bin aktuell dabei eine Steuerung für mein Aquarium zu entwerfen.
...
Die Logic der Funktion ist mehr oder weniger aus dem Buch 'Mit Arduino die elektronische Welt entdecken' von Erik Bartmann entnommen.
Möglicherweise ist das Beispiel aus dem Buch pädagogisch wertvoll, in ein Projekt würde ich es so nicht einbauen, das geht einfacher. Wobei "einfacher" aus der Sicht des Betrachters relativ ist. Zum Entprellen mehrerer Taster würde ich Felder oder Strukturen zusammen mit Schleifen vorschlagen.

Ein Beispiel.
Die Vorstellungskraft ist wichtiger als Wissen, denn Wissen ist begrenzt. (Albert Einstein)

Go Up