04
may
12

Arduino y sensores de temperatura DS18B20


Os traigo un ejemplo de como usar los sensores de temperatura DS18B20 con nuestro Arduino. La ventaja principal que presentan estos sensores es que se pueden conectar hasta 100 dispositivos a un único pin y a una distancia máxima de nuestro Arduino de 200 metros. Dichos sensores emplean el protocolo de comunicación en serie 1-wire diseñado por Dallas Semiconductor.

Pero, ¿en que se basa este protocolo de comunicación? pues básicamente y para no entrar en muchos tecnicismos, es un bus donde disponemos de un maestro y varios esclavos en una sola línea de datos (pin de nuestro Arduino) en la que se alimentan. Por supuesto, necesita igualmente una referencia a tierra común a todos los dispositivos. También debemos conocer que la línea de datos/alimentación debe de disponer de una resistencia de pull-up conectada a alimentación para cuando no se produzca la transmisión de datos tengamos 5 voltios en dicha línea.

En este tipo de sensores podemos encontrar dos tipos de alimentación:

* El primero de ellos alimenta a los dispositivos en modo parásito, esto quiere decir que solo suministra alimentación mientras se realizan las operaciones de conversión de temperatura, se deben puentear las patillas GND y VDD del DS18B20 a GND del Arduino.

* El segundo es alimentación de los sensores mediante una fuente de alimentación externa conectada a la patilla VDD del DS18B20, y la patilla GND al pin GND de Arduino.

Ahora vamos al lío, aquí tenéis el esquema de conexionado de los tres sensores y dos led indicadores de temperatura:

NOTA: Las conexiones a GND de los sensores 2 y 3 están mal en el esquema de Fritzing, tienen que ir donde GND del Arduino.

Como podéis ver uso la alimentación tipo parasito y en el programa que he realizado básicamente indicamos el pin por el que vamos a comunicar nuestros sensores con el Arduino, añadiendo para ello dos librerías, las cuales son OneWire.h y DallasTemperature.h. Leemos la temperatura de los 3 sensores DS18B20 y mostramos mediante el monitor serie dichas temperaturas, además mostramos una temperatura media de las tres, y guardamos la temperatura mínima y máxima para mostrar también. Los diodos led se encienden dependiendo de la temperatura media que tengamos, el led verde se enciende para una temperatura de menos de 22ºC y el led rojo indica una temperatura mayor de 22ºC.

Aquí podéis ver un vídeo del funcionamiento del programa:

Aquí dejo el código:

/*Programa realizado por Regata para tallerarduino.wordpress.com*/
/*Medición de temperatura mediante varios sensores 1-wire DS18B20+*/

#include <OneWire.h>
#include <DallasTemperature.h>

// DQ esta conectado al pin 10 de Arduino
#define ONE_WIRE_BUS 10

// Configuramos para comunicar con otros dispositivos 1-Wire
OneWire oneWire(ONE_WIRE_BUS);

// Indicamos el pin asignado al sensor 1-Wire a DallasTemperature 
DallasTemperature sensores(&oneWire);

int ledverde=11;  //indicamos que le led verde esta conectado en el pin 11 de Arduino
int ledrojo=12;  //indicamos que el led rojo esta conectado en el pin 12 del Arduino
float val=0; // variable donde guardaremos la temperatura leida del sensor
int i;  //variable que contiene el numero de sensores empleados en el caso de ser mas de 1
float tempmin=100;  //Variable donde guardamos la temperatura minima registrada
                    //Le pongo 100 por que en donde lo he probado no llega a esa temperatura
                    //y así puede coger el menor valor de temperatura que aparezca
float tempmax=0;    //Varibale donde guardamos la temperatura maxima registrada

void setup(void)
{
  //Indicamos ledverde y ledrojo como salidas  
  pinMode(ledverde,OUTPUT);
  pinMode(ledrojo,OUTPUT);
  // Iniciamos el puerto serie a 9600 baudios
  Serial.begin(9600);
  // Inicializamos la libreria
  sensores.begin();
  //Ponemos a 0 las salidas ledverde y ledrojo
  digitalWrite(ledverde,LOW);
  digitalWrite(ledrojo,LOW);
}

void loop(void)
{ 
  // call sensors.requestTemperatures() to issue a global temperature 
  // request to all devices on the bus
  float media=0;
  for(i=0;i<=2;i++)
  {
    sensores.requestTemperatures(); //Enviamos el comando para obtener la temperatura  
    Serial.print("Temperatura Sensor ");
    Serial.print(i);
    Serial.print(": ");
    float val =  sensores.getTempCByIndex(i); // Almacenamos la temperatura en la variable val
    media=media+val;  //Vamos sumando para poder calcular la media de las temperaturas
    Serial.println(val);  //Mostramos por puerto serie el valor de la temperatura leida
    if (val<tempmin)
      tempmin=val;
    if (val>tempmax)
      tempmax=val;
  }
    media=media/i;  //Calculamos la media de las temperaturas
    Serial.print("La temperatura media es: ");  //Mostramos la temperatura media de todas las temperaturas
    Serial.println(media);
    Serial.print("La temperatura minima registrada es: ");  //Mostramos la temperatura minima registrada
    Serial.println(tempmin);
    Serial.print("La temperatura maxima registrada es: ");  //Mostramos la temperatura maxima registrada
    Serial.println(tempmax);
    //Si la temperatura media es mayor o igual a 22ºC encendemos el led rojo y apagamos el led verde
    if(media>=22)
     {
      digitalWrite(ledverde,LOW);
      digitalWrite(ledrojo,HIGH);
     }
     //Si es menor a 22ºC encendemos el led verde y apagamos y el led rojo
     else
     {
        digitalWrite(ledrojo,LOW);
        digitalWrite(ledverde,HIGH);
     }
    Serial.println();
    delay(1500);  //Esperamos 1500ms
}

