SENSOR DE TEMPERATURA LM35 y PROCESSING
En esta práctica vamos a utilizar un simple sensor de Temperatura LM35 que conectaremos al pin analógico A0 y podremos encender o apagar un LED 13 desde una GUI diseñada desde Processing que además representará losdatos recibidos del pin A0 por le puerto serie para representarlos y para guardarlos en un archivo .txt.
EL SENSOR LM35
El LM35 es un sensor de temperatura analógico integrado. A diferencia de otros dispositivos como los termistores en los que la medición de temperatura se obtiene de la medición de su resistencia eléctrica, el LM35 es un integrado con su propio circuito de control, que proporciona una salida de voltaje proporcional a la temperatura.
Es un sensor analógico de temperatura de salida lineal, con un rango de -55ºC (-550mV) a 150ºC (1500 mV) y en su salida da 10mV por cada grado centígrado con una precisión de 0,5ºC .
Para hacer la lectura de la temperatura en grados centígrados, en el programa de Arduino tenemos que hacer una sencilla fórmula matemática. Primero de todo, tenemos el sensor conectado a una entrada analógica del Arduino (que recordemos son de 10 bits). El voltaje de salida del sensor es interpretado por el Arduino con valores (donde 0V es 0 y.... 5V es 1023).
Para poder convertir estos valores nuevamente a voltios, hay que multiplicar el valor por 5 (que son los 5 Voltios máximos de señal que da el sensor) y dividirlo por 1023 que es el entero más grande en un rango de 10 bits. Luego tenemos que convertir este voltaje en grados centígrados. Ahora tenemos que 10mV son 1ºC. Si multiplicamos estos 10mV por 100, tendremos que 1V son 1ºC.
La formula final sería la siguiente:
Temperatura en ºC = (Valor A0 * 5 * 100) / (1023)
CONEXIONES CON ARDUINO
El led lo pondremos en el pin13 a diferencia del dibujo.CÓDIGO ARDUINO
int
led=13;
int
temp;
// Variable sensor de temperaura
boolean status=LOW;
//Estado del led
void
setup()
{
Serial.begin(9600);
pinMode(led,OUTPUT);
}
void
loop()
{
temp = analogRead(A0);
//Lee los datos del sensor LM35
temp = (5.0 * temp * 100)/1023.0;
//Formula para convertir a ºC
Serial.println(temp);
//Enviamos los datos en forma de byte
delay(100);
if
(Serial.available()>0)
{
byte dato = Serial.read();
//Los almacena en la variable "dato"
if
(dato==65)
//Si recibe una "A" (en ASCII "65") cada vez cambia led
{
status=!status;
//Cambia el estatus del led
}
digitalWrite(led,status);
}
}
CÓDIGO GUI CON PROCESSING
import processing.serial.*; //Importamos la librería Serial
Serial port; //Nombre del puerto serie
PrintWriter output; //Para crear el archivo de texto donde guardar los datos
int rquad=40; //Radio del quadrado
int xquad=200; //Posición X de rect
int yquad=200; //Posición Y de rect
boolean overRect = false; //Estado del mouse si está encima de rect o no
//Colores del botón
int red=100;
int green=100;
int blue=100;
boolean status=false; //Estado del color de rect
String texto="LED OFF";//Texto del status inicial del LED
int xlogo=400;//Posición X de la imagen
int ylogo=50;//Posición Y de la imagen
int valor;//Valor de la temperatura
//Colores esfera temperatura
float rojo;
float verde;
float azul;
void setup(){
port = new Serial(this, "COM6", 9600); //Abre el puerto serie COMx
output = createWriter("temeratura_datos.txt"); //Creamos el archivo de texto, que es guardado en la carpeta del programa
size(800, 400); //Creamos una ventana de 800 píxeles de anchura por 600 píxeles de altura
}
void draw(){
background(255,255,255);//Fondo de color blanco
if(mouseX > xquad-rquad && mouseX < xquad+rquad && //Si el mouse se encuentra dentro de rect
mouseY > yquad-rquad && mouseY < yquad+rquad) {
overRect=true; //Variable que demuestra que el mouse esta dentro de rect
stroke(255,0,0); //Contorno de rect rojo
}
else {
overRect=false; //Si el mouse no está dentro de rect, la variable pasa a ser falsa
stroke(0,0,0); //Contorno de rect negro
}
//Dibujamos un rectangulo de color gris
fill(red,green,blue);
rectMode(RADIUS); //Esta función hace que Width y Height de rect sea el radio (distancia desde el centro hasta un costado).
rect(xquad,yquad,rquad,rquad);
//Creamos un texto de color negro con la palabra LED
fill(0,0,0);
PFont f = loadFont("Calibri-48.vlw");//Tipo de fuente
textFont(f, 20);
text(texto, 170, 270);
//Ponemos la imagen de nuestro logo
imageMode(CENTER);//Esta función hace que las coordenadas de la imagne sean el centro de esta y no la esquina izquierda arriba
PImage imagen=loadImage("LM35.jpg");
image(imagen,xlogo,ylogo,200,100);
//Recibir datos temperatura del Arduino
if(port.available() > 0) {
valor=port.read();//Lee el dato y lo almacena en la variable "valor"
}
//Visualizamos la temperatura con un texto
text("Temperatura =",390,200);
text(valor, 520, 200);
text("ºC",547,200);
//Escribimos los datos de la temperatura con el tiempo (h/m/s) en el archivo de texto
output.print(valor + " ºC ");
output.print(hour( )+":");
output.print(minute( )+":");
output.println(second( ));
output.println("");
//Esfera color visualización temperatura
float temp = map (valor, 15,32, 0, 255);//Escalamos la temperatura donde maximo sea 32ºC y mínimo 15ºC
rojo=temp;
verde=temp*-1 + 255;
azul=temp*-1 + 255;
//Dibujamos una esfera para colorear la temperatura
noStroke();
fill(rojo,verde,azul);
ellipseMode(CENTER);
ellipse(590,193,20,20);
}
void mousePressed() { //Cuando el mouse está apretado
if (overRect==true) { //Si el mouse está dentro de rect
status=!status; //El estado del color cambia
port.write("A"); //Envia una "A" para que el Arduino encienda el led
if(status==true) {
//Color del botón rojo
red=255;
green=0;
blue=0;
texto="LED ON";
}
if(status==false) {
//Color del botón negro
red=100;
green=100;
blue=100;
texto="LED OFF";
}
}
}
void keyPressed() //Cuando se pulsa una tecla
{
if(key=='w'||key=='W') {
ylogo--; //El logo se deplaza hacia arriba
}
else if(key=='s'||key=='S') {
ylogo++; //El logo se deplaza hacia abajo
}
else if(key=='a'||key=='A') {
xlogo--; //El logo se desplaza hacia la izquierda
}
else if(key=='d'||key=='D') {
xlogo++; //El logo se desplaca hacia la derecha
}
//Pulsar la tecla E para salir del programa
if(key=='e' || key=='E') {
output.flush(); // Escribe los datos restantes en el archivo
output.close(); // Final del archivo
exit();//Salimos del programa
}
}