Problem bei Ansteuerung/Dimmen von Led- Leiste

Hi Forum :wave:
Ich bin blutiger Anfänger was Arduino angeht und befinde mich gerade bei einem meiner ersten Projekte. Der Plan ist es, zwei Leds eines 12v Led- Streifens mit zwei verschiedenen Knöpfen ein und aus zu schalten (bei Knopfdruck wird die jeweilige Farbe eingeschaltet, bei erneutem Knopfdruck wird sie wieder ausgeschaltet). Dann soll die Helligkeit noch von einem Potentiometer gesteuert werden können.
Das hat auch einzeln alles recht gut geklappt, jedoch in Kombination nicht so wirklich. Ich hab jetzt schon einige verschiedene Kontrollstrukturen ausprobiert, den Code für das Potentiometer in andere Schleifen getan usw.
Die Probleme waren dann immer unterschiedlich, derzeit ist es so das das Programm in der while- Schleife stecken bleibt und die Knöpfe nicht mehr funktionieren.

Hier ist der Code:

const int Button1 = 7; // Pins für die Knöpfe
const int Button2 = 8;
const int wwPin = 6;   // Pins für die Leds
const int wPin = 5;
int Pot = A2; //Pin für Potentiometer
int VarPot;

// Variablen zur Speicherung des aktuellen und vorherigen Zustands der Knöpfe
int button1State = 0;
int lastButton1State = 0;
int button2State = 0;
int lastButton2State = 0;

// Variablen zur Speicherung des Zustands der Led (ein-/ausgeschaltet)
int wwState = LOW;
int wState = LOW;

void setup() {
  // Initialisierung der Pins
  pinMode(wwPin, OUTPUT);
  pinMode(wPin, OUTPUT);
  pinMode(Button1, INPUT_PULLUP);
  pinMode(Button2, INPUT_PULLUP);
  pinMode(Pot, INPUT_PULLUP);
}

