Schalter und dimmen via Poti

Hallo Community,

ich bin neu hier und komme nicht weiter...

Ich möchte eine LED(6) mit einen Taster(2) Ein/Aus schlaten und mit einem Poti(A0) dimmen.

Bekomme das bis jetzt aber nur so umgesetzt, das ich nur dimmen kann, wenn der Taster gedrückt ist...

//  Poti bzw. dimmen funktioniert nur bei gedruecktem Taster   

int ReglerWert;
int REGLER = A0;
int LED = 6;
int buttonPin = 2;
int buttonState = 0;

void setup() 
 {
 pinMode(LED, OUTPUT);
 pinMode(buttonPin, INPUT);
 }


void loop() 
 {
 buttonState = digitalRead(buttonPin);
 ReglerWert = analogRead(REGLER);
 
   if (buttonState == HIGH) {
   analogWrite (LED, map(ReglerWert, 0, 1023, 0, 255));    //map ->; Umwandlung des gelesenen Wertes von 0 bis 1023 
                                                           //(analoger Sensorwert) auf 0 bis 255
   }
   else {
   analogWrite(LED, LOW);
   }
 }

Kann mir da jemand weiter helfen?

Bitte deinen Sketch in Code-Tags posten.
Schaltfläche </> oben links im Editorfenster verwenden, dann ist der Sketch von allen besser zu lesen.

Du musst für deinen Taster eine Statusvariable verwenden, in der der Zustand des Tasters gespeichert wird, dann wird auch das Dimmen durchgeführt.
Danach die Variable wieder löschen.

Hallo,

Nun ja du hast es ja auch so programmiert. Was willst Du ?

mit dem Taster etwas einschalten , wenn ein ist kannst Du dimmen und die LED leuchtete. wenn du noch mal den Taster drückst soll es aus gehern ?

Dazu benötigst Du eine Status Variable die mit jedem Tasterdruck toggelt. Ebenso musst Du dann die Flanke des Tasters verarbeiten und erkennen jetz ist er gedrückt, beim letzten Umlauf war er noch nicht gedrückt , also die Änderung erkennen. Zusätzlich musst Du den Taster noch entprellen.

Fang erst mal etwas einfacher an , nimm 2 Taster einen für ein und einen für aus.

Heinz

j0j0:
Ich möchte eine LED(6) mit einen Taster(2) Ein/Aus schlaten und mit einem Poti(A0) dimmen.

Du benötigst die Tasterzustandsveränderung (Signalflanke), weshalb der prellende Taster entprellt werden muß. Dazu kannst Du beispielsweise Bounce2 verwenden. Tasterauswertung und LED-Anzeige werden durch das Fähnchen ledState verbunden.

Die Ausgabe auf dem seriellen Monitor ist fakultativ.

#include <Bounce2.h>
Bounce taster = Bounce();
const byte REGLER_PIN = A0;
const byte LED_PIN = 6;
const byte BUTTON_PIN = 2;
const uint32_t ENTPRELLZEIT = 30;

void setup()
{
  Serial.begin(9600);
  while (!Serial);
  Serial.println("\nAnfang");
  pinMode(BUTTON_PIN, INPUT_PULLUP); // gedrückt gleich LOW
  taster.attach(BUTTON_PIN);
  taster.interval(ENTPRELLZEIT);
}

void loop()
{
  taster.update();
  uint32_t jetzt = millis();
  static uint32_t anzeigeMillis = 0;
  const uint32_t ANZEIGEINTERVALL = 500;
  static bool ledState;
  uint16_t potiWert = analogRead(REGLER_PIN);

  if (jetzt - anzeigeMillis >= ANZEIGEINTERVALL)
  {
    anzeigeMillis = jetzt;
    Serial.print("Potiwert: ");
    Serial.println(potiWert);
  }

  if ( taster.fell() )
  {
    ledState = !ledState;
    Serial.print("Analogwert: ");
    Serial.println(map(potiWert, 0, 1023, 0, 255));
  }

  if (ledState == HIGH) {
    analogWrite (LED_PIN, map(potiWert, 0, 1023, 0, 255));    //map ->; Umwandlung des gelesenen Wertes von 0 bis 1023
  }
  else {
    analogWrite(LED_PIN, 0);
  }
}

Danke Euch für die Hilfe.
Das mit dem variablen Status war mir klar, habs in meinen Versuchen aber nicht hin bekommen

Hallo Community,

jetzt hänge ich beim nächsten Problem… und finde den Fehler nicht.

und zwar möchte ich mit einem Encoder (Bereich 0-5)
ein LedArray (0-5) ansteuern.

Auf dem Seriellen Monitor sehe ich das der Encoder tut was er soll.

Wenn ich dann im setup die mit for einfüge, funktioniert die Serielle Ausgabe nicht mehr

und die Leds bleiben dunkel. :frowning:

Hier hänge ich fest und hoffe auf Eure Hilfe.

#include <RotaryEncoder.h>

#define ROTARYSTEPS 1
#define ROTARYMIN 0
#define ROTARYMAX 10
RotaryEncoder encoder(2, 3);    // Grove RotaryEncoder v1.2
int lastPos = -1;               // Last known rotary position.
// --------
int ledPins[] = {3,5,6,9,10,11};    // Array mit ledPins (Output)
int ledState = LOW;                 // Starte mit Led AUS


void setup()
{ Serial.begin(57600);
  Serial.println("! Hello World !");
  encoder.setPosition(0 / ROTARYSTEPS); // starte mit value 10
// --------  
//******  
  for(int index = 0; index < 6; index++)          // Array index
  { pinMode(ledPins[index], OUTPUT);              // LED als Ausgang deklarien
    digitalWrite(ledPins[index],ledState);}       // Startbefehl int ledState = LOW; 
//******
  
}// setup()


void loop()
{
  encoder.tick();  
  int newPos = encoder.getPosition() * ROTARYSTEPS;   // get current phys. pos. and calc the logical pos.

  if (newPos < ROTARYMIN) {
    encoder.setPosition(ROTARYMIN / ROTARYSTEPS);
    newPos = ROTARYMIN;
  }// if
  else if (newPos > ROTARYMAX) {
    encoder.setPosition(ROTARYMAX / ROTARYSTEPS);
    newPos = ROTARYMAX;
  }// else if

  if (lastPos != newPos) {
    Serial.print(newPos);
    Serial.println();
    lastPos = newPos;
  }// if
// --------
switch (newPos)                  // this Switch case is used to choose which option to follow.
  {   case 0:                     // Above we mapped it into 7 selections, 0-6
        for(int index = 0; index < 6; index++)
          digitalWrite(ledPins[index], LOW);
          digitalWrite(ledPins[0], HIGH);
        break;                                  // break away from the code and recheck the variable
  }// switch
  delay(1);   // this will help the stability of the readings
  
}// The End

Vielen Dank schon mal und einen schönen Sonntag noch

Grüße j0j0

Es gibt eine Überschneidung:

RotaryEncoder encoder(2, 3);
int ledPins = {3, 5, 6, 9, 10, 11};

(deleted)

switch (newPos)                  // this Switch case is used to choose which option to follow.
  {   case 0:                     // Above we mapped it into 7 selections, 0-6
        for(int index = 0; index < 6; index++)
          digitalWrite(ledPins[index], LOW);
          digitalWrite(ledPins[0], HIGH);
        break;                                  // break away from the code and recheck the variable
  }// switch

Zu was brauchst Du hier switch-case?

Du setzt die Pins nur auf LOW und Pin 3 auf HIGH. Aber nie anders. Wieso sollen sich die LEDS ändern?
Grüße Uwe