Buenas Arduiner@s:
Tengo qeste código usando una LCD Keypad Shield 16x2. Quiero lograr que enviando un comando en el monitor serie se apague y se encienda el Led 13, a parte que lo indica en mensaje en el LCD. No ocurre nada.
Otro fallo que no logro, que al pulsar los botones, como que se envía un bucle y no deja de hacerlo hasta que deje de pulsar, muestra todo mal en el LCD. Solo pulsar una vez un botón, sale resultados no esperados.
Por ejemplo, so pulso el botón arriba, tiene que mostrar en el LCD, la palabra ARRIBA.
Código:
#include <LiquidCrystal.h>
// Seleccionado los pines del LCD.
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
// Definir algunos valores utilizados por el LCD y los botones.
int lcd_key = 0;
int adc_key_in = 0;
#define botonDERECHO 0
#define botonARRIBA 1
#define botonABAJO 2
#define botonIZQUIERDA 3
#define botonSELECT 4
#define botonNADA 5
int pinLed10 = 10; // Luz de fondo.
int pinLed13 = 13; // Declaramos la variable pin del Led.
char caracter;
String comando;
// Leeer todos los botones.
int read_LCD_buttons()
{
adc_key_in = analogRead(0); //Leer el valor desde el sensor.
// Los botones cuando se leen están centrados en estos valores: 0, 144, 329, 504, 741.
// Agregamos aproximadamente 50 a esos valores y verificamos si estamos cerca.
// Hacemos de esta la primera opción por razones de velocidad,
// ya que será el resultado más probable.
if (adc_key_in > 1000) return botonNADA;
// Para V1.1 nosotros este umbral.
/*
if (adc_key_in < 50) return botonDERECHO;
if (adc_key_in < 250) return botonARRIBA;
if (adc_key_in < 450) return botonABAJO;
if (adc_key_in < 650) return botonIZQUIERDA;
if (adc_key_in < 850) return botonSELECT;
*/
// Para V1.0, comente el otro umbral y use el siguiente:
if (adc_key_in < 50) return botonDERECHO;
if (adc_key_in < 195) return botonARRIBA;
if (adc_key_in < 380) return botonABAJO;
if (adc_key_in < 555) return botonIZQUIERDA;
if (adc_key_in < 790) return botonSELECT;
return botonNADA; // Cuando todos los demás fallan, devuelve esto ...
}
void setup()
{
pinMode(pinLed13, OUTPUT);
pinMode(pinLed10, OUTPUT);
digitalWrite(pinLed10, HIGH); // Dejar encendido luz de fondo.
lcd.begin(16, 2); // LCD de 16x2.
lcd.setCursor(0, 0);
lcd.print("Arduino 2020");
Serial.begin(115200);
}
void loop()
{
// Esperando lectura botones.
lcd_key = read_LCD_buttons();
/* Voy leyendo carácter a carácter lo que se recibe por el canal
serie (mientras llegue algún dato allí), y los voy concatenando
uno tras otro en una cadena. En la práctica, si usamos el
"Serial monitor" el bucle while acabará cuando pulsemos Enter.
El delay es conveniente para no saturar el canal serie y que la
concatenación se haga de forma ordenada.
*/
while (Serial.available() > 0)
{
caracter = Serial.read();
comando.concat(caracter);
delay(10);
}
/* Unavez ya tengo la cadena "acabada", compruebo su valor y hago
que la placa Arduino reaccione según sea este. Aquí podríamos
hacer lo que quiesiéramos: si el comando es "tal", enciende
un Led, si es cual, mueve un motor... y así.
*/
if (comando.equals("Led_13_ON") == true) // Led_ON.
{
digitalWrite(pinLed13, HIGH); // Enciende el Led.
lcd.setCursor(0, 1);
lcd.print("1");
Serial.println("Led 13 encendido.");
}
if (comando.equals("Led_13_OFF") == true) // Led_OFF.
{
digitalWrite(pinLed13, LOW); // Apaga el Led.
lcd.setCursor(0, 1);
lcd.print("0");
Serial.println("Led 13 apagado.");
}
if (comando.equals("Led_10_ON") == true) // Led_ON.
{
digitalWrite(pinLed10, HIGH); // Enciende el Led.
lcd.setCursor(9, 1);
lcd.print("1");
Serial.println("Led 10 encendido.");
}
if (comando.equals("Led_10_OFF") == true) // Led_OFF.
{
digitalWrite(pinLed10, LOW); // Apaga el Led.
lcd.setCursor(9, 1);
lcd.print("0");
Serial.println("Led 10 apagado.");
}
// Limpiamos la cadena para volver a recibir el siguiente comando.
comando = "";
// Dependiendo de qué botón se presionó, realizamos una acción.
switch (lcd_key)
{
case botonDERECHO:
{
lcd.print("Derecha ");
Serial.write("Derecha.");
break;
}
case botonIZQUIERDA:
{
lcd.print("Izquierda");
Serial.write("Izquierda.");
break;
}
case botonARRIBA:
{
lcd.print("Arriba ");
Serial.write("Arriba.");
break;
}
case botonABAJO:
{
lcd.print("Abajo ");
Serial.write("Abajo.");
break;
}
case botonSELECT:
{
lcd.print("SELECT ");
Serial.write("SELECT");
break;
}
case botonNADA:
{
//lcd.print("Nada ");
break;
}
}
}
¿Alguna idea?
Saludazos.