void loop() {
 //Potentiometer- Code für warmweiße Led
 while(wwState == HIGH) {
 VarPot = analogRead(Pot); //lese Potentiometer- Wert
 VarPot = map(VarPot, 0, 1023, 0, 255);//weise Werte zu
 analogWrite(wwPin, VarPot); //sende PWM an Pin
 }

 //Potentiometer- Code für weiße Led
 while(wwState == HIGH) {
 VarPot = analogRead(Pot); //lese Potentiometer- Wert
 VarPot = map(VarPot, 0, 1023, 0, 255);//weise Werte zu
 analogWrite(wwPin, VarPot); //sende PWM an Pin
 }

//Code für Button 1
  // Lesen des aktuellen Zustands des Tasters
  button1State = digitalRead(Button1);

  // Überprüfen, ob der Taster gedrückt wurde
  if (button1State != lastButton1State) {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button1State = digitalRead(Button1);

    // Wenn der Taster gedrückt wurde
    if (button1State == HIGH) {
      // Ändern des Zustands der LED
      if (wwState == LOW) {
        wwState = HIGH;
      } else {
        wwState = LOW;
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton1State = button1State;
  

//Code für Button 2
  // Lesen des aktuellen Zustands des Tasters
  button2State = digitalRead(Button2);

  // Überprüfen, ob der Taster gedrückt wurde
  if (button2State != lastButton2State) {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button2State = digitalRead(Button2);

    // Wenn der Taster gedrückt wurde
    if (button2State == HIGH) {
      // Ändern des Zustands der LED
      if (wState == LOW) {
        wState = HIGH;
      } else {
        wState = LOW;
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton2State = button2State;
}

Am Ende soll auch noch der Zustand der Leds (ein/aus) gespeichert werden damit wenn der Arduino eingeschaltet wird, nur die Leds leuchten die auch schon vorher geleuchtet haben.

Schon im Vorraus Danke fürs antworten :smiley:

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

Das ist Sinn der whileSchleifen - die bleiben solange am laufen, bis die Bedingung nicht mer erfüllt ist.

Man könnte das mit einem Tastendruck lösen.
Oder auf while gänzlich verzichten.
Im Übrigen hast Du schön fein säuberlich C&P gemacht.

:slight_smile:

Wenn man das ganze ohne button machen willst, kannst Du immer nur die LED steuern, die an ist.
Sind beide an, steuerst Du eben beide.
Sollen die eine unabhängige Helligkeit haben, müsste für jede LED ein Zwischenspeichervariable her.

Erstmal Danke fürs schnelle Antworten :slight_smile:
Das das Potentiometer die Helligkeit von allen Leds steuert die an sind ist mir bewusst und das ist auch okay so weil die Helligkeit einheitlich gesteuert werden soll.

Auf die while- scheife kann ich auch gerne verzichten, das war halt eben nur das letzte was ich ausprobiert habe. Davor habe ich auch schon den Code für das Pot in die if- schleifen der beiden Buttons getan, aber dann konnte man pro Knopfdruck nur einmal kurz die Helligkeit ändern da die Schleife nur bei erneutem Knopfdruck durchlaufen wurde.

Was müsste ich denn in den Code einbauen/ verändern damit er so wie beschrieben funktioniert?

Huch.
Ich wollte gar nicht mehr reinschauen, weil der schon als gelöst steht....
Ohne Speichern im EEprom als Schnellschuß:

const int Button1 = 7; // Pins für die Knöpfe
const int Button2 = 8;
const int wwPin = 6;   // Pins für die Leds
const int wPin = 5;
int Pot = A2; //Pin für Potentiometer
int VarPot;

// Variablen zur Speicherung des aktuellen und vorherigen Zustands der Knöpfe
int button1State = 0;
int lastButton1State = 0;
int button2State = 0;
int lastButton2State = 0;

// Variablen zur Speicherung des Zustands der Led (ein-/ausgeschaltet)
int wwState = LOW;
int wState = LOW;

void setup()
{
  // Initialisierung der Pins
  pinMode(wwPin, OUTPUT);
  pinMode(wPin, OUTPUT);
  pinMode(Button1, INPUT_PULLUP);
  pinMode(Button2, INPUT_PULLUP);
  pinMode(Pot, INPUT_PULLUP);
}

void loop()
{
  VarPot = analogRead(Pot); //lese Potentiometer- Wert
  VarPot = map(VarPot, 0, 1023, 0, 255);//weise Werte zu
  if (wwState)
  { analogWrite(wwPin, VarPot); } //sende PWM an Pin
  if (wState)
  { analogWrite(wPin, VarPot); } //sende PWM an Pin
  //Code für Button 1
  // Lesen des aktuellen Zustands des Tasters
  button1State = digitalRead(Button1);
  // Überprüfen, ob der Taster gedrückt wurde
  if (button1State != lastButton1State)
  {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button1State = digitalRead(Button1);
    // Wenn der Taster gedrückt wurde
    if (button1State == HIGH)
    {
      // Ändern des Zustands der LED
      if (wwState == LOW)
      {
        wwState = HIGH;
      }
      else
      {
        wwState = LOW;
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton1State = button1State;
  //Code für Button 2
  // Lesen des aktuellen Zustands des Tasters
  button2State = digitalRead(Button2);
  // Überprüfen, ob der Taster gedrückt wurde
  if (button2State != lastButton2State)
  {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button2State = digitalRead(Button2);
    // Wenn der Taster gedrückt wurde
    if (button2State == HIGH)
    {
      // Ändern des Zustands der LED
      if (wState == LOW)
      {
        wState = HIGH;
      }
      else
      {
        wState = LOW;
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton2State = button2State;
}

Weder PWM Ausgänge noch analoge Eingänge müssen mit pinMode() initialisiert werden.

Wenn Du mit einem Taster einen Schalter machen willst dann funktioniert das nie mit While Schleifen.

Grüße Uwe

Ok Danke :+1:
Ich habe den Code jetzt fertig und falls den jemand anderes benutzen will schicke ich den nochmal rein:

#include <EEPROM.h>

const int Button1 = 7; // Pins für die Knöpfe
const int Button2 = 8;
const int wwPin = 6;   // Pins für die Leds
const int wPin = 5;
int Pot = A2; //Pin für Potentiometer
int VarPot;

// Variablen zur Speicherung des aktuellen und vorherigen Zustands der Knöpfe
int button1State = 0;
int lastButton1State = 0;
int button2State = 0;
int lastButton2State = 0;

// Variablen zur Speicherung des Zustands der Led (ein-/ausgeschaltet)
int wwState;
int wState;
int wwSave;
int wSave;
void setup() {
  // Initialisierung der Pins
  pinMode(Button1, INPUT_PULLUP);
  pinMode(Button2, INPUT_PULLUP);

  wwSave = EEPROM.read(1);
  wSave = EEPROM.read(2);
  
  if(EEPROM.read(1) == 0) {
    wwState = HIGH;
  } else if(EEPROM.read(1) == 1) {
    wwState = LOW;
  }

  if(EEPROM.read(2) == 0) {
    wState = HIGH;
  } else if(EEPROM.read(2) == 1) {
    wState = LOW;
  }
}

void loop() {
  VarPot = analogRead(Pot); //lese Potentiometer- Wert
  VarPot = map(VarPot, 0, 1023, 0, 255);//weise Werte zu
  if (wwState) {
    analogWrite(wwPin, VarPot); //sende PWM an Pin
    } else  if(wwState == LOW) {
      analogWrite(wwPin, LOW);
    }
  
  if (wState) {
    analogWrite(wPin, VarPot); //sende PWM an Pin
  } else if(wState == LOW) {
    analogWrite(wPin, LOW);
  }
  //Code für Button 1
  // Lesen des aktuellen Zustands des Tasters
  button1State = digitalRead(Button1);
  // Überprüfen, ob der Taster gedrückt wurde
  if (button1State != lastButton1State)
  {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button1State = digitalRead(Button1);
    // Wenn der Taster gedrückt wurde
    if (button1State == HIGH)
    {
      // Ändern des Zustands der LED
      if (wwState == LOW)
      {
        wwState = HIGH;
        EEPROM.update(1, 1);
      }
      else
      {
        wwState = LOW;
        EEPROM.update(1, 0);
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton1State = button1State;
  //Code für Button 2
  // Lesen des aktuellen Zustands des Tasters
  button2State = digitalRead(Button2);
  // Überprüfen, ob der Taster gedrückt wurde
  if (button2State != lastButton2State)
  {
    // Verzögerung zur Stabilisierung des Tasterzustands
    delay(50);
    // Überprüfen, ob der Taster immer noch gedrückt ist (kein Flackern)
    button2State = digitalRead(Button2);
    // Wenn der Taster gedrückt wurde
    if (button2State == HIGH)
    {
      // Ändern des Zustands der LED
      if (wState == LOW)
      {
        wState = HIGH;
        EEPROM.update(2, 1);
      }
      else
      {
        wState = LOW;
        EEPROM.update(2, 0);
      }
    }
  }
  // Speichern des aktuellen Tasterzustands für den nächsten Durchlauf
  lastButton2State = button2State;
}

Da ist jetzt auch schon die EEPROM- Bibliothek drin damit die zuletzt eingestellte Farbkombination gespeichert wird. Da ist noch das Problem das die entgegengesetzte Led kurz aufflackert bevor die zuletzt verwendete anfängt zu leuchten, aber das ist auch nicht so schlimm und sonst funktioniert alles.