Domotiza tu casa – Día 6. Leer Temperatura con Arduino

En el día de hoy vamos a trabajar con unos sensores sencillos de temperatura, montaremos un sencillo circuito y haremos que nuestro arduino lea la temperatura y la muestre en su aplicación.

En primer conozcamos el material:

– El sensor(<1€).

El sensor que utilizaré es el LM35 (ojo, no confundir con el LM335) del cual podemos tener su datasheet u hoja de especificaciones para los hispanohablantes en http://www.national.com/ds/LM/LM35.pdf.

OJO MUY IMPORTANTE. ¿Cómo saber qué pata es el positivo, cual el negativo y cual la señal? ¿Qué pensabais ir probando hasta que funcionara? Pues no, solo a alguien con el intelecto de un mosquito se le ocurría hacerlo así, y os explico porqué.

Si cambiais el positivo por el negativo y viceversa, en unos segundos se sobrecalienta el sensor, hasta el punto de poder quemarnos, y deja de funcionar.

De esta manera, aquí el menda del intelecto de mosquito, se cargó tres sensores. El primero por leer la especificación del LM335 y no del LM35, el segundo por ponerlo del revés, y el tercero por creer que el segundo estaba defectuoso y volverlo a probar en el mismo circuito….

Ahora que he captado vuestra atención para las próximas lineas, os enseñaré a identificar las patas del sensor correctamente. Cogiendo el sensor como muestro en la imagen

Cómo usar sensor LM35
Cómo usar sensor LM35

Con la parte curva hacia abajo y las patas mirando hacia vosotros, el pin de la izquierda es el positivo, el de la derecha el negativo o tierra, y el del medio es la señal.

– Resistencia(<1€)

Para el circuito del sensor de temperatura necesitaremos una resistencia de 100K (o lo que es lo mismo una que tenga el código de colores marron, negro, amarillo, dorado)

– Protoboard o tabla de prototipos(<6€)

No es más que una tabla donde montar el circuito de manera provisional para hacer nuestras pruebas y experimentos.

Protoboard
Protoboard

– Accesorios(<3€)

Necesitaremos cables y alicates de corte de momento.

 

El circuito que montaremos tendrá el siguiente esquema:

Esquema circuito LM35
Esquema circuito LM35

Y quedará en nuestra protoboard de la siguiente manera:

Circuito LM35 para Arduino
Circuito LM35 para Arduino

Al lado izquierdo queda el sensor LM35, el cual es alimentado por el cable rojo, que obtendrá la energía desde la salida de 5V de nuestra placa de Arduino, todo y que la alimentación también podría ser externa.

El cable de debajo del rojo es el cable de señal. Esta señal será analógica, es decir, a mayor temperatura mayor voltaje. Esta señal, ha de ser conectada a la entrada A0 de Arduino.

Finalmente, el último cable, el que corresponde a la pata de abajo del sensor en esta imagen, es el negativo o tierra, el cual irá conectado a la toma de tierra de la placa identificada con GND(GrouND o tierra en ingles).

Importante, conectar la resistencia entre la señal y la tierra, de esta manera podremos obtener valores de temperatura negativos (si teneis curiosidad, para más info ver el datasheet del sensor que he puesto en el link del principio de la entrada).

Como conectar circuito sensor LM35 a Arduino
Como conectar circuito sensor LM35 a Arduino

Todo y que la imagen puede engañar el ángulo, vuelvo a destacar, que el cable rojo va conectado al 5V, el negro al GND, y el cable de señal al A0.

Una vez que está todo conectado como se indica en las imágenes anteriores, es momento de empezar a programar. Seguramente con todo lo que habreis hecho en las anteriores entradas del tutorial, lo que programaremos hoy os parecerá bien sencillo.

 

Para empezar, al principio de todo, en las definiciones, justo debajo de los # include y #define de la anterior sesión insertamos lo siguiente:

//Declaro las variables para leer la temperatura
int sensorTemperatura = 0; //Este será el PIN al que conectaré el sensor de temperatura LM35.
int temperatura = 0; //inicializamos el valor de la variable temperatura a cero.

Dentro del setup, incluyo lo siguiente:

//declaro que el pin de la entrada analogica será de lectura
pinMode(sensorTemperatura, INPUT);

Esta temperatura obtenida la quiero mostrar en el apartado de “Balcón”, (por escoger alguno… si vosotros lo quereis colocar en otro sitio sois totalmente libres de hacerlo 🙂  ).

