Arduino LED brillo cambiando usando un botón

3

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

¿Cómo puedo resolver este problema?

    
pregunta user22934

2 respuestas

4

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

    
respondido por el fred.grollier
0
#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
    }
  }
}  
    
respondido por el NothinRandom

Lea otras preguntas en las etiquetas