Os dejo también los documentos necesarios para realizar el montaje:

http://www.mediafire.com/?x5h64n3k82c6pkg

Espero que os guste!!!


13 Respuestas a “Arduino y sensores de temperatura DS18B20”


  1. 1 dewasha1
    05/05/2012 en 11:25

    como siempre facil de entender y bien explicado ;) un placer leer y aprender con tus tutoriales regata ;)

  2. 05/05/2012 en 12:10

    Gracias a ti por visitar el blog, para eso estamos para transmitir lo que sabemos o aprendemos!

  3. 07/05/2012 en 15:28

    Bless.Hope u aware that powering something through parasitic energy risks blowing the uC… Just cause it works doesnt mean its correct ! Im not sure about this case, but most cases its not a good idea.
    Thanks for the blog anyway !!

  4. 07/05/2012 en 16:36

    Hello! Loads of sensors and integrated power parasitic Dallas Semiconductor uses only even support this type of power and from what I read:

    Use of “parasitic power” is not recommended for temperatures above 100 ° C, as the DS18S20 itself can not maintain communication due to the high currents that can exist at these temperatures. For applications where such temperatures are likely, it is emphasized and recommended that the DS18S20 is powered with an external source.

    Thank you for visiting the blog, and sorry for my poor English!.

  5. 16/08/2012 en 22:14

    perdon, pero que actualizacion de arduino utilizaste para el programa, porque intente correrlo en el arduino 1.01 y no pude por un error en la libreria onewire. dice que delay Microseconds no es reconocida. te agradezco la ayuda. gracias

  6. 16/08/2012 en 22:54

    Hola Alejandro!! Para este ejemplo y para todos los que subo yo normalmente empleo el IDE de Arduino 022, es el que mejor me funciona. Un saludo

  7. 24/08/2012 en 23:42

    ahora si me funciona perfecto. Gracias Regata

  8. 24/08/2012 en 23:44

    De nada Alejandro!! me alegro de que te haya servido!! un saludo

  9. 9 bernardp
    03/10/2012 en 20:37

    disculpa en que carpeta tengo que poner los archivos, es la primera ves que trabajo con arduino

  10. 04/10/2012 en 22:06

    Hola bernardp!! Los archivos de las librerías deberías de ponerlos en la carpeta libraries dentro de la carpeta que has descomprimido del IDE de Arduino, con ponerlos ahí descomprimidos y reiniciar el IDE ya estarían disponibles para trabajar. Este ejemplo fue realizado con la versión 022 del IDE de Arduino, no sé si es el mismo que usas tú. Un saludo!!

  11. 10/12/2012 en 17:52

    Hola, me parece perfecto el proyecto que planteas xq es justo lo que andaba buscando, quiero medir la temperatura de mi cuarto (10×10 metros) con 6 sensores, tengo una pregunta, al principio dices que se pueden poner los sensores a 200 metros de distancia…que tan cierto es esto? no pierdes tensión en los cables? tengo que usar la alimentación extra en vez de la parásita?.

    Mi idea es poner 6 sensores conectados por cables en donde cada DQ de los sensores estaría a 30metros del arduino. es esto posible?.

    Espero tu respuesta y es excelente el post! :)

  12. 13/12/2012 en 20:47

    Hola Tiago!! Por lo que tengo entendido y leido por ahí, el bus 1-wire soporta bastante distancia, aproximadamente 300 metros, he buscado en libros y por internet y he visto esto que te comento. Yo creo que para medir la temperatura de tú cuarto, este proyecto te va perfecto, alimentando de manera parásita, no creo que vayas a tener ningún problema. De todos modos haz alguna prueba y si puedes nos comentas los resultados por aquí, por si a alguien más le sirven tus pruebas. Un saludo!!

  13. 19/02/2013 en 15:14

    Excelente. Estoy por realizar un proyecto similar, 1 Cuarto de 10 x 10 con 6 Sensores, los cuales deben de alcanzar 60° y mantenerse durante media hora, la opcion de los LED que muestras es interesante porque mientras no llege a los 60° el LED o Torreta Verde estaria Activo, Cuando la Temperatura sea Igual o Mayor a 60° el LED o Torreta Rojo se Activaria. Toda esta Informacion Necesito almacenarla para despues imprimirla donde requiero Fecha, Hora, Min, Seg, Temp.Sensor1, Temp.Sensor2, Temp.Sensor3, Temp.Sensor4, Temp.Sensor5, Temp.Sensor6.
    Seria posible Guardar esta informacion en un Modulo SD en Arduino y Tambien que la comunicacion sea a traves de Ethernet. comento este ultimo tema de Ethernet porque mis cuartos estan a mucha distancia de mi oficina y pretendo poner una red Inhalambrica para exteriores seria posibre? Yo vivo en mexico y no se que tan dificil seria conseguir este materia que tu utilizastes. Saluos…Ing. Mayo


Deja un comentario

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Conectando a %s


Visitas al blog

  • 201,522 veces

Escribe tu dirección de correo electrónico para suscribirte a este blog, y recibir notificaciones de nuevos mensajes por correo.

Únete a otros 500 seguidores

Cuenta oficial @tallerarduino

Tweets por @MrRegata

Tweets por @0xDA_bit

Posts mejor valorados:


Seguir

Recibe cada nueva publicación en tu buzón de correo electrónico.

Únete a otros 500 seguidores

%d bloggers like this: