Hilfe, 3 Taster, 1 LED ein/aus und Dimmen

hallo Leute, bin neu in den Thema Arduino programmieren!
Mein vorhaben ist, mit 3 Tastern eine LED ein/aus zuschalten, und zu dimmen.
Also,
Taster1--> LED ein auf 5%
Taster2--> LED runter dimmen
Taster3--> LED hoch dimmen
aber wenn Taster1 nicht gedrückt wurde, also aus ist, dan darf auch nicht gedimmt werden.
ja ich weiß, die Programmierung ist nicht die Beste,.....aber naja

int brightness = 5;
int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin


// the following variables are unsigned longs because the time, measured in
// milliseconds, will quickly become a bigger number than can be stored in an int.
unsigned long lastDebounceTime = 0;  // the last time the output pin was toggled
unsigned long debounceDelay = 50;    // the debounce time; increase if the output flickers


void setup() {
 pinMode(9,OUTPUT);        // Set pin 9 to be in output mode
 pinMode(6,OUTPUT);        // Set pin 6 to be in output mode
 pinMode(2,INPUT);   // Set pin 7 to be in input mode EIN/AUS
 pinMode(3,INPUT);   // Set pin 3 to be in input mode REDUCE Brightness
 pinMode(4,INPUT);   // Set pin 8 to be in input mode INCREASE Brightness
 
 digitalWrite(2, lastButtonState);



}

void loop() {

 // read the state of the switch into a local variable:
 int reading = digitalRead(2);

 // check to see if you just pressed the button
 // (i.e. the input went from LOW to HIGH), and you've waited long enough
 // since the last press to ignore any noise:

 // If the switch changed, due to noise or pressing:
 if (reading != lastButtonState) {
   // reset the debouncing timer
   lastDebounceTime = millis();
 }

 if ((millis() - lastDebounceTime) > debounceDelay) {
   // whatever the reading is at, it's been there for longer than the debounce
   // delay, so take it as the actual current state:

   // if the button state has changed:
   if (reading != buttonState) {
     buttonState = reading;

     // only toggle the LED if the new button state is HIGH
     if (buttonState == HIGH) {
       ledState = !ledState;
     }
   }
 }

 // set the LED:
 digitalWrite(2, lastButtonState);




 if(lastButtonState && digitalRead(3) == HIGH) brightness--;         // If button on pin 3 is pressed, reduce brightness

   if (brightness < 5) brightness = 5;          // Don't let brightness drop below 10

   else if(lastButtonState && digitalRead(4) == HIGH) brightness++;   // If button on pin 4 is pressed, increase brightness

   brightness = constrain(brightness,5,255);  // Don't let brightness get above 255

 analogWrite(9, brightness);              // Set pin 9 to the new brightness level
 analogWrite(6, brightness);             // Set pin 6 to the new brightness level

 delay(20);
}

aber wenn Taster1 nicht gedrückt wurde, also aus ist, dan darf auch nicht gedimmt werden.

merk dir in einer Variable, dass du Taster 1 gedrückt hast. Bei den anderen Abfragen fragst du zusätzlich auf diese Variable ab.

Deine Logik hat noch einen Fehler... Wodurch schaltest du bewusst aus? Dadurch dass du runter auf 0 dimmst, das fängst aber ab ...?

Oder meinst du dass du Taste 1 UND eine weitere Taste gleichzeitig drückst?

Außerdem BITTE ... gib deinen Code in Code-Tags ... das kannst du auch noch nachträglich tun. Als Anfänger soll man das Forum-How to lesen. Ganz sicher.

Hallo,

noiasca hat es ja schon geschrieben:
Setze deinen Sketch bitte in Code-Tags.

Verwende dazu die Schaltfläche </> oben links im Editorfenster.
Dazu den Sketch markieren und die Schaltfläche klicken, oder [ code] davor und [ / code] dahinter ohne Leerzeichen.
Oder
im IDE-Fenster rechte Maustaste und für "Forum kopieren klicken", danach hier einfügen.

Das kannst du in deinem Startbeitrag noch nachträglich machen.

Damit wird dieser für alle besser lesbar.

Und ganz wichtig: How to lesen !

Hallo
und lösche alle überflüssigen Leerzeilen und spendiere ein paar Kommentare und/oder verwende beschreibene Variablenamen, dann wir das Ganze lesbarer :slight_smile:

seehafen89:
Mein vorhaben ist, mit 3 Tastern eine LED ein/aus zuschalten, und zu dimmen.

