Dos sensores de temperatura para sobrevivir a la congelación
Ufff se empieza a notar el frío, ¿no? Bueno igual estoy exagerando porque he tenido días peores pero ya sabes… hay que introducir el tema como sea.
Y hoy el tema es la temperatura, medirla con y sin elementos externos. Eso implica más o menos baratos… aunque la verdad es que los sensores de temperatura son baratos, no tengas miedo. Bueno si vas a comprar un termistor PT1000 de 4 hilos ahí estamos hablando de unos 20€… pero no vamos a trabajar con cosas tan precisas hoy…
El sensor de temperatura interno de Arduino
Empiezo por lo barato: no comprar nada de nada. Y es que Arduino esconde en su interior un termómetro. ¿Para qué? Para evitar sobrecalentamientos. Tu ordenador, si llega a temperaturas elevadas lo que hace es bloquearse la pantalla y reiniciarse para intentar relajar al procesador y así enfriarlo.
Arduino también controla eso. Por ejemplo si tuvieses tu Arduino en una caja sin ventilar en una playa podría ser que la temperatura fuese excesiva. Antes de quemarse, Arduino se para. Cosas que se hacen por seguridad, ya tu sabeh.
Pues lo mejor es que para acceder al termómetro ese que tiene Arduino no hay que estudiar una ingeniería ni entender cómo funcionan los pines de Arduino por dentro. La solución es muy sencilla porque es una información básica del sistema.
Una información que solamente se lee, no se modifica ni se toca. Eso sí, que no me llamen a mi para programarlo porque ahí uno se vuelve loco. Pero bueno… alguien en Arduino ya pensó eso y han desarrollado este código para ello:
void setup() { Serial.begin(9600); Serial.println(F("Sensor de Temperatura Interno")); } void loop() { // Show the temperature in degrees Celsius. Serial.println(GetTemp(),1); delay(1000); } double GetTemp(void) { unsigned int wADC; double t; // The internal temperature has to be used // with the internal reference of 1.1V. // Channel 8 can not be selected with // the analogRead function yet. // Set the internal reference and mux. ADMUX = (_BV(REFS1) | _BV(REFS0) | _BV(MUX3)); ADCSRA |= _BV(ADEN); // enable the ADC delay(20); // wait for voltages to become stable. ADCSRA |= _BV(ADSC); // Start the ADC // Detect end-of-conversion while (bit_is_set(ADCSRA,ADSC)); // Reading register "ADCW" takes care of how to read ADCL and ADCH. wADC = ADCW; // The offset of 324.31 could be wrong. It is just an indication. t = (wADC - 324.31 ) / 1.22; // The returned temperature is in degrees Celsius. return (t); }
Como puedes ver, lo que nos dan es una función llamada GetTemp que se puede llamar dentro de un println para mostrar la temperatura que mide el sensor de temperatura interno de Arduino.
Por qué no mola tanto este termómetro de Arduino…
Vamos a verle algunas pegas al método. La primera y esencial es la medida de la temperatura en sí. Está claro que si mide la temperatura que tiene Arduino pues le va a afectar si el Arduino está en un glaciar o en una playa en pleno Agosto… pero también le va a afectar la corriente que pasa por algo llamado efecto Joule, que dice que si pasa corriente los cables se van a calentar y se va a generar calor.
Aquí no hay cables pero hay conexiones microscópicas que al final sí crean un aumento de temperatura que nos va a dar una lectura no muy precisa (por no decir errónea…). Por eso siempre es mejor un sensor externo… pero aún hay más.
Para poder medir tienes que esperar 10 minutos a que se enfríe el Arduino y no se tomen valores erróneos. Esto es porque toma la primera temperatura (que es un número) como una temperatura predeterminada y claro si lo has estado usando antes esa temperatura es superior y ya no funciona para medir la temperatura ambiente. O sí funciona pero no mide adecuadamente.
Tercera cosa, si tienes un Arduino Mega despídete, no puedes utilizar esta función.
Información básica sobre Proteción de datos
Responsable ➥ Sergio Luján Cuenca
Finalidad ➥ Gestionar el envío de correos electrónicos con artículos, noticias y publicidad. Todo relacionado con los temas de rufianenlared.com
Legitimación ➥ Consentimiento del interesado
Destinatarios ➥ Estos datos se comunicarán a MailRelay para gestionar el envío de los correos electrónicos
Derechos ➥ Acceder, rectificar y suprimir los datos, así como otros derechos, como se explica en la política de privacidad
Plazo de conservación de los datos ➥ Hasta que se solicite la supresión por parte del interesado
Información adicional ➥ Puedes encontrarla en la política de privacidad y el aviso legal
Utilizando el LM35 como sensor de temperatura
Pero por eso existen los sensores de temperatura externos. En este caso voy a estudiar el LM35. Y para eso utilizamos un datasheet, aquí te lo dejo (Si no sabes que es un datasheet puedes leerlo aquí). Ábrelo, las primeras páginas son de relleno. Lo suyo es ir a la página 3.
Aquí encontramos varias imágenes, dependiendo del tipo de sensor. Resulta que el mismo sensor puede verse en forma de integrado (chip) o en forma alargada. A mí el que más me gusta es el TO-220 y es el que utilizaré:
Como ves, solamente tiene tres patas a conectar en una protoboard y que son muy sencillas: El voltaje (ahora veremos si con 5 Voltios va bien), GND y la señal de salida. Yendo a la página 4 aparece este cuadro maravilloso:
Ahí vemos que el voltaje de entrada recomendado es de 4 a 30V. Nuestro Arduino da 5 Voltios… estamos salvados, sí funciona (¿De verdad pensabas que iba a empezar a hablar de un sensor que no funcionara con Arduino? Me sorprendes…). Luego hay que fijarse que la temperatura de nuestro sensor solamente puede ir de 0 a 100ºC (nuestro sensor es el LM35DT). Ahora veamos esta imagen:
Esto lo que marca son los valores máximos. Si nos pasamos pues se rompe el componente. Ahí aparece un voltaje de salida y dice que el mínimo son 4 Voltios y el máximo 6 Voltios. Eso unido a los 10mA máximos de corriente hacen que se pueda poner en Arduino perfectamente. ¿Dónde? Es un valor analógico así que en un pin analógico…
Da igual que sea el 0 o el 5 pero en uno de esos. Así que con 3 cables ya se puede medir la temperatura exterior. El valor que aparece es un número que va creciendo según crece la temperatura y que irá de 0 a 1023. El porqué ese número es por el número de bits que tiene Arduino para leer datos (10 bits porque 2 elevado a 10 son 1024).
Y podríamos probar un código como este:
int lectura; float voltios; float temp; void setup() { Serial.begin(9600); } void loop() { lectura = analogRead(0); voltios = (lectura*5)/1023; temp = voltios*1000/10; Serial.print(temp); delay(5000); }
Si te fijas bien el código lo que hace es coger los datos del sensor en el pin analógico 0. Luego lo multiplica por 5 Voltios y divide por 1023. Lo del 10 ese que divide aparece en la página 13:
Como puedes ver el voltaje será 10 multiplicado por la temperatura. Por lo que la temperatura será el voltaje dividido entre 10. Lo que pasa es que el cálculo yo lo había hecho en Voltios y la medida debe de estar en miliVoltios. Es por eso que multiplico por 1000 el voltaje, para pasarlo de Voltios a miliVoltios. Y ya nada más, muestro por pantalla y espero 5 segundos para no volver majareta a Arduino.
No sé si hace frío o calor…
Y bueno, aquí termino. Espero que no midas las temperaturas demasiado este invierno porque seguro que algún día te asustas al romper el sensor. Recuerda, ¡no menos de 0ºC!
Te espero en los comentarios, a ver si me visitas XD