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!!!





como siempre facil de entender y bien explicado
un placer leer y aprender con tus tutoriales regata
Gracias a ti por visitar el blog, para eso estamos para transmitir lo que sabemos o aprendemos!
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 !!
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!.
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
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
ahora si me funciona perfecto. Gracias Regata
De nada Alejandro!! me alegro de que te haya servido!! un saludo
disculpa en que carpeta tengo que poner los archivos, es la primera ves que trabajo con arduino
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!!
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!
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!!
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