Medir temperatura con Arduino y sensor LM35


arduino-LM35

¿Que es un sensor LM35?

El LM35 es un sensor de temperatura digital. 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.

La salida del LM35 es lineal con la temperatura, incrementando el valor a razón de 10mV por cada grado centígrado. El rango de medición es de -55ºC (-550mV) a 150ºC (1500 mV). Su precisión a temperatura ambiente es de 0,5ºC.

Los sensores LM35 son relativamente habituales en el mundo de los aficionados a la electrónica por su bajo precio, y su sencillez de uso.

Precio

Los sensores LM35 son baratos. Podemos encontrar un sensor LM35 por 0,60€ en vendedores internacionales en Ebay o AliExpress.

lm35

Esquema eléctrico

El patillaje del LM35 se muestra en la siguiente imagen. Los pines extremos son para alimentación, mientras que el pin central proporciona la medición en una referencia de tensión, a razón de 10mV/ºC.

arduino-LM35-sensor

Por tanto, el esquema eléctrico que necesitamos es el siguiente.

Anuncio:

arduino-LM35-esquema--electrico

Esquema montaje

Mientras que el montaje en una protoboard sería el siguiente.

arduino-LM35-montaje-electrico

Ejemplo de código

El código necesario para realizar la lectura es simple. Simplemente leemos el valor del tensión mediante la entrada analógica, y traducimos el valor a grados celsius usando la relación 10 mV/C.

Si te ha gustado esta entrada y quieres leer más sobre Arduino puedes consultar la sección Tutoriales de Arduino

Anuncio:

Previous Medir vibración con Arduino y sensor SW-18020P
Next Detector de movimiento con Arduino y sensor PIR
1000
25 Comment threads
16 Thread replies
0 Followers
 
Most reacted comment
Hottest comment thread
20 Comment authors
newest oldest
Carlos

El sensor im35 puede estar en contacto con vapor?

luisllamas

Sí, siempre que no excedas un límite de temperatura, y la humedad no sea suficiente para que condense y forme un cortocircuito entre algún contacto.
/y en general, ten cuidado al mezclar agua con electrónica)

luisllamas

