Práctica previa a la creación de menú utilizando LCD.
Material:
Arduino UNO
LCD con interfaz I2C
Encoder rotativo
Objetivo. Aprenderás a utilizar el movimiento rotativo de un encoder y utilizarlo en el desplazamiento de un menú, diseñado para un LCD.
Algoritmo:
#include <Timer.h>
#include <LiquidCrystal_I2C.h>
Timer t;
//Definición de pines de entrada
#define encoder0PinA 2
#define encoder0PinB 3
#define encoder0Pulse 4
//Variables utilizadas tanto en la interrupción como en el void loop
volatile unsigned int encoder0Pos = 0;
volatile char indicadorDegiro;
volatile boolean flagLCD=0; //Bandera para refrescar LCD dentro del void loop
//Bandera indicadora de pulsador presionado
boolean flagPulse=0;
LiquidCrystal_I2C lcd(0x27, 16, 2); // Set the LCD I2C address
void setup() {
lcd.begin();
Serial.begin (9600);
pinMode(encoder0PinA, INPUT_PULLUP);
pinMode(encoder0PinB, INPUT_PULLUP);
pinMode(encoder0Pulse,INPUT_PULLUP);
attachInterrupt(0, doEncoder, CHANGE); // Habilita interrupción en pin 2, por cambio de nivel
}
void loop(){
t.update();
if (flagLCD==1){
flagLCD=0;
lcd.clear();
lcd.print(encoder0Pos);
lcd.setCursor(0,1);
lcd.print(indicadorDegiro);
}
if (digitalRead(encoder0Pulse)==0 && flagPulse==0){ //Si pulso botón y flag=0 entonces
t.after(150,verificaPulso); //Llama a rutina verificaPulso despues de 150 ms, para evitar rebote
flagPulse=1;
}
}
void doEncoder() {
static boolean PosCursor=0;
if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
encoder0Pos++;
indicadorDegiro='<';
} else {
encoder0Pos--;
indicadorDegiro='>';
}
flagLCD=1;
}
void verificaPulso(){
static boolean conmutador=0; //Variable para conmutar brillo del LCD
if (digitalRead(encoder0Pulse)==0){
if (conmutador==0){
lcd.noBacklight();
conmutador=1;
}
else{
lcd.backlight();
conmutador=0;
}
}
flagPulse=0;
}
En el próximo video que está pendiente, analizaremos a fondo el anterior algoritmo .
Saludos.
Comentarios
Publicar un comentario