Launchpad parpadea con el botón

1

Estoy intentando que el LED en el Launchpad de MSP430G2 siga parpadeando / apagando con un botón como el ejemplo de Switch ( enlace ) en Arduino / Energia, pero parece que echo de menos algo estúpido y no sé qué ...

const int buttonPin = PUSH2;     // the number of the pushbutton pin
const int ledPin =  GREEN_LED;   // the number of the LED pin

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

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  reading = digitalRead(buttonPin);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if (reading == HIGH && previous == LOW && millis() - time > debounce) {
    if (state == HIGH){
      state = LOW;
    }
    else {
      state = HIGH;
      digitalWrite(ledPin, HIGH);   
      delay(100);                  
      digitalWrite(ledPin, LOW);    
      delay(100); 
    }

    time = millis();    
  }

  digitalWrite(ledPin, state);

  previous = reading;
}

Parpadea una vez cuando presiono el botón. Sé que esto

digitalWrite(ledPin, HIGH);

o parte del estado desordena. ¿Alguna ayuda? Gracias.

    
pregunta Cagurtay

2 respuestas

3

¿Es esto lo que estás tratando de lograr?

  • Empujar y soltar = > El LED comienza a parpadear
  • Empujar y soltar = > El LED se apaga
  • y así sucesivamente ..

Cambié ligeramente tu código para lograr eso. Definí un indicador 'parpadear' que indica la rutina de parpadeo más abajo, ya sea para hacer parpadear el LED o apagarlo.

const int buttonPin = PUSH2;     // the number of the pushbutton pin
const int ledPin =  GREEN_LED;   // the number of the LED pin

boolean state = HIGH;      // the current state of the output pin
boolean blink = LOW;       // the current mode of the LED either blinking (HIGH) or off (LOW)
int reading;           // the current reading from the input pin
int previous = LOW;    // the previous reading from the input pin

// the follow variables are long's because the time, measured in miliseconds,
// will quickly become a bigger number than can be stored in an int.
long time = 0;         // the last time the output pin was toggled
long debounce = 200;   // the debounce time, increase if the output flickers

void setup()
{
  pinMode(buttonPin, INPUT_PULLUP);
  pinMode(ledPin, OUTPUT);
}

void loop()
{
  reading = digitalRead(buttonPin);

  // if the input just went from LOW and HIGH and we've waited long enough
  // to ignore any noise on the circuit, toggle the output pin and remember
  // the time
  if ( (reading == HIGH) && (previous == LOW) && ((millis() - time) > debounce ) ) {
    blink = !blink;  // invert the current value for the blink flag
    time = millis();    
  }


  // if blink flag is HIGH then turn on and off the LED
  // if blink flag is LOW then turn off the LED
  if ( blink == HIGH ) {
    digitalWrite(ledPin, state);
    state = !state;   // invert the current state (LOW to HIGH and HIGH to LOW)
    delay(100);
  } else {
    digitalWrite(ledPin, LOW);
  }
  previous = reading;
}

La desventaja de este código es que el bucle se ejecuta lentamente debido a la demora mientras parpadea. El bucle intermitente se puede mejorar para ese comportamiento, pero introduce un mecanismo un poco más complejo:

  if ( blink == HIGH ) {
    state = ( millis() >> 8 ) & 1;
    digitalWrite(ledPin, state);
  } else {
    digitalWrite(ledPin, LOW);
  }

Aquí el retraso se reemplaza haciendo que el estado dependa de la cantidad de milisegundos desde el inicio, dividido por 256 y marcando el bit menos significativo.

    
respondido por el jippie
1

Else necesita una llave de apertura.

  

else {

(Error desde que fue corregido por OP y Question, pero también debido a una interpretación diferente de cuáles son las vagas intenciones de OP (el código no funciona como está escrito y el código no funciona como se esperaba))

    
respondido por el Passerby

Lea otras preguntas en las etiquetas