3 LED 1 Button EEPROM

Hallo,

ich muss einen Programmcode schreiben, der 3 LED durch drücken eines Buttons schält. 1x Drücken= ! Lampe an, 2x 2 und 3x alle 3. Außerdem soll ich den aktuellen Wert speichern, sodass dieser beim Neustart da weitermacht wo er aufgehört hat. Mein Code bisher ist:

#include <EEPROM.h>

#define buttonPin 2
#define yellowLed 5
#define redLed 4
#define greenLed 16

int x = 1;

void setup() {


  pinMode(buttonPin, INPUT);
  pinMode(yellowLed, OUTPUT);
  pinMode(redLed, OUTPUT);
  pinMode(greenLed, OUTPUT);
}

void loop() {
     Serial.println(x);
 if (digitalRead(buttonPin) == LOW)
  {
    EEPROM.read(0);
    x++;
    if (x == 2);
    {
      digitalWrite(yellowLed, LOW);
      EEPROM.write(0, x);
    } else if (x == 3) {
      digitalWrite(redLed, LOW);
      EEPROM.write(0, x);
    }

    else if (x == 4) {
      digitalWrite(greenLed, LOW);
      EEPROM.write(0, x);
    }

    else {
      digitalWrite(yellowLed, HIGH);
      digitalWrite(redLed, HIGH);
      digitalWrite(greenLed, HIGH);
      x = 2;
      EEPROM.write(0, x);
    }
  }
}

Bei meinem Code leuchtet kein einziges Lämpchen, was mache ich falsch?

poste einen Schaltplan.
Du prüfst auf low, also sollst du den Input Pin auf INPUT_PULLUP stellen damit du den internen Pullup stellst
Aktiviere die Serielle Schnittstelle und schreibe X raus damit du siehst warum es nicht klappt.
Schau dir die IDE Beispiele an, wie man einen Button ausliest. Da gibt es ein Beispiel wie man den Button debounced und eine LED einschaltet.
PS: Eine LED ist kein Lämpchen.

(deleted)

  1. Du mußt auf Zustandsänderung des Tasters kontrollieren. suche nach einem Button Toggle Sketch.
  2. Das EEPROM hat eine endliche Schreibanzahl. Wenn Du das EEPROM bei jedem loop() Durchgang schreibst ist das EEPROM neu. Um die Schreibvorgänge zu minimieren solltest Du nur neu schreiben wenn der Zustand anders ist.

Grüße Uwe

Also, ich bin jetzt soweit, dass der Code halbwegs funktioniert. Jedoch habe ich noch das Problem, dass während der Button gedrückt ist sich x permanent ändert. Wie stellt man ein, das pro Button drücken sich das nur einmal erhöht? Ich arbeite hier bei mit x++ in der Loop

florian317:
Also, ich bin jetzt soweit, dass der Code halbwegs funktioniert. Jedoch habe ich noch das Problem, dass während der Button gedrückt ist sich x permanent ändert. Wie stellt man ein, das pro Button drücken sich das nur einmal erhöht? Ich arbeite hier bei mit x++ in der Loop

Zeige deinen aktuellen Sketch, dann können wir sicher Tipps geben.

Du brauchst sicher eine Statusvarieble die den aktuellen Zustand speichert.

#include <EEPROM.h>

#define buttonPin 2
#define yellowLed 5
#define redLed 4
#define greenLed 16

int x = 0;
void setup() {
 Serial.begin(9600);

 pinMode(buttonPin, INPUT);
 pinMode(yellowLed, OUTPUT);
 pinMode(redLed, OUTPUT);
 pinMode(greenLed, OUTPUT);

}

void loop() {
 if (digitalRead(buttonPin) == LOW)
 {
   Serial.println(x);
   x++;
   if (x >= 3) {

     switch (x)
     {
       case 0:
         digitalWrite(yellowLed, LOW);
         digitalWrite(redLed, LOW);
         digitalWrite(greenLed, LOW);
         break;
       case 1:
         digitalWrite(yellowLed, HIGH);
         digitalWrite(redLed, LOW);
         digitalWrite(greenLed, LOW);
         break;
       case 2:
         digitalWrite(yellowLed, HIGH);
         digitalWrite(redLed, HIGH);
         digitalWrite(greenLed, LOW);
         break;
       case 3:
         digitalWrite(yellowLed, HIGH);
         digitalWrite(redLed, HIGH);
         digitalWrite(greenLed, HIGH);
         break;

       default:
         digitalWrite(yellowLed, LOW);
         digitalWrite(redLed, LOW);
         digitalWrite(greenLed, LOW);
         x = 0;
     }
   }
 }
}

florian317:
Also, ich bin jetzt soweit, dass der Code halbwegs funktioniert. Jedoch habe ich noch das Problem, dass während der Button gedrückt ist sich x permanent ändert. Wie stellt man ein, das pro Button drücken sich das nur einmal erhöht? Ich arbeite hier bei mit x++ in der Loop

Indem Du das in #3 vorgeschlagenen machst.Grüße Uwe

Aktuell macht dein Sketch genau das was du programmiert hast und du solltest das berücksichtigen, was Uwe geschrieben hat.

if (digitalRead(buttonPin) == LOW)
{

Hier fehlt ein Entprellen und eine Flankenerkennung.

if (x >= 3)

Redundant!
Oder sogar logisch falsch.
Wird schon vom default case erledigt.

digitalWrite(yellowLed, LOW);
digitalWrite(redLed, LOW);
digitalWrite(greenLed, LOW);

Redundant,