Go Down

Topic: Uso correcto de display y LCD (novato en apuros)  (Read 178 times) previous topic - next topic

keylorgj

Hola amigos, tengo una duda sobre el código que arme de varias recopilaciones (soy aprendiz)
Quiero
Que cada cierto tiempo se encienda un led, un buzzer y muestre en el display el color del led encendido; por 5 segundos, pero si presiono el pulsador antes de los 5 segundos que se apague el led, buzzer y siga con la siguiente instrucción, que sería lo mismo pero con un led de otro color.

De antemano gracias.

Dejo el código que armé.


Code: [Select]

 #include <LiquidCrystal.h>

#define Pulsador 13

int inicio = 0; //Estado de la salida al arrancar arduino
int estadoAC = 0; // Estado actual del boton
int estadoAN = 0; //Variable para guardar el estado anterior del pulsador


const int rs = 12, en = 11, d4 = 4, d5 = 3, d6 = 2, d7 = 1;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

const int ROJO = 5; // led rojo
const int AZUL = 7;
const int buzzer = 6;

void setup() {

  pinMode(Pulsador, INPUT);
  pinMode (ROJO, OUTPUT);
  pinMode (buzzer, OUTPUT);
  pinMode(AZUL, OUTPUT);


  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  lcd.print("hello world!");
  delay (3000);
  lcd.clear();
  delay (1000);
  pinMode(ROJO, OUTPUT);

}

void loop() {


 
  // Turn off the blinking cursor:
  lcd.noBlink();
  delay(1000);
  // Turn on the blinking cursor:

    estadoAC = digitalRead (Pulsador); //Actualizamos el valor de la variable
  if(estadoAC && estadoAN == 0) //
  {
    inicio = 1 - inicio;// asignamos el estado contrario
    delay(100);
  }

  estadoAN = estadoAC;
       if(inicio == 1)
     { 
 
  lcd.blink();
  digitalWrite (ROJO, HIGH);
  digitalWrite (buzzer, HIGH);
  lcd.print("ROJO ENCENDIDO");
  delay(5000);
  digitalWrite (ROJO, LOW);
  digitalWrite (buzzer, LOW);
  lcd.clear();
  lcd.noBlink();
  delay(1000); 
     }
    else
    {
 
 
  digitalWrite (ROJO, LOW);
  digitalWrite (buzzer, LOW);
  lcd.clear();
  lcd.noBlink();
  delay(1000);
  }
//segundo LED

  // Turn off the blinking cursor:
  lcd.noBlink();
  delay(1000);
  // Turn on the blinking cursor:

    estadoAC = digitalRead (Pulsador); //Actualizamos el valor de la variable
  if(estadoAC && estadoAN == 0) //
  {
    inicio = 1 - inicio;// asignamos el estado contrario
    delay(100);
  }

  estadoAN = estadoAC;
       if(inicio == 1)
     { 
 
  lcd.blink();
  digitalWrite (AZUL, HIGH);
  digitalWrite (buzzer, HIGH);
  lcd.print("AZUL ENCENDIDO");
  delay(5000);
  digitalWrite (AZUL, LOW);
  digitalWrite (buzzer, LOW);
  lcd.clear();
  lcd.noBlink();
  delay(1000); 
     }
    else
    {
 
 
  digitalWrite (AZUL, LOW);
  digitalWrite (buzzer, LOW);
  lcd.clear();
  lcd.noBlink();
  delay(1000);
  }
 
  }

surbyte

Parece un trabajo escolar. Casi que lo he leído antes.

Bueno mas allá de eso, te recomiendo que no uses delay porque su uso detiene el programa y por ende, la reacción de esa opción que planteas de presionar antes de que se cumplan los 5 segundos.
Veamos una parte del código

Code: [Select]
if(inicio == 1) { 
  lcd.blink();
  digitalWrite (ROJO, HIGH);
  digitalWrite (buzzer, HIGH);
  lcd.print("ROJO ENCENDIDO");
  delay(5000);
  digitalWrite (ROJO, LOW);
  digitalWrite (buzzer, LOW);
  lcd.clear();
  lcd.noBlink();
  delay(1000); 
 }


si se cumple que inicio = 1 entonces pones en high led ROJO y buzzer, pero esperas 5 segundos sin hacer nada y luego apagas LED ROJO y buzzer y borras LCD y otro segundo mas sin hacer nada.
Total 6 segundos.

Dime como vas a reaccionar a una pulsación para que se cumpla lo que pide el enunciado?

surbyte

PUes ve a Documentación => Indice de temas tutoriales => y lee millis() y máquina de estados.
Ambas combinadas te darán la solucion que requieres.


surbyte

Tienes que definir variables obviamente como globales asi que te pondré algo como // globales y tu sabrás donde van.

Code: [Select]
// globales
byte estado = 0;
unsigned long start;

//luego en tu loop

if(inicio == 1) {
  switch(estado) {
      case 0: lcd.blink();
                 digitalWrite (ROJO, HIGH);
                 digitalWrite (buzzer, HIGH);
                 lcd.print("ROJO ENCENDIDO");
                 estado = 1;
                 start = millis();
                 break;
      case 1: if (millis() - start > 5000UL) {  // equivale a   delay(5000);
                      digitalWrite (ROJO, LOW);
                      digitalWrite (buzzer, LOW);
                      lcd.clear();
                      lcd.noBlink();
                      start = millis();
                      estado = 2;
                  }
                  break;
      case 2: if (millis() - start > 1000UL) {  // equivale a   delay(1000);
                     estado = 0;
                  }
                  break;
      }
   } // fin del if



Igualmente no aseguro que funcione, porque hay que pensar en todo el código y no en parte del mismo.

Go Up