sxon:
ich quäle mich seit mehreren Tagen mit dem Problem mehrere Inputs (via buttonState) zu debouncen.
Ich glaube, sowas ähnliches wird hier im Forum häufiger mal gefragt.
Ich habe daher mal eben was vorbereitet, das man dafür verwenden kann und dabei relativ allgemein gehalten ist.
Eine Datenstruktur, in die man seine Buttons verpacken kann und zwei Funktionen:
- initButtons() ==> wird in der setup-Funktion aufgerufen
- setButtons() ==> wird in der loop-Funktion aufgerufen
Die Funktion kann für beliebig viele Buttons verwendet werden, begrenzt nur die Anzahl der freien Arduino-Pins.
Die Buttons können wahlweise mit externen PullDown-Widerständen angeschlossen sein (#define BUTTONTYPE INPUT) oder es können Buttons mit den internen PullUp-Widerständen verwendet werden (#define BUTTONTYPE INPUT_PULLUP).
Man ruft in der loop die Funktion "setButtons()" auf und dabei werden für jeden einzelnen Button folgende Informationen gesetzt:
myButtons[].down ==> down ist "true", wenn der Button momentan gedrückt ist
myButtons[].pressed ==> pressed ist nur einmalig "true", wenn der Button während des letzten Aufrufs von setButtons() den Status von down==false nach down==true geändert hat.
Wer möchte, kann es ja mal ausprobieren, was man damit machen kann.
// Multiple buttons debouncing demo by 'jurs' for German Arduino Forum
#define BUTTONTYPE INPUT_PULLUP // INPUT or INPUT_PULLUP
struct debouncedButton {byte pin; unsigned long lastChanged; boolean down; boolean pressed;};
debouncedButton myButtons[]={
{2,0,false,false}, // pin-2
{3,0,false,false}, // pin-3
{4,0,false,false}, // pin-4
{5,0,false,false}, // pin-5
{6,0,false,false}, // pin-6
};
#define NUMBUTTONS sizeof(myButtons)/sizeof(myButtons[0])
#define DEBOUNCETIME 5
void initButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
pinMode(myButtons[i].pin,BUTTONTYPE); // set button pinMode
}
void setButtons()
{
for (int i=0; i<NUMBUTTONS; i++)
{
myButtons[i].pressed=false;
boolean state=digitalRead(myButtons[i].pin);
if (BUTTONTYPE==INPUT_PULLUP) state=!state;
if (state==HIGH && myButtons[i].down==false && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].lastChanged=millis();
myButtons[i].down=true;
myButtons[i].pressed=true;
}
else if (state==LOW && myButtons[i].down==true && labs(millis()-myButtons[i].lastChanged)>DEBOUNCETIME)
{
myButtons[i].down=false;
myButtons[i].lastChanged=millis();
}
}
}
void setup() {
Serial.begin(9600);
Serial.println("Press any button");
initButtons();
}
void loop() {
setButtons();
for (int i=0; i<NUMBUTTONS; i++)
{
if (myButtons[i].pressed)
{
Serial.print("Button pressed, Index ");Serial.print(i);
Serial.print("\tPin ");Serial.println(myButtons[i].pin);
}
}
}