G012 Sensor de temperatura LM35 DZ y arduino


Descripción                                                                                                              ADM
Un sensor de temperatura es simplemente un chip que devuelve un valor de tensión proporcional a la temperatura a la que está sometido.   Vamos a usar el LM35DZ.

Lo primero que hay que hacer es ir a su hoja de características o Datasheet del componente, que es donde podremos ver las características exactas del funcionamiento de un componente.

El LM35DZ funciona en un rango de temperatura entre 0ªC y 100ºC, pero puede medir más no es especialmente preciso, ya que tiene ± 1ºC de incertidumbre, pero normalmente nos sobra para proyectos sencillos y es muy barato. 

El encapsulado es similar al de un transistor y también tiene tres patas, así que mucho cuidado con confundirlos.

 pin central es el de señal, pero para saber cuál es GND y 5V, el encapsulado tiene una cara plana y otra curva.

Poniendo la cara plana mirando hacia vosotros con las patas hacia abajo(de modo que podáis leer el  modelo),  el pin de la izquierda es alimentación 5V y naturalmente el otro es GND.  

Si lo conectas al revés tienes tiempo para reaccionar y desconectar arduino, pero no toque es LM35DZ, porque se calienta mucho y quema, déjalo enfriar.

En este circuito, conectaremos el LM35DZ a arduino, le daremos un umbral de temperatura, y cuando lo sobre pase, el diodo se encenderá, y cuando baje la temperatura el diodo se apagará.  En el lugar del diodo siempre se podría poner un transistor y un relé, y así activar por ejemplo un ventilador, un avisador acústico, etc...

Materiales
Placa de Arduino UNO
1 Resistencia de 330
1 LED de 5mm
1 LM35DZ
Protoboard, cables para conexiones y el cable USB para conectar arduino al PC y además sirve de alimentación

Esquema

En el circuito tenemos el LM35DZ, alimentando por el propio arduino, si hubiese que conectar más habría que hacerlo con una fuente externa. La salida del propio LM35DZ la hemos conectado a la entrada analógica A0 y el díodo LED y su Resistencia de 330 ohmios la hemos conectado a la salida 11 y a GND.Antes de meternos con el código debemos hacer unos cálculos.  Lo primero es saber la tensión que arduino va a leer en cada lectura.

Montaje


Código
El fabricante en el datasheet nos dice que la salida de tensión del LM35DZ es de 10mV por cada grado de temperatura y además sabemos que nuestro arduino mide en las puertas analógicas un máximo de 1024, para 5V y un mínimo de 0 para 0V, por tanto para una lectura dada, el valor en voltios de la medida será

(5/1024) = 0,004 Voltios en cada valor de la lectura

Para saber cuantos voltios hay en un momento dado, multiplicamos por el valor de la lectura en ese momento en A0.

(5/1024) * lectura = Voltios presentes en el pin A0 

y como cada voltio equivale a 100mV

1V/100mV = 0,01º en cada valor de la lectura.

Para obtener la temperatura en grado Celsius, debemos multiplicar los voltios presente en el pin A0 por 100 

(5/1024) * lectura * 100 = Temperatura en grados Celsius

Ej:Para 0 (5/1024)*0*100 = 0º C
    Para 1 (5/1024)*1*100 = 0,4º C
    Para 10 (5/1024)*10*100 = 4,8º C
    Para 15 (5/1024)*15*100 = 7,32º C
    Para  25 (5/1024)*25*100 = 12,20º C
    Para  50 (5/1024)*50*100 = 24,41ºC
    Para  75 (5/1024)*75*100 = 36,62º C
    Para  100 (5/1024)*100*100 = 48,82 ºC
    Para  200 (5/1024)*200*100 = 97,65º C

Una vez claro esto, vamos con el código.  Lo primero que hacemos es declarar la variable global tipo entero llamada sensor, que se corresponde con el pin analógico A0 y la inicializamos con el valor 0.  Luego declaramos una segunda variable global de tipo entero llamada umbral, donde le asignamos el valor de umbral que disparará el circuito encendiendo el LED, en este caso, nuestra temperatura umbral es de 37º C.  Este valor hay que ajustarlo en función a la temperatura ambiente donde vaya a trabajar el circuito o donde estemos montando el circuito.
int sensor = 0;
int umbral = 37;

void setup() {
  Serial.begin(115200);
  pinMode(11, OUTPUT);
}