Por lo tanto, dentro de la función “body”, justo después del

else if (modulo == “Balcon”){

colocamos lo siguiente:

float temperatura = getTemperatura(sensorTemperatura);//declaro la variable de tipo “float” (para que pueda tener decimales) y le asigno el valor que me devuelva la llamada a la función de obtener temperatura. Llamo a la función para obtener temperatura y le envio como parámetro el pin al que está conectado el sensor.

 

Ahora una vez que tengo el valor de la temperatura en la variable “temperatura” lo muestro en pantalla dentro de la web de la siguiente manera:

client.println(“<ul><li>Temperatura balc&oacute;n: “);
client.println(temperatura);

client.println(” oC</li><li>Luminosidad: XX</li><li>Humedad:XX</li><li>PH:XX</li><li>Riego programado de: XX a XX, y de YY a YY</li></ul>”);
}

Por lo tanto para no liaros, esto es lo que subtituiria el contenido del apartado de balcon del body:

float temperatura = getTemperatura(sensorTemperatura);
client.println(“<ul><li>Temperatura balc&oacute;n: “);
client.println(temperatura);
client.println(” oC</li><li>Luminosidad: XX</li><li>Humedad:XX</li><li>PH:XX</li><li>Riego programado de: XX a XX, y de YY a YY</li></ul>”);

Una vez que el cuerpo de la web hace la llamada para obtener la temperatura, vamos a realizar que lea el voltaje que nos llega en A0, y nos lo transforme a un número que será nuestra temperatura.

Al final del todo del Sketch (al final del todo del programa =) ), creamos la siguiente función:

float getTemperatura(int sensor){
int valorLectura = analogRead(sensor); //declaramos la variable valorLectura y le asignamos como valor la lectura del sensor que le hayamos dicho que lea.
float temperatura = (5.0 * valorLectura * 100.0)/1023.0; //conversión del voltaje (que va de 0V a 5V) a temperatura.
return temperatura;//retornar la temperatura
}

El factor de conversión sale de que a la entrada analógica le va a entrar un valor de tensión de entre 0 y 5V, lo cual arduino eso nos lo convierte en una escala del 0 al 1023.

¡¡Y con esto ya nuestra página web en la sección de “Balcón” ya nos daría la temperatura que esté captando nuestro sensor!!

Mejora posible:

Muy posiblemente, una de las primeras cosas que podeis el dedo en el sensor para que suba la temperatura y comprobar como sube la temperatura. Luego quitareis el dedo y volverá a a la temperatura ambiente. Luego probareis a soplarle, y también probareis a irle dando a actualizar a la web y vais viendo como a temperatura ambiente, va variando ligeramente la temperatura. Y os preguntareis, ¿Y esto porque es variable? Sencillo. La corriente no es completamente estable, el nivel de precisión del sensor es limitado, y la escala en la que lo mide arduino tampoco es para trabajar con elementos de precisión. Me explico.

Si el sensor abarca desde los -55ºC hasta los 150ºC, esto quiere decir que tenemos un rango de 205 grados por medir. Por lo tanto si esa escala que nos devuelve arduino va de 0 a 1023, quiere decir que 1023/205 = 4,99…  Es decir que de grado a grado solo nos puede dar esos aproximadamente 5 valores. Pero por ejemplo, si queremos captar decimales, de un grado a otro ¡tenemos 10 decimales! Por lo que por ejemplo si el valor 870 de la escala de arduino, corresponde a 25,5ºC, y el valor 871 corresponde a 25,7ºC,  si tenemos 25,6ºC la mas mínima fluctuación nos hará variar dos decimas, cuando sin embargo, la fluctuación es menor.

No puedo mejorar la precisión de arduino ni modificar las características de este sensor. Pero lo que sí que puedo hacer es realizar diversas mediciones y calcular su media. De esta manera, obtendré un valor más estable y más fiable que si solo tomo una lectura. Así que a continuación os pongo otro código para la función de obtener temperatura:

float getTemperaturaPro(int sensor){
int i = 0;
float temperaturas = 0;
float nTemperaturas = 5;

while(i< nTemperaturas){
temperaturas += (5.0 * analogRead(sensor) * 100.0)/1024.0;
i++;
delay(20);
}
return temperaturas/nTemperaturas;
}

Le podeis poner a nTemperaturas, que es el numero de lecturas a tomar, el valor que querais. Cuanto más alto sea nTemperaturas, mayor precisión, pero más se tardará en ejecutarse.

