En este tutorial de Arduino vamos a medir la temperatura ambiente con un sencillo sensor y mostrarla en un display LCD de 16x2, de esta forma podemos familiarizarnos con los principios básicos de programación de esta plataforma.
Material Necesario
El material necesario para la realización de este tutorial viene incluido en cualquiera de los Kit Arduino que comercializamos y consiste en:
Esquema de Montaje
El esquema de montaje en Fritzing de todos los componentes y las conexiones necesarias es el siguiente:
El esquema es bastante sencillo, en lo que se refiere al sensor TMP36 por un pin se le da alimentación, el central se conecta a la entrada analógica A0 del Arduino y el tercer pin se conecta al GND. En lo que se refiere al display LCD y a la resistencia variable de 10K necesaria para su funcionamiento:
- Salida 5V del Arduino al positivo de la Breadboard
- GND del Arduino al GND de la Breadboard
- Un pin del potenciometro de 10K Ohm al positivo de la Breadboard
- Pin central del potenciometro de 10K Ohm al GND de la Breadboard
- El tercer pin del potenciometro de 10K Ohm al pin 3 del LCD (V0)
- Pin 15 LCD (BLA) al positivo de la breadboard
- Pin 16 LCD (BLK) al GND de la breadboard
- Pin 1 LCD (VSS) al GND de la Breadboard
- Pin 2 LCD (VDD) al positivo de la Breadboard
- Pin 4 LCD (RS) a la salida 7 del Arduino
- Pin 5 LCD (R/W) al GND de la Breadboard
- Pin 6 LCD (E) a la salida 8 del Arduino
- Pin 11 LCD (DB4) a la salida 9 del Arduino
- Pin 12 LCD (DB5) a la salida 10 del Arduino
- Pin 13 LCD (DB6) a la salida 11 del Arduino
- Pin 14 LCD (DB7) a la salida 12 del Arduino
Este esquema es válido para cualquier display compatible con Arduino (es decir, compatible con el driver
Hitachi HD44780 o cualquier clon del mismo), la única variación posible es la posición de determinados
pines, generalmente el 15 y el 16, asociados a la iluminación del fondo del display LCD.
Con respecto al display veremos la configuración de los pines, para poder realizar las conexiones de forma correcta y asegurar que funcione con la librería correspondiente incluida en el IDE de Arduino. En lo que se refiere al sensor de temperatura TMP36, vemos que se trata de un sensor análogico cuyo rango es de -50ºC a 125ºC y cuya salida saca 10mV por cada ºC de temperatura (este dato será importante a la hora de programar el sketch de Arduino).
Sketch Arduino
La programación para conseguir el objetivo del tutorial, mostrar la temperatura medida por el sensor en el display, sería este:
#include <LiquidCrystal.h>
LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);
const int sensorPin =A0;
void setup(){
Serial.begin(9600);
}
void loop(){
int sensorVal = analogRead(sensorPin);
Serial.print("Sensor Value: ");
Serial.print(sensorVal);
float voltage = (sensorVal/1024.0) * 5.0;
Serial.print(", Voltios: ");
Serial.print(voltage);
Serial.print("; Temp. Grados: ");
int temperature = (voltage - .5) * 100;
Serial.println(temperature);
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.write("Temperatura: ");
lcd.setCursor(12,0);
lcd.print(temperature);
lcd.setCursor(14,0);
lcd.write((char)223);
lcd.setCursor(15,0);
lcd.write("C");
delay(2000);
}
La primera parte del sketch no tiene ningún misterio, simplememte "llamamos" a la libreria "LiquidCrystal" , una de las incluidas por defecto en el IDE oficial de Arduino, para poder usar alguna de sus funcionalidades. Definimos los pines que usamos en el Display de acuerdo al esquema de conexionado que hemos realizado con anterioridad y creamos una constante, sensorPin, para el sensor TMP36, asignandole el pin A0 al que lo hemos conectado, que usaremos con posterioridad.
En el "setup" usamos una interesante funcionalidad de Arduino, el Monitor Serial, el cual permite comunicarse al PC con la placa y viceversa, es decir, permite enviar instrucciones en tiempo real al Arduino o recibir en el PC datos del Arduino, también en tiempo real. En este caso solo vamos a recibir datos del Arduino. Iniciamos la comunicación e indicamos la velocidad en baudios de la conexión, en nuestro caso 9600, con la función:
Serial.begin(9600);
Para ver en el PC los datos que nos envie el Arduino simplemente hay que abrir el Monitor Serial:
En el "Loop", es decir, aquella parte del sketch que queremos que se repita ciclicamente, comenzamos definiendo una variable, sensorVal, como el valor de la lectura obtenida del sensorPin definido antes (A0), usando la función:
int sensorVal = analogRead(sensorPin);
Luego vamos a definir que información queremos mostrar en Monitor Serial usando la función "Serial.print", esta función solo tiene un argumento, si el mismo lo entrecomillamos, será lo que directamente queramos que muestre (sin variación posible), generalmente un texto identificativo del campo posterior, sino usaremos la variable cuyo valor queremos que muestre, en nuestro caso sensorVal:
Serial.print("Sensor Value: ");
Serial.print(sensorVal);
Para entender la siguiente linea del sketch es necesario explicar que la función "analogRead" usada antes tiene un pequeño "truco", si bien el TMP36 emite un voltaje en función de la temperatura (10mV por grado) el Arduino no nos da un voltaje como valor de la entrada analógica, para dicha lectura utiliza un protocolo llamado ADC (Analog to Digital Converter) que nos da un valor comprendido entre 0 y 1023 proporcional al voltaje recibido, por lo que si queremos operar con valores de voltajes, es necesario realizar una pequeña operación matemática, dividir el valor de la lectura entre 1024 (valores posibles) y multiplicar por 5 (las entradas analógicas Arduino solo pueden medir valores entre 0 y 5V), de esta forma:
float voltage = (sensorVal/1024.0) * 5.0;
Con esos voltios, para obtener una temperatura, de nuevo hay que formular, al voltaje obtenido antes hay que restarle 0,5, para registrar las temperaturas negativas dado que el TMP36 puede mediar hasta -50ºC y multiplicar por 100. Ambas variables, voltaje y temperatura, las mostramos en el Monitor Serial de la misma forma que hicimos con el sensorVal:
Serial.print(", Voltios: ");
Serial.print(voltage);
Serial.print("; Temp. Grados: ");
int temperature = (voltage - .5) * 100;
Serial.println(temperature);
Lo único a mencionar es que la variable Temperatura la hemos definido usando "int" (integer) y no "float" la diferencia es que el primero solo admite números enteros y la segunda admite decimales, obviamente es más correcto, o al menos más preciso, usar la segunda en vez de la primera. La razón de haberlo hecho así, es que todo lo que mostraremos en el display nos quepa en una sola linea. Por otra parte si es relevante la precisión es siempre mejor usar sensores digitales como el DS18B20 y no analógicos, y si se usan analógicos y existe la posibilidad, como es el caso, alimentarlos a 3.3V y no a 5V para reducir el ruido, lo que cambiaría ligeramente el sketch. Tambien fijaros que en la comunicación por Serial Monitor si queremos que el siguiente dato lo muestre en una linea diferente, no a continuación de los anteriores, usamos "Serial.println".
Finalmente la última parte del sketch la dedicamos a mostrar los datos que queremos en el display LCD, en nuestro caso un texto con la variable que mostramos (Temperatura) y su valor:
lcd.begin(16, 2);
lcd.setCursor(0,0);
lcd.write("Temperatura: ");
lcd.setCursor(12,0);
lcd.print(temperature);
lcd.setCursor(14,0);
lcd.write((char)223);
lcd.setCursor(15,0);
lcd.write("C");
delay(2000);
}
Primero definimos el tamaño del display usado, 16 caracteres y 2 lineas, situamos el cursor en la primera posición de la primera linea (0,0) y comenzamos a escribir. Lo único relevante es que el simbolo de los grados (º) hay que definirlo, lo hacemos con (char)223. Por último establecemos un delay de 2 segundos para que actualice el dato en pantalla, al repetir el proceso.
Hola una consulta, como se puede hacer para que los datos del LCD se me genere en la PC un archivo .txt automaticamente con dichos datos, saludos
ResponderEliminarLa forma mas sencilla, es a través de un modulo de datalogging. Grabas los datos en una microsd en formato .txt, luego con ese archivo haces lo que quieres.
ResponderEliminarhttp://www.cetronic.es/sqlcommerce/disenos/plantilla1/seccion/producto/DetalleProducto.jsp?idIdioma=&idTienda=93&codProducto=999334016&cPath=1342
El esquema de montaje no es correcto. Errores graves en las conexiones el potenciometro entra en corto
ResponderEliminarsi es cierto, esta mal conectado el pote, el cable amarillo va en el centro
Eliminar