void loop() {
  int lectura = analogRead(sensor);
  float voltaje = 5.0 / 1024 * lectura;  
  float temp = voltaje * 100;
  Serial.print("Temperatura Celsius: ");
  Serial.print(temp);
  Serial.print(", Voltaje: ");
  Serial.print(voltaje);
  Serial.print(", Lectura: ");
  Serial.println(lectura);
  if(temp >= umbral){
    digitalWrite(11, HIGH);
  } else{
      digitalWrite(11, LOW);
    }
    delay(1000);
}

Lo primero que hacemos es declarar la variable global tipo entero llamada sensor, que se corresponde con el pin analógico A0 y la inicializamos con el valor 0.  Luego declaramos una segunda variable global de tipo entero llamada umbral, donde le asignamos el valor de umbral que disparará el circuito encendiendo el LED, en este caso, nuestra temperatura umbral es de 37º C.  Este valor hay que ajustarlo en función a la temperatura ambiente donde vaya a trabajar el circuito o donde estemos montando el circuito.

Llamamos la librería serial, e inicializamos la conexión con el puerto serie, a través de Seria.begin a una velocidad de 115200 baudios, y asignamos el pin 11 como salida digital.


En el loop, declaramos una variable local de tipo entero llamada lectura y le asignamos como valor lo que lea en la variable sensor que es el pin analógico A0.  Luego vamos a crear una variable local de tipo float, para que maneje valores decimales, a la que llamaremos voltaje y le asignaremos la formula para calcular el voltaje en un momento dado.  En la siguiente línea declaramos una tercera variable local tipo float, llamada temp, que se va a encargar de calcular la temperatura multiplicando el valor de la veriable voltaje por 100. A continuación los serial.print, nos va a permitir monitorizar y conocer en cada momento los valores de temperatura, voltaje que le corresponde a esa temperatura y lectura en el pin A0 que le corresponde a esa misma temperatura. Y para finalizar utilizaremos la instrucción if, para encender y a pagar el LED, cuando se den las condiciones adecuada para ello.  Si (if) la temperatura es mayor o igual que la que hemos asignado a la variable umbra escribe un HIGH en el pin 11, lo cual enciende el LED. sinó (else) escribe un LOW en el pin 11, lo cual apaga el LED, espera un segundo y empieza de nuevo. El delay, va ha servir para el los valores aparezcan en el monitor del puerto serie cada segundo, si no, no podríamos leerlos.


Importante:  En la línea donde calculamos el voltaje hemos escrito 5.0 y no 5.  Esto es para evitar que C++ intente hacer una división entre enteros y nos desprecie los decimales.Si disponéis de un pequeño ventilador de 5V, de los que suelen tener en las tiendas de informática (o si desmontáis un equipo viejo), sería fácil cambiar el LED por ese ventilador  y orientarlo hacia el sensor.

Fijando un umbral superior y otro inferior podemos escribir un programa que arranque o pare el ventilador cuando la temperatura se sale de los márgenes fijados. Habríais conseguido, de un modo muy sencillo, una regulación de temperatura con un sensor y un ventilador.

En Europa estamos bastante acostumbrados a los grados Celsius desde pequeños, pero en América las medidas de temperatura en grados Fahrenheit son habituales. Así que vamos a modificar nuestro programa para que mida en ºF.
La forma de convertir una temperatura medida en Celsius a Fahrenheit es:

TempF = 9/5 * TempC + 32

Veamos el mismo código pero le hemos añadido la temperatura en grados Fahrenheit, y su monitorización en el monitor del puerto serie junto a la temperatura en grados Celsius.
int sensor = 0;
int umbral = 37;

void setup() {
  Serial.begin(115200);
  pinMode(11, OUTPUT);
}

void loop() {
  int lectura = analogRead(sensor);
  float voltaje = 5.0 / 1024 * lectura;  
  float temp = voltaje * 100;
  float tempF = (9/5) * temp + 32;
  Serial.print("Temperatura cCelsius: ");
  Serial.print(temp);
  Serial.print("Temperatura Fahrenheit: ");
  Serial.print(tempF);
  Serial.print(", Voltaje: ");
  Serial.print(voltaje);
  Serial.print(", Lectura: ");
  Serial.println(lectura);
  if(temp >= umbral){
    digitalWrite(11, HIGH);
  } else{
      digitalWrite(11, LOW);
    }
    delay(1000);
}