LED-Schaltung mit 3 Tastern

Guten Morgen,

ich brauche Hilfe bei einer LED-Schaltung mit 3 Taster, der eine soll 2 LEDs anschalten, der andere eine 3. und der 3. Schalter soll alle LEDs ausschalten. Man soll nach einer Eingabe erstmal den Reset Knopf drücken bevor man den anderen Taster verwenden kann.
Jetzt habe ich aber das Problem, dass der 3.Taster nichts macht, ich habe das mit der while schleife und mit einer dritten if Anweisung versucht aber nichts funktioniert und ich verstehe nicht warum, habe auch schon den Taster durchgetauscht also daran kann es nicht liegen.

int key1 {5};
int key2 {6};
int key3 {4};

int LEDgreen {8};
int LEDyellow {9};
int LEDred {10};

void setup(){

  pinMode(key1, INPUT);
  pinMode(key2, INPUT);
  pinMode(key3, INPUT);
  pinMode(LEDgreen, OUTPUT);
  pinMode(LEDyellow, OUTPUT);
  pinMode(LEDred, OUTPUT);
}

void loop(){

  int orange = digitalRead(key1);
  int green = digitalRead(key2);
  int rest = digitalRead(key3);

  if(orange==HIGH){

    while(digitalRead(key3==0)){
      digitalWrite(LEDred,HIGH);
      digitalWrite(LEDyellow,HIGH);
      digitalWrite(LEDgreen,LOW);
    }
    digitalWrite(LEDred,LOW);
    digitalWrite(LEDyellow,LOW);
    digitalWrite(LEDgreen,LOW);

  }

  if(green==HIGH){

    while(digitalRead(key3==0)){
      digitalWrite(LEDred,LOW);
      digitalWrite(LEDyellow,LOW);
      digitalWrite(LEDgreen,HIGH);
    }
      digitalWrite(LEDred,LOW);
      digitalWrite(LEDyellow,LOW);
      digitalWrite(LEDgreen,LOW);

  }

}  

Ich bin dankbar für jede Hilfe.
LG Julian

Kannst du bitte mal erklären, was genau das sein soll.

ich meinte while Schleife und if Anweisung, habs korrigiert

Bis wann muss die Hausaufgabe fertig sein ?

Das ist keine Hausaufgabe, also kein Zeitansatz, ist nur ein kleines Projekt von mir.

Wie soll das funktionieren, solange du in der while-Schleife hängst?

Der Vergleich key3==0 hat als Parameter im digitalRead() nichts zu suchen.
key3 ist 4, also wird der Vergleich immer mit false (0) enden. Dann steht da digitalRead(0), was vermutlich nicht der der Pin ist, von dem Du lesen willst.

Vielleicht meinst Du

while(digitalRead(key3)==0)
2 Likes

Ich frage mich gerade, ob ich die Aufgabenstellung überhaupt richtig verstanden habe. Korrigier mich, wenn folgende Aussagen falsch sind:

  • Taste 1 kurz drücken -> LED Nr 1 und 2 leuchten dauerhaft
  • Taste 2 kurz drücken -> Es ändert sich nichts (da Du geschrieben hast, es müsse erst mit Taste 3 ein Reset durchgeführt werden)
  • Taste 3 kurz drücken -> Alle LEDs aus
  • Taste 2 kurz drücken -> LED Nr 3 leuchtet dauerhaft
  • Taste 1 kurz drücken -> Es ändert sich nichts
  • Taste 3 kurz drücken -> Alle LEDs aus
  • usw

Hallo,

@meter12

warum soll man alles reseten?
Man kann das so programmieren, dass bei Taster

  • Nr.1 nur 2 Leds leuchten
  • Nr.2 unabhängig von Nr.1 die 3. Led steuert
  • Nr.3 alle Leds ausschaltet

Ich sehe keinen Grund für einen Reset.
Taster 3 "resetet" in dem Sinne alle Leds auf "aus".

Sind irgendwo Pullups oder Pulldowns verbaut?

Wenn die Frage an mich gerichtet war: Keine Ahnung. Ich habe das aus der Aufgabenstellung des Themenstarters herausgelesen :wink:

Daher wollte ich zunächst von ihm wissen, ob ich (wir) ihn richtig verstanden haben.

Hallo,

keine Sorge, dass war an den TO gerichtet.
Ich habe es nachträglich konkretisiert. :wink:

@meter12
Ich glaube mit deinen if und while verläufst du dich im Ablauf.

Wahrscheinlich wärst du mit einen Finite State Machine besser beraten.

Nur leider hab ich die Abhängigkeiten noch nicht eindeutig verstanden bzw. was du mit Reset meinst (Reset vom Arduino?!?)

Meinst du das vieleicht so?

