Problem mit mehreren Tastern

Hallo zusammen,

ich habe ein Problem mit dem Abfragen mehrerer Taster.
Und zwar ich möchte, dass wenn Taster 1 oder Taster 2 gedrückt wird, dass LED1 angeht und wenn einer der beiden Taster gedrückt wird, soll LED1 wieder ausgehen.
Wenn Taster3 gedrückt wird, soll LED1 und LED2 angehen, aber Taster3 soll keine LED ausschalten, sondern wenn ich Taster1 oder Taster2 dann drücke, sollen beide LEDs ausgehen.
Der Teil mit Taster1 und 2 funktioniert, nur der Teil mit Taster3 geht nicht.
Kann mir da einer helfen?

#include <SPI.h>
#include <avr/wdt.h>


int taste1 = 9;
int taste2 = 10;
int taste3 = 11;

int led1 = 12;
int led2 = 13;


int aktion_status = LOW;
int taster_status = LOW;

int status_taste1;
int vorheriger_status_taste1 = HIGH;

int status_taste2;
int vorheriger_status_taste2 = HIGH;

int status_taste3;
int vorheriger_status_taste3 = HIGH;

long letztes_prellen = 0;
long entprellzeit = 30;


void setup() {
	// Tasten
	pinMode(taste1, INPUT_PULLUP);
	pinMode(taste2, INPUT_PULLUP);
	pinMode(taste3, INPUT_PULLUP);

	// LEDs
	pinMode(led1, OUTPUT);
	pinMode(led2, OUTPUT);

	// WDTO_4S, WDTO_2S, WDTO_1S
	wdt_enable(WDTO_8S);
}

void taster() {

	digitalWrite(led1, HIGH);
      digitalWrite(led2, LOW);

}

void standby() {
		digitalWrite(led1, LOW);
		digitalWrite(led2, LOW);
 
}


void aktion() {
    if (aktion_status == HIGH) {
	digitalWrite(led1, HIGH);
	digitalWrite(led2, HIGH);
    }
  else {
    standby();
  }
}



void loop() {

	int aktueller_status_taste1 = digitalRead(taste1);
	int aktueller_status_taste2 = digitalRead(taste2);
	int aktueller_status_taste3 = digitalRead(taste3);

	if (aktueller_status_taste1 != vorheriger_status_taste1) {
		letztes_prellen = millis();
	}

	if (aktueller_status_taste2 != vorheriger_status_taste2) {
		letztes_prellen = millis();
	}
	
	if (aktueller_status_taste3 != vorheriger_status_taste3) {
		letztes_prellen = millis();
	}
	
	if ((millis() - letztes_prellen) > entprellzeit) {
		if (aktueller_status_taste1 != status_taste1) {
			status_taste1 = aktueller_status_taste1;

			if (status_taste1 == LOW) {
				taster_status = !taster_status;

			}
		}

		if (aktueller_status_taste2 != status_taste2) {
			status_taste2 = aktueller_status_taste2;

			if (status_taste2 == LOW) {
				taster_status = !taster_status;

			}
		}

		if (aktueller_status_taste3 != status_taste3) {
			status_taste3 = aktueller_status_taste3;

			if (status_taste3 == LOW) {
				aktion_status = !aktion_status;
			}
		}
	}

  
	if (taster_status == HIGH) {
		taster();
	}

	if (taster_status == LOW) {
		standby();
	}  

  
  if (aktion_status == HIGH) {
		aktion();
	}
	
	vorheriger_status_taste1 = aktueller_status_taste1;
	vorheriger_status_taste2 = aktueller_status_taste2;
	vorheriger_status_taste3 = aktueller_status_taste3;
	

	wdt_reset();
}

Schon mal vielen Dank.

Zeichne ein Zustandsdiagramm mit allen Übergängen, d.h. was passieren soll wenn welche Taste gedrückt wird. Dann wird schon mal vieles klarer.

Hallo,

dazu gibt es logische Verknüpfungen und / oder . Zudem brauchst Du ein paar Statusmerker die dir sagen ob die LED gerade an oder aus sind damit Du den Zustand wechsen kannst. Schau die auch mal den Typ bool an. Ich finde der lässt sich leichter leichter verknüpfen.

Heinz