Moin,

int ledState = HIGH;         // the current state of the output pin
int buttonState;             // the current reading from the input pin
int lastButtonState = LOW;   // the previous reading from the input pin

Das sollen bool werden.

  pinMode (2, INPUT); // Set pin 7 to be in input mode EIN/AUS
  pinMode (3, INPUT); // Set pin 3 to be in input mode REDUCE Brightness
  pinMode (4, INPUT); // Set pin 8 to be in input mode INCREASE Brightness
  digitalWrite (2, lastButtonState);

Hast Du extern Widerstände dran?
Nach GND oder nach V+?
Was soll das digitalWrite da bewirken?

So, wenn ich jetzt Deine Einleitung und den ersten Codeteil lese, dann möchtest Du mit dem ersten Taster das Ding einschalten. Der Startwert ergibt sich dann aus int brightness = 5;
Wird hochgedimmt, ist alles klar, wird runter gedimmt und wird der Wert kleiner als 5 soll ausgehen.
Solange bis wieder Taste 1 gedrückt wird.

Richtig verstanden?

Taster1 soll gesperrt sein, solange am Ausgang ein Signal anliegt, oder darf Taster1 gedrückt werden, um den Ausgangszustand wiederherzustellen - also runterzudimmen auf Einschaltwert?
Du schreibst auf zwei Output-PIN. Hat das eine Bewandnis?

Erklär mal genauer Deinen Plan.

hallo und danke für eure Antworten.

Thema Taster 1:
Dieser soll die LED(`s) einschalten auf 5%.
UND egal wie hell diese ist, auch komplett ausschalten.

Taster 2--> nur runter dimmen, 5% ist limit. NICHT komplett aus.

Taster 3--> nur hoch dimmen, 100% ist limit.

ich werd mich noch dran machen eine Struktur reinzubekommen.

seehafen89:
ich werd mich noch dran machen eine Struktur reinzubekommen.

Wenn Du Deinen Code in entsprechende Tags gepackt hast.
Bitte!

dann ist es ja noch einfacher:

Taster 1 && brightness == 0 dann brightness = 5
Taster 1 && brightness > 0 dann brightness = 0

Hallo
nach dem EVA-Prinzip fängst du am Besten, für die Eingabe, mit der Programmierung der Schaltfunktion für die LED an.

noiasca:
dann ist es ja noch einfacher:

Taster 1 && brightness == 0 dann brightness = 5
Taster 1 && brightness > 0 dann brightness = 0

Nö, nicht unter die 5%
"Taster 2--> nur runter dimmen, 5% ist limit. NICHT komplett aus. "

Taster 1 soll also nur eine Funktion haben, wenn der Wert größer 5 ist.

Franz54:
Taster 1 soll also nur eine Funktion haben, wenn der Wert größer 5 ist.

Nö.

Thema Taster 1:
Dieser soll die LED(`s) einschalten auf 5%.
UND egal wie hell diese ist, auch komplett ausschalten.

Taster 2--> nur runter dimmen, 5% ist limit. NICHT komplett aus.

Taster 3--> nur hoch dimmen, 100% ist limit.

Taster 1 gedrückt - wenn 0, mache 5 || wenn != 0 mache 0
Taster 2 gedrückt - wenn >=5 && <= max mache ++
Taster 3 gedrückt - wenn <=max && >=5 mache --

Achja. Taster 1 schaltet ein/aus. Habe ich mit dem T2 verwechselt.

Weil heute Feiertag ist mal kurz was hingetackert.
Nicht schön, aber kompiliert ohne Fehler.

// Forumsketch - 3 Tasten steuern LED
// 
const int startHelligkeit = 5;
const int maxHelligkeit = 255;
const int aus = 0;
unsigned long debounceDelay = 50;
int Helligkeit = 0;

const byte btn_OnOff = 2;
const byte btn_Down = 3;
const byte btn_UP = 4;
const byte out_9 = 9;
const byte out_6 = 6;

void setup() {
  pinMode(out_9, OUTPUT);
  pinMode(out_6, OUTPUT);
  Ausgabe(aus);
  pinMode(btn_OnOff, INPUT_PULLUP);
  pinMode(btn_Down, INPUT_PULLUP);
  pinMode(btn_UP, INPUT_PULLUP);
}

void Ausgabe(const int staerke) {
  analogWrite(out_9, staerke);
  analogWrite(out_6, staerke);
}

