Arduino LED-Helligkeitsumschaltung über Taster

Ich versuche, mit einem Arduino Uno zwischen 4 verschiedenen Helligkeiten einer LED umzuschalten. Ich habe analogWrite und nicht digitalWrite mit PWM verwendet. Das Problem, mit dem ich konfrontiert bin, ist, dass die Helligkeit überhaupt nicht wechselt, wenn der Taster gedrückt wird. Hier ist mein Code:

#define led 11 //assign pin 11 to LED
#define BUTTON 7 //assign pin 7 to pushbutton
int val=0; //val used to check current status of pushbutton later in the program
int old_val=0; //old_val to check previous status
int state=0; //state to check button presses

void setup()
{
  pinMode(led,OUTPUT);
  pinMode(BUTTON,INPUT);
}

void loop()
{
  val=digitalRead(BUTTON); //check status of pushbutton
  if((val==HIGH)&&(old_val==LOW)) //button pressed
  {
    state++; //increment state
    delay(10); //debounce consideration
    if(state>4) //want only 4 brightness options
    {
      state=1;
      delay(10);
    }
  }
  old_val=val;
  if(state==1)
  {
    analogWrite(led,0); //0 brightness
  }
  else if(state==2)
  {
    analogWrite(led,75);
  }
  else if(state==3)
  {
    analogWrite(led,150);
  }
  else if(state==4)
  {
    analogWrite(led,255);
  }
}

Wie kann ich dieses Problem lösen?

Schaltet Ihr Taster nach dem Loslassen automatisch zurück?
Ja tut es. Anstatt zur nächsten Helligkeit zu wechseln, geht es zurück zur gleichen Helligkeit.
#define led 11 // Pin 11 der LED zuweisen, dies ist falsch, solange Sie analog verwenden, dies kann von 0-5 sein.
Ich dachte, die Pins 1 bis 5 dienen nur als analoge Eingänge. Bist du dir sicher?
Ja, ich bin sicher, es ist für die Ein- und Ausgabe.
Sie können Pin 11 für PWM verwenden! Tatsächlich können Sie jeden Pin, der mit einem "~" für PWM gekennzeichnet ist, auf dem Arduino Uno verwenden. Das bestätigt auch die Referenzseite zu AnalogWrite ( arduino.cc/de/Reference/AnalogWrite ).

Antworten (2)

Obwohl Ihr Code einige Schwächen aufweist, sollte er nicht das von Ihnen beschriebene Verhalten erzeugen. Sie haben kein Schema des Setups angegeben, daher ist meine Antwort wirklich nur eine Vermutung, aber ein fehlender Pulldown-Widerstand würde wahrscheinlich genau das verursachen, was Sie sagen: Die digitale Lesung des Tastenstifts wechselt sporadisch zwischen HIGH und LOW und Die LED scheint zufällig zu flackern, anstatt nur die Helligkeit wie erwartet zu ändern.

Danke für den Hinweis. Ich habe gerade festgestellt, dass in meiner Schaltung kein Pulldown-Widerstand vorhanden ist. Werde wiederkommen, wenn ich einen hinzufügen kann.
Der AVR, auf dem das Arduino basiert, hat interne Pull-up-Widerstände. Es ist viel einfacher, den Schalter zum Verbinden mit Masse zu verwenden und die internen Pullup-Widerstände zu aktivieren.
Um den internen Pullup zu aktivieren, setzen Sie den Pin-Modus auf INPUT_PULLUPstatt aufINPUT
#define led 11 //assign pin 11 to LED
#define BUTTON 7 //assign pin 7 to pushbutton
#define SAMPLING 250 //250milliSecond per press, used for debouncing

static unsigned long TIMER = 0; //record current millis()
byte state = 0; //val used to check current status of pushbutton later in the program
byte brightness[] = {0, 75, 150, 255}; //comment this out if not picky  

void setup()
{
  pinMode(led,OUTPUT);
  pinMode(BUTTON,INPUT);
  digitalWrite(BUTTON, HIGH); //use internal pull up resistor, no need for external resistor   
}

void loop()
{
  if(millis() - TIMER >= SAMPLING) //sampling ~= 250mS
  {  
    TIMER = millis();
    if(!digitalRead(BUTTON)) //button pressed, pulled low
    {
      state++; //increment state
      if(state > 3) //want only 4 brightness options, 0, 1, 2, 3
        state = 0;
      analogWrite(led, brightness[state]); //if you aren't picky, use analogWrite(led, state*85); 
                                           //no byte array;
                                           //0*85 = 0
                                           //1*85 = 85
                                           //2*85 = 170
                                           //3*85 = 255
    }
  }
}