Puedes visualizarlo en pantalla del PC, como vimos en la entrada https://www.luisllamas.es/arduino-puerto-serie/.
O puedes mostrarlo en un LCD, como en https://www.luisllamas.es/arduino-lcd-hitachi-hd44780/
O muchas otras opciones (BCD, LED, TFT's, OLED....)
Depende de las necesidades de tu proyecto.

Omar Segovia Arriola

Una pregunta... soy nuevo en esto, porque se usa (value/1024)*5000?

luisllamas

Forma parte del funcionamiento de las entradas analógicas. Para profundizar puedes consultar el tutorial básico "Entradas analógicas en Arduino" https://www.luisllamas.es/entradas-analogicas-en-arduino/

luisllamas

¿Has copiado el código exactamente? ¿Incluido lo del "float"? Unos saltos tan raros en la medición pueden producirse por usar variables int, cuando necesitas float. (Los "redondeos" hacen que den esos saltos)
Otra opción es que hayas montado algo incorrectamente, que el sensor esté roto, que la entrada analógica esté rota. Revisa el montaje, y prueba en otra entrada analógica.

arturo caballero

saludo, disculpa y para usar un sensor ds18b20....como podria ser el codigo

luisllamas

Tenemos una entrada sobre el DS18B20 en este enlace https://www.luisllamas.es/temperatura-liquidos-arduino-ds18b20/

Mario Pereira

La línea 11 ¿no sería más correcto (value*5000)/1024?

luisllamas

Si te refieres a conceptualmente, para mi no. El value es un integer de 0 a 1023, por lo que lo lógico es ponderarlo a tanto por uno, y después multiplicarlo para escalarlo al valor deseado. Si te refieres a desde el punto de vista de programación, rotundamente no. En tu caso estás perdiendo los decimales, porque a la derecha de la igualdad estás operando con integer, y después haciendo cast a float. En el mio los conservas, porque divides por 1023.0, por lo que fuerzas el cast a float. (En el caso de que prefieras multiplicar, me daría igual… Read more »

Sebastian

Hola. Muy bueno este post. Como podría hacer para poner varios sensores lm35 y algún sensor para medir temperatura de agua.

luisllamas

Te recomendaría que miraras la entrada del sensor DS18B20 https://www.luisllamas.es/temperatura-liquidos-arduino-ds18b20/, que normalmente viene en forma de sonda impermeable, y tiene el bus One_Wire, que permite conectar múltiples sensores

Seba Salinas

Hola como puedo visualizar la temperatura en un LCD ??

luisllamas

Es sencillo, consulta las entradas "Conectar Arduino a un display LCD HITACHI HD44780" https://www.luisllamas.es/arduino-lcd-hitachi-hd44780/ y "Conectar un display LCD HITACHI con Arduino por el bus I2C" https://www.luisllamas.es/arduino-lcd-i2c/

Boris

Una pregunta porque dividís por 1023.0 en vez de 1024.0 si es de 10 bit?Consulto porque estuve haciendo las prueba y e cierto que da un valor mas exacto usando el 1023.0

luisllamas

Porque en un ADC de N bits tienes 2^N niveles, y el rango de medición es de 0 a 2^N-1. En este caso, de 0 a 1023.
(Creo que te habías olvidado de que empezamos a numerar en 0)

Para más información consulta la entrada sobre entradas analógicas en Arduino https://www.luisllamas.es/entradas-analogicas-en-arduino/

francisco

Hola perdona, creo que lo más correcto es dividir por 1024 que son los diferentes niveles posibles con 10 bits. Es cierto que los valores "numéricos" que representan esos niveles van desde 0 hasta 1023, pero son 1024 niveles entre los que dividir el valor máximo.
Te ruego me corrijas en caso contrario. Disculpa y gracias, muy bueno el post.

luisllamas

No hay nada que perdonar, pero lo que planteas no es correcto. En 1024 niveles, solo tienes 1023 intervalos entre ellos, y tú estás dividiendo entre intervalos, no entre puntos (lo cuál ni siquiera tendría un sentido matemático). Créeme, lo correcto es dividir entre N^2-1 intervalos

Te lo planteo de una forma alternativa. Tu quieres linealizar la medición entre 0.0 - 1023.0 a un rango de 0.0 - 1.0, para que al multiplicar por 5V, obtengas un valor entre 0.0 - 5.0V. Si divides entre 1024, nunca llegarás a tener 1.

luisllamas

Sí, puedes registrarlas en la eeprom interna de Arduino. Si necesitas mayor capacidad, puedes usar una eeprom externa, o una tarjeta sd o micro sd. Por último, otra opción es leerlas y almacenarlas en un ordenador.

luisllamas

Hola Oscar
Échale un ojo a la entrada "Generar frío con Arduino y una placa Peltier" https://www.luisllamas.es/arduino-peltier/
Tienes un ejemplo parecido, en tu caso sólo tienes que prescindir de la placa Peltier y dejar sólo el ventilador.

Un saludo

Eñaut Armendariz

Buenas tardes, como se pasan los datos de temperatura registrados de Arduino UNO a una Micro SD? Gracias.

luisllamas

Hola, puedes consultar el tutorial de tarjetas SD y Micro SD en Arduino. https://www.luisllamas.es/tarjeta-micro-sd-arduino/

XFC XFC

Hola! se puede utilizar este sensor para que este dentro de un purificado de aire de cocina?
la idea es que se encienda solo a x temperatura, pero no sé si es mejor otro tipo.
saludos

luisllamas

Te recomendaría que miraras la entrada del sensor DS18B20 https://www.luisllamas.es/temperatura-liquidos-arduino-ds18b20/, que puede adquirirse en forma de sonda impermeable.

Jose ed

Hola que tal, tengo en mente construir un horno de gas con monitoreo y controlador de temperatura la cual, pretendo, alcance 500 °c, contara con una electrovalvula ¿sirve arduino para este fin? y de ser así, ¿que tipo de sensores debería ocupar? Gracias

luisllamas

¡Por supuesto! Sigue leyendo atentamente los tutoriales del blog y pronto serás capaz de realizar ese proyecto sin dificultad.

luisllamas

Ante la duda, haz caso siempre al Datasheet (o en su defecto, en lo que te contemos en el blog :D) La único común para toda la familia LM35 es el la relación 10mV/ºC) El rango de temperaturas (y por tanto, el rango de tensión) depende del modelo y encapsulado, habiendo modelos de 0-70º, 0-100ºC, -40-110ºC y -55-150ºC. No obstante, en general, las mediciones de temperatura por debajo de 0ºC o por encima de 100ºC, suelen requerir más cuidados, por lo que son menos habituales. Por eso, seguramente, lo que indicaban en la página que has visto de que lo… Read more »

felixuco

En el datasheet pone que es 10mV/ºC de 2º a 150º.
no habría que añadir a tu código:

float celsius = 2 + millivolts / 10;

luisllamas

Puedes tantos LM35 como necesites, empleando para cada uno una entrada analógica distinta. Si necesitas más puedes emplear un multiplexor como el CD74HC4067 https://www.luisllamas.es/mas-salidas-y-entradas-en-arduino-con-multiplexor-cd74hc4067/

luisllamas

Pues sin mirar tu código, no te puedo decir. Pero si siempre es más o menos en el mismo intervalo, a mi me "huele" a desbordamiento de variable.

Iván Camilo Herrera Pineda

hola ingeniero nececito ayuda,nececito hacer un proyecto de un ventilador que se active cuando sobre pase los 24 grados como lo programo en arduino y como programo tambien para que el ventilador se mueva,tienes el algoritmo?

luisllamas

Tienes una entrada sobre cómo controlar un ventilador justo aquí
https://www.luisllamas.es/controlar-un-ventilador-con-arduino/

Joel

Hola,

Ante todo, gracias por estos tutoriales tan bien explicados.

He revisado el datasheet del LM35 y dice que para leer el rango completo (-55 a 150) habría que poner una resistencia pull-down a -Vs desde el pin de salida, pero Arduino no tiene pin -5V, alguna solución (no se si poniendolo a GND valdría)? Algún otro integrado que trabaje de 0 a 5V con temperaturas negativas?

Por otro lado, hay alguna razón por la que no usas fmap en este ejemplo? En muchos otros te la veo usar mucho.

Saludos

Daniel

Buenas. Muy buenos los posts. Solo una duda respecto al código, ¿si deseo medir temperaturas negativas que debería hacer?. ¿Tendría que restarle 55 a Celsius? o como variaría el código o el circuito?, pregunto ésto pues cuando te fijas que la lectura mínima (value 0 = 0mV) obtendré una temperatura de 0 ºC, por lo que en el código se trunca la posibilidad de lecturas negativas.

Walter

Hola Luis, quería consultarte lo siguiente: Para medir temperatura de seis bobinas de cobre de un motor brushless casero (experimental), tienen que estar los sensores en contacto permanente con las bobinas..???

Juan Soplin

Hola, se puede usar este sensor para medir la temperatura del suelo?

Arnoldo

Si tuviera que medir temperaturas más altas que sensor me recomendarias

PedroD.

Estoy viendo que dependiendo del modelo de Lm35, su rango de temperatura cambia. Para la versión lm35Dz, parece que el rango es de 0 a 100ºC. ¿Es correcto? Imagino que en el artículo indicas un rango genérico, independiente del encapsulado.
Me gustaría saber, para medir valores negativos, que opinas de los TMP36.

Muchas gracias y un saludo.

felipe

Buen día Senor Luis.
Que diferencia tiene con esta formula?

temp = (5.0 * analogRead(tempPin) * 100.0) / 1024;