void einaus() {
  static unsigned long lastmillis = millis();
  static bool laststate;
  if (millis() - lastmillis > debounceDelay) {
    if ((!digitalRead(btn_OnOff)) != laststate) {
      if (Helligkeit != aus) {
        Ausgabe(aus);
      }
      else {
        Ausgabe(startHelligkeit);
      }
      laststate = !laststate;
    }
  }
}

void heller() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_UP)) {
      if (Helligkeit >= startHelligkeit && Helligkeit < maxHelligkeit) {
        Helligkeit++;
        Ausgabe(Helligkeit);
      }
    }
  }
}

void dunkler() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_Down)) {
      if (Helligkeit > startHelligkeit) {
        Helligkeit--;
        Ausgabe(Helligkeit);
      }
    }
  }
}


void loop() {
  einaus();
  heller();
  dunkler();
}

@TO: unbedingt Grundlagen lernen, was digitalRead und digitalWrite macht.
Du kannst einen Eingang nicht mir Write abfragen!

[edit meinte addieren geht nicht mit -- :wink: ]

Weil heute Feiertag ist mal kurz was hingetackert.
Nicht schön, aber kompiliert ohne Fehler.

Code: [Select]

// Forumsketch - 3 Tasten steuern LED

// 
const int startHelligkeit = 5;
const int maxHelligkeit = 255;
const int aus = 0;
unsigned long debounceDelay = 50;
int Helligkeit = 0;

const byte btn_OnOff = 2;
const byte btn_Down = 3;
const byte btn_UP = 4;
const byte out_9 = 9;
const byte out_6 = 6;

void setup() {
  pinMode(out_9, OUTPUT);
  pinMode(out_6, OUTPUT);
  Ausgabe(aus);
  pinMode(btn_OnOff, INPUT_PULLUP);
  pinMode(btn_Down, INPUT_PULLUP);
  pinMode(btn_UP, INPUT_PULLUP);
}

void Ausgabe(const int staerke) {
  analogWrite(out_9, staerke);
  analogWrite(out_6, staerke);
}

void einaus() {
  static unsigned long lastmillis = millis();
  static bool laststate;
  if (millis() - lastmillis > debounceDelay) {
    if ((!digitalRead(btn_OnOff)) != laststate) {
      if (Helligkeit != aus) {
        Ausgabe(aus);
      }
      else {
        Ausgabe(startHelligkeit);
      }
      laststate = !laststate;
    }
  }
}

void heller() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_UP)) {
      if (Helligkeit >= startHelligkeit && Helligkeit < maxHelligkeit) {
        Helligkeit++;
        Ausgabe(Helligkeit);
      }
    }
  }
}

void dunkler() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_Down)) {
      if (Helligkeit > startHelligkeit) {
        Helligkeit--;
        Ausgabe(Helligkeit);
      }
    }
  }
}

void loop() {
  einaus();
  heller();
  dunkler();
}





@TO: unbedingt Grundlagen lernen, was digitalRead und digitalWrite macht.
Du kannst einen Eingang nicht mir Write abfragen!

