Laboratorio 2: ADC LiquidCrystal - jorgerivera/ULCR-BINGE61 GitHub Wiki
UNIVERSIDAD LATINA DE COSTA RICA – BINGE-61 LABORATORIO DE MICROCONTROLADORES
Laboratorio 2: ADC + LiquidCrystal
Luis Manuel Pineda Arredondo, Warner Durán Acuña
I. Descripción
Se leerá el valor de un potenciómetro utilizando el convertidor Analógico a Digital y se mostrará el resultado en una pantalla de cristal líquido con un mensaje apropiado. Además el proyecto contará con un led que parpadeará a una frecuencia de 1Hz de forma constante.
II. Materiales
Cantidad Material
2...........Arduino
2...........Protoboard
2...........Leds
4...........Potenciómetros
2...........LCD
2...........Resistencias variadas
42..........Cables
III. Esquemático
IV. Descripción del programa realizado
IV-A. Programa sin máquina de estados
Primero se añade la librería necesaria para poder utilizar la pantalla LCD en la programación. Luego se definen los pines del Arduino en los que se va a colocar la pantalla LCD. Después de haber elegido los pines se procede a definir las variables necesarias para poder guardar los valores medidos.
#include "<LiquidCrystal.h">
LiquidCrystal lcd(12,11,5,4,3,2);
int sensorPin1 = A0;
int Pot1 = 0;
int pinLED = 7;
int LED;
Después se inicia el void setup. Se describe el tamaño del LCD (anchura, altura), se limpia la pantalla en la que se va a escribir el mensaje y luego se coloca la palabra “Resistencia” utilizando el código lcd.print. Luego, se configura el pin 7 del Arduino como una salida.
void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.print("Resistencia");
pinMode (7, OUTPUT);
}
Luego de terminar el void setup, se inicia un void loop, el cual va correr el programa en su interior continuamente. Se mide el valor analógico del A0 (sensorpin1) y se guarda en la variable Pot1. Luego se coloca el cursor del LCD en la segunda línea del LCD (0,1) y se imprimen espacios en blanco para provocar un refrescamiento en la pantalla. Luego, se vuelve a colocar el cursor en la posición (0,1) y se imprime el valor guardado en Pot1.
void loop()
{
Pot1 = analogRead(sensorPin1);
lcd.setCursor(0,1);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(Pot1);
}
Por último entra la programación del LED. Primero se asigna el puerto al que está conectado el LED y se le da un estado “alto”, en la cual se pone un delay de medio segundo. Seguidamente, se vuelve asignar otra vez el pin del LED, pero esta vez se le da un estado “bajo”, e igualmente se le da un delay de medio segundo para de esta manera completar el ciclo de 1Hz.
digitalWrite(7,HIGH);
delay(500);
digitalWrite(7,LOW);
delay(500);
}
IV-B. Programa con máquina de estados
En la sección de declaración de variables, se hace lo mismo que en el programa sin máquina de estados, con la excepción de que hay que agregar dos cosas. La primera, es que se asigna una variable de estado y una variable de cambio para las máquinas de estado. La segunda cosa a realizar es la asignación de una función de tiempo, para poder tomar el tiempo exacto que va tardarse en apagar el LED u encender sin la necesidad de hacer un delay.
#include<LiquidCrystal.h>
LiquidCrystal lcd(12,11,5,4,3,2);
int sensorPin1 = A0;
int Pot1 = 0;
int pinLED = 7;
int LED;
int estado;
int cambio;
unsigned long ultimocambio;
Posteriormente en el “void setup” se ejecuta nuevamente lo mismo que el programa sin máquina de estados, con la excepción de que se agregan dos líneas: “estado=1” y “cambio=1”. Estas se utilizan para inicializar las máquinas de estado en el estado uno.
void setup()
{
lcd.begin(16, 2);
lcd.clear();
lcd.print("Resistencia");
pinMode (7, OUTPUT);
estado=1;
cambio=1;
}
Al finalizar el void setup, se crea un nuevo void llamado “MaqProceso”. Este void es la máquina de estados que va a controlar todo el proceso que el Arduino va a realizar con la pantalla LCD. Primero se va a inicializar un switch, para poder empezar a construir la máquina de estados. La máquina va a consistir en 5 cases. En el primer caso se lee el pin A0 (sensorPin1) y se guarda el resultado en la variable Pot1 y después se pasa al estado 2, escribiendo “estado=2”. En el segundo caso se va a colocar el cursor del LCD en la segunda línea (0,1) y luego se pasa al estado 3. En el tercer estado se imprimen espacios en blanco, esto para limpiar la pantalla del LCD de su valor anterior impreso y seguidamente se pasa al estado 4. En el cuarto caso se vuelve a colocar el cursor en la posición (0,1) y después se pasa al estado 5. Finalmente, en el quinto caso, se imprime el valor guardado en Pot1 y por último se pasa al estado 1 para volver a iniciar el ciclo.
void MaqProceso()
{
switch(cambio)
{
case 1:
Pot1 = analogRead(sensorPin1);
estado=2;
break;
case 2:
lcd.setCursor(0,1);
estado=3;
break;
case 3:
lcd.print(" ");
estado=4;
break;
case 4:
lcd.setCursor(0,1);
estado=5;
break;
case 5:
lcd.print(Pot1);
estado=1;
break;
}
}
Después se crea otro switch para la máquina de estados del LED, la cual se divide en 4 casos. En el primer caso se enciende el LED, luego se pasa al estado dos y valor de tiempo actual del dispositivo se guarda en la variable "ultimocambio". En el segundo caso se coloca una condición, para que esta condición se cumpla, tienen que transcurrir quinientos milisegundos después del valor que estaba guardado en ultimocambio. Al cumplirse los quinientos milisegundos, se pasa al estado tres. En el tercer caso, se apaga el LED, pasa al estado cuatro y se lee el valor de tiempo actual del dispositivo para guardarlo nuevamente en la variable ultimocambio. Finalmente, en el cuarto caso, se coloca otra vez una condición al igual que el segundo caso, en la que al transcurrir quinientos milisegundos en tiempo guardado en ultimocambio, la condición retorna al estado uno.
void MaqLED()
{
switch(estado)
{
case 1:
digitalWrite(7,HIGH);
estado=2;
ultimocambio=millis();
break;
case 2:
if (millis()">=ultimocambio+500)
{
estado=3;
}
break;
case 3:
digitalWrite(7,LOW);
estado=4;
ultimocambio= millis();
break;
case 4:
if (millis()">=ultimocambio+500)
{
estado=1;
}
break;
}
}
Finalmente se inicia un void loop, el cual va a servir como encargado de correr el programa continuamente. En el cual se colocan los void de las máquinas de estados, para que corran contantemente.
void loop()
{
MaqLED();
MaqProceso();
}
}