du brauchst bei Taster 1 und Taster 2 eigentlich nur entscheiden ob

WENN (LED 1== ein und LED2 == ein ) --> LED1 und LED2 ausschalten
SONST WENN (LED 1 == ein ) --> LED 1 AUS
SONST --> LED 1 EIN

und bei Taster 3 schaltest deine zwei LEDs einfach ein.

Imho brauchst du keine separate "Statusvariablen". Du kannst den Zustand der LEDs auch mit digitalRead(led1) auslesen.

edit: kompiliert und funktioniert mit meinen Pin-Definitionen:

/*
  3 Buttons - 2 LED

  The circuit:
  - pushbuttons attached from pin to GND
  - LED attached from GPIO to ground

  https://forum.arduino.cc/t/problem-mit-mehreren-tastern/889442/3

  by noiasca

  2021-07-27
*/


// constants won't change. They're used here to set pin numbers
const byte buttonPin1 = A1;
const byte buttonPin2 = A2;
const byte buttonPin3 = A3;

const byte led1Pin = 2;
const byte led2Pin = 3;

class Button                   // eine Klasse für Buttons
{
    // returns HIGH if button was klick since last call - debounce
    // the following variables are ONE BYTE only as we don't measure absolute running
    const byte buttonPin;
    const byte debounceDelay = 50;    // the debounce time; increase if the output flickers
    bool lastButtonState = HIGH;      // the previous reading from the input pin
    byte lastDebounceTime = 0;        // the last time the output pin was toggled - we check only ONE byte

  public:
    Button(byte attachTo) : buttonPin(attachTo) {}

    void begin() {
      pinMode(buttonPin, INPUT_PULLUP);
    }

    bool wasPressed() {
      bool buttonState = LOW;                  // the current reading from the input pin
      byte reading = !digitalRead(buttonPin);                         // if we are using INPUT_PULLUP we are checking invers to LOW Pin
      if (((millis() & 0xFF ) - lastDebounceTime) > debounceDelay)    // If the switch changed, AFTER any pressing or noise
      {
        if (reading != lastButtonState && lastButtonState == LOW)     // If there was a change and and last state was LOW
        {
          buttonState = HIGH;
        }
        lastDebounceTime = millis() & 0xFF;
        lastButtonState = reading;
      }
      return buttonState;
    }
};

Button button1{buttonPin1};
Button button2{buttonPin2};
Button button3{buttonPin3};

void action()
{
  if (digitalRead(led1Pin) == HIGH && digitalRead(led1Pin) == HIGH)
  {
    digitalWrite(led1Pin, LOW);
    digitalWrite(led2Pin, LOW);
  }
  else if (digitalRead(led1Pin) == HIGH)
  {
    digitalWrite(led1Pin, LOW);
  }
  else
  {
    digitalWrite(led1Pin, HIGH);
  }
}

void setup() {
  Serial.begin(115200);
  Serial.print(F("3 Button - 2 LED"));
  pinMode(led1Pin, OUTPUT);
  pinMode(led2Pin, OUTPUT);
  button1.begin();
  button2.begin();
  button3.begin();
}

void loop() {
  if (button1.wasPressed()) action();
  if (button2.wasPressed()) action();
  if (button3.wasPressed())
  { 
    digitalWrite(led1Pin, HIGH);
    digitalWrite(led2Pin, HIGH);
  }
}

Und zwar ich möchte, dass wenn Taster 1 oder Taster 2 gedrückt wird, dass LED1 angeht
--> check

und wenn einer der beiden Taster gedrückt wird, soll LED1 wieder ausgehen.
--> check

Wenn Taster3 gedrückt wird, soll LED1 und LED2 angehen,
--> check

aber Taster3 soll keine LED ausschalten,
--> check

sondern wenn ich Taster1 oder Taster2 dann drücke, sollen beide LEDs ausgehen.
--> check

tut also genau das was du beschrieben hast.

Du mußt für jede Taste wissen ob sie gerade gedrückt wurde oder losgelassen wurde. Darum brauchst Du für Jede Taste einen eigenen Satz Statusvariablen und Millis()- Abspeicherungen.
Auch mußt Du definieren was Du unter "gleichzeitig" verstehst. Sind das 2 Tastendrücke mit 1mS Abstand oder 100mS?

Grüße Uwe