[edit meinte addieren geht nicht mit -- ![;)](https://forum.arduino.cc/Smileys/arduino/wink.gif) ]

DANKE für deine Mühe,
hab versucht, bei den Sketch durchzublicken.
habs probegesteckt, aber leider leuchten die beiden Led´s dauerhaft, und es kann auch nicht gedimmt werden. es wurden Pulldown Widerstände montiert.

seehafen89:
DANKE für deine Mühe,
hab versucht, bei den Sketch durchzublicken.
habs probegesteckt, aber leider leuchten die beiden Led´s dauerhaft, und es kann auch nicht gedimmt werden. es wurden Pulldown Widerstände montiert.

Hättest Du meine Fragen beantwortet, hättest Du jetzt was Fertiges.
Hast Du nicht.
Nun sag ich mal, ein wenig Selbststudium der verwendeten Variablen und Codeauschnitte hilft Dir vermutlich mehr.
Alles, was in der IDE farblich nicht schwarz ist, kennt die IDE.
Also kannst Du in der Referenz ggfls. danach suchen und da heraus lesen, was verändert werden muss.
Es gibt mindestens zwei lösungen.
Entweder Deine Hardware oder die vorgestellte Software.

Ich lese aber heraus, das die bisher genau das macht, was sie soll. :wink:

my_xy_projekt:
Hast Du extern Widerstände dran?
Nach GND oder nach V+?
Was soll das digitalWrite da bewirken?

Taster1 soll gesperrt sein, solange am Ausgang ein Signal anliegt, oder darf Taster1 gedrückt werden, um den Ausgangszustand wiederherzustellen - also runterzudimmen auf Einschaltwert?
Du schreibst auf zwei Output-PIN. Hat das eine Bewandnis?

Erklär mal genauer Deinen Plan.

Widerstände sind für die Taster auf GND für Pulldown.
Taster1 soll/darf nicht gesperrt sein, dieser darf immer aus/einschalten. Beim Einschalten jedoch immer auf 5%.
2 outputins,.....naja, ist nicht notwenig, aber naja. da reicht zum probieren auch eine Led.
also der Plan soll sein, eine kleine Nachttischlampe zu bauen, mit 3 kapazitiven touch tastern unter eine 4mm "dünnen" plexi scheibe. diese soll dan eine led (oder neopixelring) ansteuern!

seehafen89:
Widerstände sind für die Taster auf GND für Pulldown.

Das ist Unsinnig! Und ja, ich weiss das sowas auch in Büchern steht.
GND ist das Bezugspotential und fest definiert. Alles andere kann irgendwas sein.
Die Reaktion auf den Tastendruck muss auf Basis des GND-Potential erfolgen und nicht auf irgendwas.

Und nu mal in den Code geschaut, passe die EingangsPIN hardwareseitig an die Software an und - voila!

Das ist Unsinnig

Auch wenn man meist besser Pullup-Widerstände verwendet, solltest du Pulldown nicht so abwerten. ĹOW und HIGH haben beide einen Toleranz-Bereich. Dazwischen einen "Undefiniert" - Bereich und gern auch eine Hysterese.
false als "nicht gedrückt" zu interpretieren, hilft auch gelegentlich.

nach ein paar stunden, aber ich bin irgendwie zu doof dafür,...

// Forumsketch - 3 Tasten steuern LED
// 
const int startHelligkeit = 5;
const int maxHelligkeit = 255;
const int aus = 0;
unsigned long debounceDelay = 50;
int Helligkeit = 0;

const byte btn_OnOff = 2;
const byte btn_Down = 4;
const byte btn_UP = 6;
const byte out_9 = 9;
const byte out_10 = 10;

void setup() {
  pinMode(out_9, OUTPUT);
  pinMode(out_10, OUTPUT);
  Ausgabe(aus);
  pinMode(btn_OnOff, LOW);
  pinMode(btn_Down, LOW);
  pinMode(btn_UP, LOW);
}

void Ausgabe(const int Helligkeit) {
  analogWrite(out_9, Helligkeit);
  analogWrite(out_10, Helligkeit);
}

void einaus() {
  static unsigned long lastmillis = millis();
  static bool laststate;
  if (millis() - lastmillis > debounceDelay) {
    if ((!digitalRead(btn_OnOff)) != laststate) {
      if (Helligkeit != aus) {
        Ausgabe(aus);
      }
      else {
//        Ausgabe(startHelligkeit);
         analogWrite(out_9, startHelligkeit);
         analogWrite(out_10, startHelligkeit);
      }
      laststate = !laststate;
    }
  }
}

void heller() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_UP)) {
      if (Helligkeit >= startHelligkeit && Helligkeit < maxHelligkeit) {
        Helligkeit++;
//        Ausgabe(Helligkeit);
         analogWrite(out_9, Helligkeit);
         analogWrite(out_10, Helligkeit);
      }
    }
  }
}

void dunkler() {
  static unsigned long lastmillis = millis();
  if (millis() - lastmillis > debounceDelay * 3) {
    if (!digitalRead(btn_Down)) {
      if (Helligkeit > startHelligkeit) {
        Helligkeit--;
//       Ausgabe(Helligkeit);
         analogWrite(out_9, Helligkeit);
         analogWrite(out_10, Helligkeit);
      }
    }
  }
}


void loop() {
  einaus();
  heller();
  dunkler();
}

seehafen89:
nach ein paar stunden, aber ich bin irgendwie zu doof dafür,...

Nicht die Flinte ins Korn schmeissen!
Es wird.
Du hast Dich mit beschäftigt.

Also:

  pinMode(btn_OnOff, LOW);

pinMode(btn_Down, LOW);
  pinMode(btn_UP, LOW);

Leseempfehlung:

Und dann wieder zurück auf Anfang.

So wie ich es schon hatte:

Und nu mal in den Code geschaut, passe die EingangsPIN hardwareseitig an die Software an und - voila!