Anfänger sucht Hilfe zu Ansteuerung einer LED mit 2 Tastern

Hallo Community,

ich habe mich am Wochenende ein bisschen mit meinem neu erstandenen Arduino Uno beschäftig. Ich bin blutiger Anfänger.

Ich möchte mich mit einem ersten kleinen Projekt über die normalen Übungen hinaus wagen. Und zwar möchte ich eine LED mit 2 Tastern ansteuern. Bei Druck des ersten Tasters soll die LED einmal leuchten (im Optimalfall kann ich die Zeit angeben wielange diese leuchtet) und beim Druck des zweiten Tasters soll die LED solange leuchten bis ich ein weiteres mal auf den selben Knopf drücke.

Meine Idee war es über Interrupts zu lösen (nicht gleich steinigen wenn das eine Schnapsidee ist). Der Knopf zwei wo sie leuchtet bis zum nächsten Druck funktioniert wunderbar. Nur das einmal leuchten macht mir ein wenig zu schaffen und ich komme nicht weiter.

const int button1 = 2;
const int button2 = 3;  
const int ledPin = 13;   

int state;
int buttonState;
int lastState;
int ledState;

volatile unsigned long alteZeit=0, entprellZeit=50;

void setup() {
  Serial.begin(9600);   
  pinMode(ledPin, OUTPUT);    
  pinMode(2, INPUT); 
  pinMode(3, INPUT); 
  attachInterrupt(0, interruptRoutine, CHANGE);
  attachInterrupt(1, interruptRoutine1, CHANGE);
}

void loop() {
  Serial.println("-----------------normaler Loop ----------------");
  delay(1000);
  }

//Taster1

void interruptRoutine() {
     if (ledPin, HIGH) 
     digitalWrite(ledPin, LOW);
     const int buttonState = digitalRead(button1);
     if((millis() - alteZeit) > entprellZeit) {
      if (buttonState == HIGH) 
      digitalWrite(ledPin, LOW);
      alteZeit = millis(); 
     }
     else
     digitalWrite(ledPin, HIGH);
     Serial.println("Interrupt_Routine 0 wird ausgefuehrt");
}

//Taster2
void interruptRoutine1() {
    state = digitalRead(button2);
   if (state != lastState) 
  {
    if (state == HIGH) 
    {
      if (ledState == HIGH) 
      {
        ledState = LOW;
        Serial.println("LED AUS");
      }
      else
      {
        ledState = HIGH;
        Serial.println("LED EIN");
      }
    }
    lastState = state;
  }
 
  digitalWrite(ledPin, ledState);
  delay(20);
}

Der Taster1 reagiert erst beim dritten oder vierten Drücken, und dann bleibt die LED an erst wenn ich die Funktion des zweiten Tasters 1x ausführe dann klappt es halbwegs, aber nicht mit jedem Tasetndruck...

Herzlichen Dank für Hinweise, wo ich falsch liege.

Schönen Abend
MS

Um 2 Taster zu bedienen braucht es keinen Interrupt.
Du musst die Tasterabfrage in der Loop und ohne ein delay durchführen.

Herzlichen Dank für die schnelle Antwort. Ich dächte das habe ich schon versucht, werde morgen noch einmal einen Anlauf nehmen. Schönen Abend und gute Nacht.

Ein kleines delay(10) zum Entprellen des Tasters nach dem digitalRead() würd ich schon nutzen.
Grüße Uwe

the_sheep:
Meine Idee war es über Interrupts zu lösen (nicht gleich steinigen wenn das eine Schnapsidee ist).

Du hast Glück. Steinigungen werden nur bei Tageslicht durchgeführt. Nach Einbruch der Dunkelheit lassen wir Leute, die mit solchen Ideen antanzen, gewähren.

Gruß

Gregor

Ich danke Euch für die zahlreichen Hinweise und das Verschonen des Steinigens. Leider hatte ich noch keine Möglichkeit weiter zu probieren.

Aber ich werde berichten :slight_smile:

Danke.

Hallo Zusammen,

habe jetzt die Idee von kulturbereicherer aufgegriffen alles über einen analogen Eingang abzufragen. Klappt soweit, als das ich die Tasten drücke und die LED an geht und wieder aus. Zusätzlich habe ich mir ein LCD integriert, damit ich sehe welchen Taster ich gedrückt habe. Nun möchte ich aber bei Druck des 2. Tasters das die LED an bleibt bis ich den 2. Taster nochmal drücke. Irgendwie hab ich da ein Blockade:-( beim basteln der Schleife, dass das Signal HIGH bleibt. Kann mir bitte jemand helfen?

#include <LiquidCrystal.h>

// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

const int ledPin = 10;
int a=0;
 

void setup() {
  lcd.begin(16, 2);
  pinMode(A5, INPUT_PULLUP);
}

int readButtons(int pin){
  int b,c = 0;
  c=analogRead(pin);  
  if (c>1000)
  {
    b=0; 
  }   
else
  if (c>15 && c<19)
  {
    b=1; 
  }     
  else
    if (c<25 && c>20)
    {
      b=2; 
    }       
return b;
}
 
void loop()
{
  a=readButtons(5);
  lcd.clear();
  if (a==0) // no buttons pressed
  {
    digitalWrite(ledPin,LOW);
    lcd.setCursor(0,1);
    lcd.print("Press a button");
  }   
  else
    if (a==1) 
    {
      digitalWrite(ledPin, HIGH);
      lcd.setCursor(0,2);
      lcd.print("Pressed button ");
      lcd.print(a);
    }
    else
    if (a==2) 
    {  
      digitalWrite(ledPin, HIGH);
      lcd.setCursor(0,2);
      lcd.print("Pressed button ");
      lcd.print(a);
    }
  delay(1000); 
}