En esta ocasión vamos a realizar un pequeño ejemplo de manipulación del brillo y el contraste con arduino lcd2x16 por medio de código, utilizando los PWM que poseen, con el fin de tener el control de estos parámetros en nuestro código según la necesidad de nuestros proyectos.
El funcionamiento del PWM es modificar el ciclo de trabajo de la señal que enviamos a través de un pin, lo que nos permite modificar el voltaje de salida, así podemos cambiar el valor del voltaje que le ingresa a los pines del lcd y modificando los valores de contraste y de brillo.
Puedes ver los ejemplos de PWM que viene con el ide de arduino el cual es analogo write.
Materiales
Cantidad | Elemento |
---|---|
1 | Arduino de cualquier tipo |
1 | LCD 2x16 |
3 | Resistencias 1k |
3 | Interruptores miniatura |
Circuito y conexión
El circuito se describe en la siguiente imagen, se deja el esquema y la conexión de cada elemento, si deseas obtener mas sobre la conexión te recomiendo visitar arduino lcd 2x16.
Código
Dejare el código en el repositorio de github para que los clones con los demás post. La explicación:
//Incluimos la librería del lcd y definimos los pines de conexión del lcd
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
//Declaramos las constantes para cada uno
//de los pines y pulsadores
const int PIN_BRILLO = 9; //Pin salida brillo
const int PIN_CONTRASTE = 10; //Pin salida contraste
const int PIN_13 = 13; //Led de control
const int CAMBIO = 6; //Pulsador cambio de brillo a contraste
const int MAX = 7; //Pulsador aumentar
const int MIN = 8; //Pulsador disminuir
int brillo = 50; //Iniciamos variable brillo 50%
int contraste = 50; //Iniciamos variable contraste 50%
//Iniciamos variables de los pulsadores
int buttonCambio = 0;
int buttonMax = 0;
int buttonMin = 0;
int estadoCambio = 0;
//Declaramos variables de lectura análoga max y min
int valMaxLcd = 255;
int valMinLcd = 0;
void setup() {
lcd.begin(16, 2); //Iniciamos el lcd
//Declaramos como entrada y salida a los pines
pinMode(CAMBIO, INPUT);
pinMode(MAX, INPUT);
pinMode(MIN, INPUT);
pinMode(PIN_13, OUTPUT);
//Mostramos los valores iniciales de brillo y contraste
lcd.print("Brillo:");
lcd.setCursor(0,1);
lcd.print("Contraste:");
//Escribimos en los pines los valores por defecto
analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);
lcd.setCursor(11,0);
lcd.print(brillo);
lcd.setCursor(11,1);
lcd.print(contraste);
lcd.setCursor(14,0);
lcd.print("%");
lcd.setCursor(14,1);
lcd.print("%");
lcd.setCursor(11,0);
lcd.cursor();
}
void loop() {
//Iniciamos el programa preguntando si el pulsador de cambio
//fue habilitado
buttonCambio = digitalRead(CAMBIO);
//Si es accionado cambiamos de brillo a contraste o viceversa
if (buttonCambio == HIGH) {
digitalWrite(PIN_13, HIGH);
//Si estado e 0
if(estadoCambio == 0){
estadoCambio = 1; //Activamos estado
lcd.noCursor(); //Quitamos el cursos del lcd
lcd.setCursor(11,1); //Seteamos el cursis en x=11 y=1
lcd.cursor(); //Colocamos el cursor
delay(100);
}else{
//Si el cursor es 1 hacemos los cambios de esta forma
estadoCambio = 0;
lcd.noCursor();
lcd.setCursor(11,0);
lcd.cursor();
delay(100);
}
}
//Si el boton de cambio no es accionado, escribimos los valores
//de máximo y mínimo
buttonMax = digitalRead(MAX);
buttonMin = digitalRead(MIN);
//Preguntamos si el pulsador máximo fue oprimido
if (buttonMax == HIGH) {
digitalWrite(PIN_13, HIGH);
//Si es asi, verificamos el estado del cambio
if(estadoCambio == 0){ //Si es activo aumentamos es valor de brillo
brillo = brillo + 1;
//Lo escribimos en el pin brillo
analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
lcd.setCursor(11,0);
lcd.print(brillo);
}else{ //de lo contrario aumentamos el contraste
contraste = contraste + 1;
//Lo escribimos en el pin contraste
analogWrite(PIN_CONTRASTE,(contraste*valMaxLcd)/100);
lcd.setCursor(11,1);
lcd.print(contraste);
}
}
//Aplica la misma funcionalidad para el pin de mínima como esta
//en el de maxima
if (buttonMin == HIGH) {
digitalWrite(PIN_13, HIGH);
if(estadoCambio == 0){
brillo = brillo - 1;
analogWrite(PIN_BRILLO, (brillo*valMaxLcd)/100);
lcd.setCursor(11,0);
lcd.print(brillo);
}else{
contraste = contraste - 1;
analogWrite(PIN_CONTRASTE, (contraste*valMaxLcd)/100);
lcd.setCursor(11,1);
lcd.print(contraste);
}
}
digitalWrite(PIN_13, LOW);
delay(100);
}
Este es un pequeño ejercicio que puedes aplicar a tus proyectos. Si tienes alguna duda o inquietud, déjanos un comentario y te estaremos respondiendo.