LM35 con Processing

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
  }
}