Go Down

Topic: Uso correcto de display y LCD (novato en apuros)  (Read 120 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?

keylorgj

De hecho es algo muy básico y estoy iniciando, cómo se podría hacer sin usar delay??

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.


keylorgj

No logro que funcione se me hace un desorden, será mucha molestia que ejemplifiques millis en el mismo segmento del código que pusiste?

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