Ja so meinte ich das, also ich wollte quasi nur dass man den 3. Taster drücken muss um die alle aus zu machen bevor man den anderen Taster benutzen kann

ok, dann vieleicht so:

/*
   https://forum.arduino.cc/t/led-schaltung-mit-3-tastern/1366411
   2025-03-23 by noiasca

*/
constexpr uint8_t key1 {5};  // orange?
constexpr uint8_t key2 {6};  // green?
constexpr uint8_t key3 {4};  // rest???

constexpr uint8_t ledGreen {8};
constexpr uint8_t ledYellow {9};
constexpr uint8_t ledRed {10};

enum State {IDLE, ORANGE, GREEN} state;

void setup() {
  pinMode(key1, INPUT);
  pinMode(key2, INPUT);
  pinMode(key3, INPUT);
  pinMode(ledGreen, OUTPUT);
  pinMode(ledYellow, OUTPUT);
  pinMode(ledRed, OUTPUT);
}

void off() {
  digitalWrite(ledRed, LOW);
  digitalWrite(ledYellow, LOW);
  digitalWrite(ledGreen, LOW);
}

void loop() {
  switch (state) {
    case IDLE:
      if (digitalRead(key1) == HIGH) {
        digitalWrite(ledRed, HIGH);
        digitalWrite(ledYellow, HIGH);
        digitalWrite(ledGreen, LOW);
        state = ORANGE;
      }
      if (digitalRead(key2) == HIGH) {
        digitalWrite(ledRed, LOW);
        digitalWrite(ledYellow, LOW);
        digitalWrite(ledGreen, HIGH);
        state = GREEN;
      }
      break;
    case ORANGE:
      if (digitalRead(key3) == HIGH) {
        off();
        state = IDLE;
      }
      break;
    case GREEN:
      if (digitalRead(key3) == HIGH) {
        off();
        state = IDLE;
      }
      break;
  }
}
1 Like

Der Pfeil im unteren "key3 == HIGH" Statuswechsel soll bestimmt auch zurück nach "Init" zeigen.
Was bei mehreren Tastern passiert, ist erstmal egal.
Im Zustand "Init" werden alle LED ausgeschaltet

@noiasca : Wokwi ist es egal, aber in echt wäre einen Tick klarer, die Pulldown, Widerstände direkt an den Pins anzuschließen (auch für den Fall, dass man keine Taster mit 4 Anschlüssen hat)
Sehr hübsch, deine Beispiellösung, übrigens.

1 Like

Wofür ist das Programm im echten Leben?

Ja das war offenbar husch pfusch.
Die Widerstände ... ja probier ich, dann kann man den LEDs auch gleich welche geben...

Das ist mit 3 einfachen if -then Abfragen in der Void loop zu lösen.

Wo ist das Problem.

Gruß

Pucki

Ich habe auch wohl noch nicht verstanden was es tun soll.
Denn Beschreibung und Programm passen nicht zueinander.

Für meine Wühlkiste.
Ein endlicher Automat mit Funktionszeigern

constexpr byte key1 {5};
constexpr byte key2 {6};
constexpr byte key3 {4};

constexpr byte LEDgreen  {8};
constexpr byte LEDyellow {9};
constexpr byte LEDred   {10};

void reset();
void eins();
void zwei();

void(*zustand)()   {reset};

void reset()
{
  pinMode(key1, INPUT);
  pinMode(key2, INPUT);
  pinMode(key3, INPUT);
  pinMode(LEDgreen, OUTPUT);
  pinMode(LEDyellow, OUTPUT);
  pinMode(LEDred, OUTPUT);
  digitalWrite(LEDred, LOW);
  digitalWrite(LEDyellow, LOW);
  digitalWrite(LEDgreen, LOW);
  if(digitalRead(key1)) zustand = eins;
  if(digitalRead(key2)) zustand = zwei;
}

void eins()
{
  digitalWrite(LEDred, HIGH);
  digitalWrite(LEDyellow, HIGH);
  if(digitalRead(key3)) zustand = reset;
}

void zwei()
{
  digitalWrite(LEDgreen, HIGH);
  if(digitalRead(key3)) zustand = reset;
}

void setup(){}

void loop()
{
  zustand();
}
1 Like

Der TO hat es im Prinzip richtig nur logisch falsch..

Der Zustand der LED's ist egal.

Er fragt mit einer Abfrage :
If Taste 1 gedrückt ,
dann Stelle den Zustand her der Gewünscht wird.

Fertig ist.

Das man das kurze flackern einer LED nicht sieht, würde ich eine Funktion schreiben die ich aufrufe bevor der neue Zustand eingestellt wird. Diese Funktion löscht alle LED's .

Gruß

Pucki