A continuación, si os habeis perdido en alguno de los capítulos anteriores, o teneis algún problema y quereis comparar con el programa del tutorial, os dejo un enlace para descargar el archivo:

houseboxmain-dia6

Espero que este tutorial os haya gustado y espero vuestros comentarios.

 

¡Hasta pronto!

6 Replies to “Domotiza tu casa – Día 6. Leer Temperatura con Arduino”

  1. Hola Pedro,

    Enhorabuena por la iniciativa. A mi me interesa muchisimo todo el tema pero la verdad es que soy un mar de dudas.

    De momento, acabo de pedirme ya mi arduino UNO con algunos LEDs para empezar a trastear con todo ésto.

    La principal….. me va a servir todo ésto para domotizar mi casa ? Me explico… ya sé que se puede, pero lo que yo queria evitar era utilizar ningún tipo de cableado. La función principal que me interesa es la del control de persianas en mi casa.

    Bueno, ya te iré preguntando por aquí.
    Saludos de un seguidor de tu proyecto !

    1. Hola Georg,
      En primer lugar, muchas gracias por tus ánimos! :).
      Respecto a la comunicación, yo tenia pensado hacerlo con un simple emisor y receptor RF433 (http://www.bricogeek.com/shop/modulos-radiofrecuencia/370-kit-link-rf-433-mhz.html) y un microcrontrolador o un Arduino Pro Mini. Esta solución te cuesta unos 10€ del kit rf y 14€ del Arduino, con lo cual, cada dispositivo te sale por unos 24€ + los sensores y actuadores que le quieras añadir, ya que encuentro que es una solución bastante económica.
      Si el dinero no fuera un hándicap, o simplemente quisiera hacer una demo, escogería el ZigBee, y pondría un arduino UNO, todo sería así más fácil. Pero quiero optimizar recursos, no gastar más de lo necesario. Si en cada dispositivo inhalambrico puedo ahorrar 15 – 20 euros, calcula por todas las ventanas, sensores, etc… lo que te puedes ahorrar.

      Yo de momento tengo el Arduino (en mi caso el Mega), la ethernet shield + micro SD un par de kits RF. En breve haré un pedido de un Arduino Mini para ver como funciona este esquema de funcionamiento que planteo.

      Este tutorial lo estoy desarrollando en vivo y en directo, (bueno, voy un par de capitulos por delante para no hacer que nadie se compre nada que luego no vaya a servir….). De esta manera podeis participar con vuestras ideas y descubrimientos. Por ejemplo, David comentaba que le interesaba más algo de sensores, y el último post lo hice sobre lecturas de temperaturas con un sensor LM35, que era más o menos lo que creo que le irá bien.

      Saludos!

  2. Hola David, Seguiré así entonces!! 🙂 Ahora en septiembre aumentaré el ritmo de post considerablemente.
    Yo me cogí el mega porque aparte de este quería hacer otros proyectos y queria tener más entradas y salidas.

    Pero pronto cogeré un Uno y un nano también, porque cuando termine este proyecto domótico se quedará fijo, así podré seguir con otros proyectos que tengo en mente (me encanta el cuadricoptero y hacer cosas con Android!!!).
    De lo del telefonillo de momento ni idea, pero consultaré a algún que otro experto a la vuelta de las vacaciones.
    He estado mirando la web que comentas. Son baratos, sí, pero ves con ojo con las versiones ya que lo que se vende normalmente es la última versión del MEGA(Mega2560) y la que hay en esa web es una versión anterior (Mega1280).
    A mediados de septiembre haré una compra conjunta, si eres de Barcelona y alrededores y te interesa. Házmelo saber.

    Saludos!

  3. Hola, tambien estoy interesado pero veo que lo tienes abandonado…..en fin, espero con mucho interes lo que seguirá. Vi que querias hacer una compra conjunta, yo me apunto tambien. Un saludo.

  4. Hola!
    Siento no haber escrito nada en este tiempo, entre vacaciones, y algun que otro proyecto personal, hace un mes que no escribo. No obstante ya he comprado el material para la siguiente práctica. He comprado un arduino UNO, y unos emisores/receptores de radiofrecuencia para comunicación entre Arduinos. Como esto es algo nuevo para mí estoy experimentando y viendo un poco como va toda la libreria de comunicaciones para hacer el siguiente tutorial. En breve tendreis más cosas!

    Saludos a todos!

    Pedro

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *