Midiendo temperatura con Arduino y LM35

Una de las primeras mediciones que realizaremos con el Arduino será la de temperatura. Para ello utilizaremos el sensor de temperatura LM35.

arduino-LM35-sensor-pines

Materiales

  • Arduino Uno, cable y software de programación
  • Sensor de temperatura LM35
  • Cables de protoboard
  • Protoboard

Este sensor tiene una salida análoga proporcional a la temperatura que registra (pin del centro), de acuerdo a la fotografía de izquierda a derecha los pines son +Vcc, Vout o Analog Out y GND (como referencia en la fotografía y en el diagrama utilizaremos los colores rojo para +5V, verde para la salida y negro para GND (Ground o Tierra).

Circuito

Para conectar el sensor al Arduino el pin +Vcc (rojo) debe conectarse al pin 5V en la sección “POWER” de la placa. El pin Vout (verde) al pin A0 en la sección “ANALOG IN” y el pin GND  (negro) en el PIN GND de la sección “POWER”.

En el siguiente diagrama pueden ver como se realiza la conexión entre el Arduino y el sensor LM35

ArduinoLM35_bb

Nuestro proyecto debe verse así

 

 

Código

El código o sketch que utilizaremos en el Arduino es el siguiente:

// Internetdelascosas.cl
// Script para leer temperatura utilizando un LM35

// Declaracion de variables
float tempC;
int tempPin = 0; // Definimos la entrada en pin A0
void setup()
{
    // Abre puerto serial y lo configura a 9600 bps
    Serial.begin(9600);
}
void loop()
{
    // Lee el valor desde el sensor
    tempC = analogRead(tempPin); 

    // Convierte el valor a temperatura
    tempC = (5.0 * tempC * 100.0)/1024.0; 

    // Envia el dato al puerto serial
    Serial.print(tempC);
    Serial.print(" grados Celsius\n");

    // Espera cinco segundo para repetir el loop
    delay(5000);
}

Este sketch se carga en el Arduino de la misma forma en que cargamos nuestro “Hola Mundo!” que pueden revisar aquí.

Pueden copiar y pegar el código que en la  interfaz para desarrollo de Arduino para Windows se debería ver así

Sketch_Arduino_LM35

Una vez cargado en el Arduino, éste comenzará inmediatamente a sensar y enviará los datos por la puerta serial que podemos monitorear con el “Monitor Serial” que es una de las herramientas que tiene la Interfaz de Desarrollo de Arduino en el menú Herramientas

MonitorSerial

 

En mi computador la puerta serial (o de comunicaciones COM) donde tengo conectado el Arduino es la 28, por eso la ventana dice COM28. La salida que se obtiene es la siguiente

MonitorSerial_2

En el caso de Linux las puertas de comunicación serial se llaman /dev/ttyACMx y en este ejemplo se usa la ttyACM0 , y la salida es idéntica a la de Windows:

¿Fácil no?

Mejoras

El Arduino ya esta enviando los datos de temperatura al puerto serial, hay que leerlos de alguna forma en el computador para un procesamiento posterior, también se debe considerar la factibilidad de enviarlos a la red ya sea local o internet.

Puedes ver como conectar el Arduino a internet en otro de nuestros tutoriales: Capturando datos en MySQL usando Apache + PHP + Arduino y EthernetShield

Author: joniuz

Ingeniero Civil Informático, Universidad de Santiago de Chile. Master of Professional Engineering University of Sydney. En Chile trabajó empresas de servicios internet y telcos como IBM, VTR y Entel. Le gusta la fotografía y el armado de drones, tiene estudios de violín, guitarra eléctrica y sintetizadores que enciende cuando tiene algo de tiempo.

43 thoughts

  1. Hola Joniuz,

    Gracias por publicar este tipo de tutoriales ya que son muy útiles. Ten cuento mi duda para ver si podrías asesorarme. Tengo una duda a la hora de leer los valores de las entradas analógicas. Por lo que he podido leer arduino muestrea la señal analógica conviertiendola en digital con una resolución de 10 bits, es decir 1024 valores (o-5v). Imagino que para cada tipo de sensor variara la forma de calcular el valor físico medido pero te agradecería me aclararas la forma en que has obtenido la temperatura en este tutorial ya que no termino de ver clara la formula tempC = (5.0 * tempC * 100.0)/1024.0;.

    Gracias de antemano y sigue con estos tutoriales ya que nos ayuda a mucha gente. Un saludo.

    1. Estimado. Efectivamente el ADC (o Conversor Análogo Digital) de Arduino es de 10bits, por lo tanto para convertir el valor de lectura en Volts usamos la siguiente expresión. V = (5.0* lectura)/1024.

      El factor adicional que aparece en la expresión es a causa de la especificación del sensor LM35, el que tiene una escala de 10mV/C por lo tanto para obtener la temperatura directamente en grados Celsius debemos multiplicar por 100.

      Si quieres usar otro sensor, cuentanos y te podemos ayudar 🙂

      Referencia:

      Hoja de datos sensor LM35

  2. no funciona, al mandar los datos por bluetooth, ando utilizando un rn42 bluesmirf, y no recibe ni manda datos no se que mas hacer auxilio

    1. Estimado, no tenemos el rm42, asi que por ahora no podemos replicar tu configuración.

      Cuando tengamos un sensor de esos en nuestras manos, escribiremos un artículo.

      ¿Has probado con NFC o XBee?

      Saludos
      JZ

  3. Estimados les cuento me compre la placa arduino Uno y el sensor DS18B20 (link: http://dx.com/p/ds18b20-digital-temperature-sensor-module-for-arduino-55-125-c-135047 )
    Bueno la cuestión es que con montar el código a la placa. Al instante empieza a enviar datos a la puerta serial sin haber ni siquiera conectado el sensor y cuando lo conecto la “medición” cambia aun mas

    Ej que recibo solo al enviar el código a la placa

    445.00 grados Celsius
    370.00 grados Celsius
    371.00 grados Celsius
    383.00 grados Celsius
    384.00 grados Celsius
    380.00 grados Celsius
    377.00 grados Celsius

    1. Prueba desconectando el Arduino de la PC; luego realiza la respectiva conexión del sensor al Arduino. Ahora sí, conecta el Arduino a la PC, carga el código y abre el monitor serial de la interfaz Arduino.

  4. Estimado he solucionado el problema encontre el datasheets del sensor y pude poner los pines en su forma correcta ya que los chinos hacen el modulo desordenado con respecto a los pines reales del sensor en si.

    aqui el datasheets por si alguien lo necesito

      1. Fernando

        Probablemente el fallo esta en el sensor el cual no es de la mejor calidad. Te recomiendo el sensor DS18B20 que es mas preciso.

        Saludos

  5. Estimado.

    Necesito saber donde compraste el sensor LM35 aca en santiago?
    Ya encontré donde comprar el Arduino uno, pero me falta este sensor, ya que por lo que he visto es mas fácil de instalar que otros sensores que requieren de librerias extras (en c++).

    Agradeceria me pudieras ayudar, es para un Trabajo de la Universidad.

    Gracias, espero pronta respuesta.

  6. Estimado, espero pueda ayudarme con mi problema. Compre este sensor de flujo respiratorio http://www.cooking-hacks.com/index.php/airflow-sensor-breathing-ehealth-medical.html
    Va conectado a una plataforma que a su vez esta conectada a arduino, pero en vez de comprar la plataforma replique el circuito descrito en la pagina http://www.cooking-hacks.com/skin/frontend/default/cooking/images/catalog/documentation/e_health/e-Health_v3.pdf
    sin embargo, en el serial monitor me arroja un valor constante, no sensa nada.

    estoy ocupando este
    int val = 0;

    void setup() {
    Serial.begin(9600);
    }

    void loop(){
    val = analogRead(0);//leer el valor del sensor de A0
    Serial.println(val);//Imprime en serial monitor el valor del sensor
    }

    Es un sensor con dos patas, una positiva y otra negativa.

    ojala pueda sugerirme algo

    saludos gracias

  7. estoy en una practica parecida a esta pero con control difuso cuando lee el sensor el resultado lo tengo que mandar a un lcd pero me tiene que sensar frio, tibio, fresco, caluroso. Espero me puedas ayudar gracias

  8. Hola buenas, tengo un problema de software al que no le encuentro solución, quizá alguien me pueda ayudar… Tengo conectado a un pin análogico un sensor de temperatura LM35, al realizar la lectura funciona bien hasta que llega hasta 31,7 grados, a partir de aquí empieza a bajar con un signo menos delante, por ejemplo lo que tendría que ser 33 grados sale -29 grados. Os copio lo que me da:

    Tiempo transcurrido desde el inicio de la medicion 0:1:18
    Posiciones sobre 1024 Bits: T1, 57 ;T2, 544 ;LUZ, 57
    T1 28.32 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:1:25
    Posiciones sobre 1024 Bits: T1, 61 ;T2, 544 ;LUZ, 56
    T1 29.79 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:1:32
    Posiciones sobre 1024 Bits: T1, 63 ;T2, 544 ;LUZ, 57
    T1 31.25 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:1:39
    Posiciones sobre 1024 Bits: T1, 65 ;T2, 544 ;LUZ, 57
    T1 31.74 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:1:46
    Posiciones sobre 1024 Bits: T1, 68 ;T2, 544 ;LUZ, 57
    T1 -30.31 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:1:53
    Posiciones sobre 1024 Bits: T1, 71 ;T2, 545 ;LUZ, 57
    T1 -29.33 Grados Celsius
    Tiempo transcurrido desde el inicio de la medicion 0:2:0
    Posiciones sobre 1024 Bits: T1, 73 ;T2, 545 ;LUZ, 57
    T1 -28.36 Grados Celsius

    Como se puede ver la temperatura se hace negativa pero la posición sobre 1024 Bits que da el pin análogico sigue subiendo hacia arriba, a continuación muestro la formula que tengo en el código para transformar la posición en temperatura:

    Serial.print (“T1″);
    Serial.print (” “);
    Serial.print (float(analogRead(0)*5*100)/1024);
    Serial.print (” “);
    Serial.print (“Grados Celsius”);

    Siendo la posición (analogRead(0)) siempre positiva (0 para 0v y 1024 para 5v) y todos los valores de la formula tambíen positivos no entiendo como puede salir un float negativo. Si alguien puede saber alguna solución se lo agradeceria.

    1. Hola, a primera vista, parece una falla del sensor. El LM35 no se caracteriza por ser muy seguro, yo ya queme dos (conectamos al revés los pines de voltaje) y antes dejar de funcionar, presento medidas irrisorias como 50°C o -20°C en mi casa.

      Ahora estoy usando un sensor digital, es mas estable y el costo no es muy elevado, puedes revisar su especificación en este enlace http://www.internetdelascosas.cl/tienda/index.php?route=product/product&path=71&product_id=68

      Saludos

      1. Solucionado, solo habia que ponerle el “.0” a los float y no hacerlo todo tan a la vez, por partes al principio del programa e fragmentado la formula en partes para darle tiempo y funciona perfectamente. Gracias.

        1. Perfecto, ¿entonces el problema solo era porque tenias los valores de constantes en 5 cuando debería ser 5.0? ¿se marea con eso el compilador? Saludos.

  9. Espero me puedas ayudar: ¿Qu{e tendria que agregar al código para que pueda adicionar un ventilador que se active a una temperatura especifica, como simulando un sistema de refrigeración el cual monitorea la temperatura del sistema?…y tambien, cómo podria modificar los valores de las temperatura Tope de activacion de los ventiladores, la modificación de ese valor Tope deberia hacerla desde una aplicación desde la PC, ni simplemente obtenidno datos de las lecturas de temperatura sino que pueda enviar el valor desde la PC cuando asi el usuario d ela aplicación Pc lo desee?!

  10. Impresionante simple y sencillamente rapido! funciona es exacto y la temperatur ade un hielo es de 4 grados jajaja alomejor lo acomode mal pero funciona y con un encendedor llegue a los 69 antes de prenderme la mano en fuego saludos ! pd. el sensor cuesta 1.5$ dolares!

  11. Hola estas son las lecturas del sensor:
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    76.17 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    75.68 grados Celsius
    Y hacen 26 grados ºC. Ayuda porfavor. Es tan impreciso o se puede solucionar?

  12. Buenos Días.
    Excelente explicación, me gustaria saber si me puedes ayudar para programar el sensor LM35, con unos leds, es decir algo así:
    Se requiere que el led verde esté encendido para temperaturas inferiores a 20 ºC. El led amarillo debe encender cuando se exceda la temperatura de 20ºC pero no pase de 25ºC. El led rojo debe encender cuando la temperatura exceda de 25ºC
    Gracias.

  13. bueno asi alguien me puede ayudar como sacar los numeros negativos del lm 35 en el lcd en el codigo que me ayuden
    lo demas ya tengo me faltaria solo eso

    (Codigo borrado)

  14. Hola, oye me aparece un error que dice “PUERTO SERIAL COM1 NO ENCONTRADO” sabrias decirme como puedo solucionarlo, Gracias

    1. Nathalia, ese error aparece cuando Arduino no esta siendo reconocido por el computador, prueba usando otro puerto USB, cambiando el cable, probando en otro computador, finalmente prueba con otro Arduino.

      Saludos

  15. En el dibujo que publicaste el sensor esta conectado al reves, Es decir con la polaridad invertida. Por lo tanto se me quemo. La proxima vez compara los dibujos con el datasheet de los componentes.

    1. Estimado Pedro, el diagrama de conexión esta correcto, quizá no sabes interpretar bien el datasheet. De todas formas actualizé la imagen del sensor para que quede claro cuales son los pines, a veces el datasheet puede prestarse a confusión, sobre todo el diagrama “bottom view”.

      Esta es una parte del datasheet del sensor LM35 en su formato de plástico TO-92

      LM35 Datasheet

      Saludos

  16. hola soy estudiante de ing.Electronica me gustaria si me pudieras ayudar para mantener estable a 37.7 la temperatura. es que estoy tratando de hacer una incubadora como proyecto. entonces me gustaria que expliques como pudiera mantener la temperatura a 37.7 y si se pasa apagar el foco que calienta y si disminuye encenderlo. ya se como usar el rele solo me gustaria saber como configurar la temperatura con un lm35 gracias.

    1. Hola Jesus, veo que tienes bien claro como controlar la temperatura, pero solo estas viendo el limite inferior, es decir prender el foco cuando baja la temperatura, pero que pasa si la temperatura ambiente es superior a 37.7? debes agregar algun dispositivo de enfriamiento como un ventilador.
      Con respecto a como mantener la temperatura, eso se logra con dos sentencias if: if (temperatura > 37.7) apagar_foco(); … etc.
      Saludos

  17. Buenas

    Yo estoy usando el sensor de temperatura que trae el kit oficial de arduino starter y la verdad funciona bien pero aveces me saca valores de 3000 grados
    la lectura aveces esta bien y marca 27 o 26 por lo que esta bien conectado y tal.

    1. Hola Juan, el sensor LM35 no es muy estable y a veces retorna lecturas falsas, lo ideal es revisar y colocar condiciones “if” para que el programa deseche todas estas lecturas falsas.
      Saludos

      1. Gracias me lo temia que no fuera estable e depurado y el fallo se proboca justo al reiniciar el proceso. Miro la temperatura si esta en un rango abro una tapa con un servo y espero 60segundos tras estos bloqueo de nuevo para desbloquear pulso un boton x segundos y reinicio el proceso. Tras el reinicio ya es cuando siempre me da 300 grados.

        Podrias ponerme un ejemplo de como desechar las medidas falsas ?

        Gracias

  18. buenas tardes soy nueva manejando arduino y necesito una condicional para que un led se prenda cuando el lm35 detecte una temperatura mayor a 30 grados celsius

  19. como agrego el simbolo de ° al serial print

    Serial.print(“°”);
    Serial.print((char)223);

    ninguno de estas dos opciones me funciona

    1. Angel, ¿por qué necesitas agregar este simbolo? La comunicacion serial esta pensada para maquina-maquina, el simbolo grados es para mostrarle al humano que tipo de escala se usa para medir, lo ideal es hacer esta representacion en el software que se encarga de la interfaz, no a nivel de comunicacion entre maquinas, solo estas consumiendo ancho de banda si envias el simbolo “grados” a ese nivel.
      Saludos
      JZ

Deja un comentario

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