Conmutación de brillo LED Arduino mediante pulsador

Estoy tratando de cambiar entre 4 brillos diferentes de un LED usando un Arduino Uno. He usado analogWrite y no digitalWrite con PWM. El problema al que me enfrento es que el brillo no cambia en absoluto cuando se presiona el botón. Aquí está mi código:

#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);
  }
}

¿Como puedo resolver este problema?

¿Su botón pulsador vuelve a cambiar automáticamente después de soltarlo?
Sí lo hace. En lugar de cambiar al siguiente brillo, vuelve al mismo brillo.
#define led 11 //asigne el pin 11 al LED esto es incorrecto siempre que use analógico, esto puede ser de 0-5.
Pensé que los pines 1 a 5 sirven solo como ENTRADAS analógicas. ¿Estás seguro de eso?
sí, estoy seguro de que es para entrada y salida.
¡Puedes usar el pin 11 para PWM! De hecho, puede usar cualquier pin marcado con un "~" para PWM en el Arduino Uno. La página de referencia de AnalogWrite ( arduino.cc/de/Reference/AnalogWrite ) también lo confirma.

Respuestas (2)

Aunque su código tiene algunas debilidades, no debería generar el comportamiento que describe. No ha proporcionado ningún esquema de la configuración, por lo que mi respuesta es realmente solo una suposición, pero la falta de una resistencia desplegable probablemente causaría exactamente lo que está diciendo: la lectura digital del pin del botón cambia esporádicamente entre ALTO y BAJO, y el led parece parpadear al azar en lugar de cambiar el brillo como se esperaba.

Gracias por mencionarlo. Me acabo de dar cuenta de que no hay una resistencia desplegable en mi circuito. Volveré cuando pueda agregar uno.
El AVR en el que se basa el arduino tiene resistencias pull-up internas. Es mucho más fácil usar el interruptor para conectar a tierra y tener habilitadas las resistencias pullup internas.
Para habilitar el pullup interno, configure el modo pin como INPUT_PULLUPen lugar deINPUT
#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
    }
  }
}