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

Ante las preguntas de varios visitantes del blog, he estado mirando la forma de leer los sensores a través de su dirección de dispositivo, ya que bien podemos tener distintos sensores colocados en varios sitios y queremos leer independientemente cada uno de ellos. Un ejemplo de dirección de dispositivo de estos sensores puede ser {0×28, 0xC7, 0xE8, 0×06, 0×05, 0×00, 0×00, 0xDC}. Arriba hemos visto la forma de leer los sensores por Index, que para varios sensores la verdad no es muy recomendado ya que la propia librería se encarga de asignar la posición de los sensores para ser leídos, por eso vamos a trabajar con la dirección específica para cada sensor y así tener el control sobre ellos.

Lo primero que vamos a tener que hacer es detectar cual es la dirección del dispositivo, para ello conectamos el sensor a nuestro Arduino (en este caso he realizado la prueba con un Arduino Mega 2560, pero vale con cualquier otro Arduino, lo único que tenéis que cambiar es el pin donde conectamos el sensor):

DS18B20 Address

El código para obtener la dirección del sensor es el siguiente:

/*Programa realizado por Javier Couto Rego (Regata) para www.tallerarduino.wordpress.com

Programa de lectura de sensores de temperatura DS18B20 de Dallas Semiconductor a través de
su direccion de dispositivo en lugar de lectura indexada.*/

//Incluimos las librerias para controlar los sensores de temperatura
#include <OneWire.h>
#include <DallasTemperature.h>

//Estoy trabajando con un Arduino Mega, indico que los sensores estan conectados al pin 33
#define ONE_WIRE_BUS 33
OneWire oneWire(ONE_WIRE_BUS);  // Configuramos para comunicar con otros dispositivos 1-Wire
DallasTemperature sensores(&oneWire); // Indicamos el pin asignado al sensor 1-Wire a DallasTemperature 
DeviceAddress Sensor;  // Array donde almacenamos la direccion del sensor DS18B20

void setup(void)
{
  Serial.begin(9600);  //Iniciamos la comunicacion serie a 9600 baudios
  Serial.println("Comprobación Direccion Sensores DS18B20:");
  sensores.begin();  //Iniciamos la libreria para la lectura de los sensores
  //Obtenemos la direccion del sensor de temperatura
  if (!sensores.getAddress(Sensor, 0)) 
    Serial.println("Imposible encontrar direccion del sensor.");
}

//Funcion que muestra la direccion del sensor de dicha direccion
void Mostrar_Direccion(DeviceAddress direccion)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (direccion[i] < 16) Serial.print("0");
    Serial.print(direccion[i], HEX);
  }
}

void loop(void)
{ 
  //Mostramos la direccion del sensor
  Serial.print("Direccion del sensor: ");
  Mostrar_Direccion(Sensor);
  Serial.println();
  delay(1000);
}

Un ejemplo de uso de estos comando con la librería DallasTemperature y 5 sensores DS18B20:

Ejemplo DS18B20 5 Sensores

El código es:

/*Programa realizado por Javier Couto Rego (Regata) para www.tallerarduino.wordpress.com

Programa de lectura de sensores de temperatura DS18B20 de Dallas Semiconductor a través de
su direccion de dispositivo en lugar de lectura indexada.*/

//Incluimos las librerias para controlar los sensores de temperatura
#include <OneWire.h>
#include <DallasTemperature.h>

//Estoy trabajando con un Arduino Mega, indico que los sensores estan conectados al pin 33
#define ONE_WIRE_BUS 33
                              
OneWire oneWire(ONE_WIRE_BUS);  // Configuramos para comunicar con otros dispositivos 1-Wire
DallasTemperature sensores(&oneWire); // Indicamos el pin asignado al sensor 1-Wire a DallasTemperature 

//Indicamos las direcciones de los distintos sensores
DeviceAddress S1 = {0x28, 0xC7, 0xE8, 0x06, 0x05, 0x00, 0x00, 0xDC};  //Sensor 1
DeviceAddress S2 = {0x28, 0xD7, 0xF2, 0x07, 0x05, 0x00, 0x00, 0xC9};  //Sensor 2
DeviceAddress S3 = {0x28, 0xC4, 0xF0, 0x07, 0x05, 0x00, 0x00, 0x48};  //Sensor 3
DeviceAddress S4 = {0x28, 0xC9, 0xB6, 0x07, 0x05, 0x00, 0x00, 0x77};  //Sensor 4
DeviceAddress S5 = {0x28, 0x8D, 0xE9, 0x06, 0x05, 0x00, 0x00, 0xAB};  //Sensor 5

void setup(void)
{
  Serial.begin(9600);  //Iniciamos la comunicacion serie a 9600 baudios
  sensores.begin();  //Iniciamos la libreria para la lectura de los sensores
}

//Funcion que muestra la direccion del dispositivo de dicha direccion
void Mostrar_Direccion(DeviceAddress direccion)
{
  for (uint8_t i = 0; i < 8; i++)
  {
    if (direccion[i] < 16) 
      Serial.print("0");
    Serial.print(direccion[i], HEX);
  }
}

//Funcion que muestra la temperatura en grados centigrados del sensor de dicha direccion
void Mostrar_Temperatura(DeviceAddress direccion)
{
  float tempC = sensores.getTempC(direccion);
  Serial.print("Temperatura: ");
  Serial.print(tempC);
}

//Funcion que muestra la resolucion del sensor de dicha direccion
void Mostrar_Resolucion(DeviceAddress direccion)
{
  Serial.print("Resolucion: ");
  Serial.print(sensores.getResolution(direccion));
  Serial.println();    
}

//Funcion que muestra los datos del sensor de dicha direccion
void Mostrar_Datos(DeviceAddress direccion)
{
  Serial.print("Direccion del dispositivo: ");
  Mostrar_Direccion(direccion);
  Serial.print(" ");
  Mostrar_Temperatura(direccion);
  Serial.println();
}

void loop(void)
{ 
  Serial.println("Comprobación Direccion Sensores DS18B20:");
  //Podemos ver el numero de dispositivos que estan conectados al bus 1-Wire
  Serial.print("El numero de dispositivos es: ");
  Serial.println(sensores.getDeviceCount(), DEC);
  //Podemos comprobar si el sensor esta alimentado en modo Parasito
  Serial.print("Alimentacion en modo Parasito: "); 
  if (sensores.isParasitePowerMode()) 
    Serial.println("ON");
  else 
    Serial.println("OFF");
  Serial.print("Direccion Sensor 1: ");
  Mostrar_Direccion(S1);
  Serial.println();
  Serial.print("Direccion Sensor 2: ");
  Mostrar_Direccion(S2);
  Serial.println();
  Serial.print("Direccion Sensor 3: ");
  Mostrar_Direccion(S3);
  Serial.println();
  Serial.print("Direccion Sensor 4: ");
  Mostrar_Direccion(S4);
  Serial.println();
  Serial.print("Direccion Sensor 5: ");
  Mostrar_Direccion(S5);
  Serial.println();
  //Establecemos la resolucion para cada sensor, PRECISION es a 9 bits
  sensores.setResolution(S1, 9);  //Resolucion a 9 bits 0.50 ºC
  sensores.setResolution(S2, 9);  //Resolucion a 9 bits 0.50 ºC
  sensores.setResolution(S3, 10); //Resolucion a 10 bits 0.25 ºC
  sensores.setResolution(S4, 11); //Resolucion a 11 bits 0.125 ºC
  sensores.setResolution(S5, 12); //Resolucion a 12 bits 0.0625 ºC
  //Si queremos mostrar la resolucion que tiene cada sensor:
  Serial.print("Resolucion Sensor 1: ");
  Serial.print(sensores.getResolution(S1), DEC); 
  Serial.println();
  Serial.print("Resolucion Sensor 2: ");
  Serial.print(sensores.getResolution(S2), DEC); 
  Serial.println();
  Serial.print("Resolucion Sensor 3: ");
  Serial.print(sensores.getResolution(S3), DEC); 
  Serial.println();
  Serial.print("Resolucion Sensor 4: ");
  Serial.print(sensores.getResolution(S4), DEC); 
  Serial.println();
  Serial.print("Resolucion Sensor 5: ");
  Serial.print(sensores.getResolution(S5), DEC); 
  Serial.println();
  sensores.requestTemperatures();  //Enviamos el comando para obtener los datos de los sensores
  //Mostramos los datos de todos los sensores
  //Llamamos a la funcion Mostrar_Datos indicando la direccion del sensor que queremos leer
  Serial.print("Sensor 1 --> ");
  Mostrar_Datos(S1);
  Serial.print("Sensor 2 --> ");  
  Mostrar_Datos(S2);
  Serial.print("Sensor 3 --> ");
  Mostrar_Datos(S3);
  Serial.print("Sensor 4 --> ");
  Mostrar_Datos(S4);
  Serial.print("Sensor 5 --> ");
  Mostrar_Datos(S5);
  delay(2000);  //Retardo de 2 segundo
}

Espero que os guste!!!

Si te ha servido de ayuda esta entrada, puedes realizar un donativo para agradecer el tiempo que dedico al blog y ayudar a hacer más entradas.

donativo_paypal


43 Responses to “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

  14. 05/07/2013 en 0:28

    Hola, está muy bien el tutorial que has hecho pero me queda una duda, como reconoces cual es el sensor 1, el 2 etc. por ejemplo si tengo un sensor en la cocina, otro en el salón y otro en la habitación, cuando lee el sensor 1 como se si es el de la habitación, la cocina o el salón.
    Gracias por tu interes

  15. 05/07/2013 en 12:49

    Hola yanche!!

    He estado modificando el post sobre los sensores DS18B20 y he añadido la pregunta que me haces, ya que para explicar en un comentario sería algo más lioso, así también sirve de ayuda para las demás personas, que como tú estén interesados en controlar los sensores a través de su dirección de dispositivo. Espero que se entienda bien y que te sirva de ayuda para poder continuar con tú proyecto.

    Un saludo!!

  16. 05/07/2013 en 23:29

    Regata Gracias, se entiende perfectamente, y sobre todo agradecerte la rapidez que te das en contestar

    Un saludo

  17. 17 RMSAIS
    06/07/2013 en 1:03

    En la red que formaste, si se daña un sensor y se reemplaza. El nuevo sensor mantendra la misma direccion del que se dañó? Si apago el sistema y lo prendo de nuevo. Las direcciones se mantienen igual? Te lo menciono por que me gustaria poner de estos sensores a mi sistema donde tengo que medir la temperatura de 6 cuartos, por lo que el mantener siempre la misma direccion en cada sensor es muy importante.

  18. 06/07/2013 en 13:34

    Hola RMSAIS!!

    Cada sensor trae una única dirección, así que si apagas el sistema mantendrán esa dirección, en cambio si se daña alguno de los sensores, tendrás que cambiar la dirección del sensor a sustituir por la dirección del nuevo sensor.

    Un saludo!!

  19. 19 dboodb
    10/07/2013 en 20:59

    Me pueden explicar que es la dirección, de que sirve, por que usarla, y sus ventajas y desventajas.

  20. 14/07/2013 en 11:54

    Hola dboodb!!

    Mira la dirección es como si fuera el nombre del dispositivo, cada uno trae una distinta y así puedes comunicarte de una manera mas eficiente y más controlada con los sensores. Un ejemplo puede ser: imagínate que quieres controlar la temperatura de diferentes habitaciones en tu casa y también controlar la temperatura en el exterior de la misma, por tanto vas a tener varios sensores de temperatura repartidos por las distintas habitaciones y en el exterior, ahora bien, si no emplearas el uso de las direcciones de los dispositivos te sería bastante laborioso ir determinando que sensor está en cada habitación y en el exterior, ya que la librería al trabajar sin direcciones se comunica con los sensores dándoles un orden aleatorio y que puede variar según el sistema. Pero al usar estas direcciones (cada sensor DS18B20 va a tener una diferente) vas a saber en cada momento con que sensor te estas comunicando y así en el programa tener todo más ordenado y de manera más eficiente. En este post explícamos como obtener la dirección para cada sensor, por tanto vas a poder realizar una identificación de dichos sensores quedando así:

    DeviceAddress Sensor_Cocina = {0×28, 0xC7, 0xE8, 0×06, 0×05, 0×00, 0×00, 0xDC}; //Sensor que se encuentra en la cocina
    DeviceAddress Sensor_Salon = {0×28, 0xD7, 0xF2, 0×07, 0×05, 0×00, 0×00, 0xC9}; //Sensor que se encuentra en el salon
    DeviceAddress Sensor_Dormitorio = {0×28, 0xC4, 0xF0, 0×07, 0×05, 0×00, 0×00, 0×48}; //Sensor que se encuentra en el dormitorio
    DeviceAddress Sensor_Baño = {0×28, 0xC9, 0xB6, 0×07, 0×05, 0×00, 0×00, 0×77}; //Sensor que se encuentra en el baño
    DeviceAddress Sensor_Exterior = {0×28, 0x8D, 0xE9, 0×06, 0×05, 0×00, 0×00, 0xAB}; //Sensor que se encuentra en el exterior de la casa

    De esta manera puedes tener identificado mucho mejor cada sensor a través de su dirección de dispositivo. Las ventajas son la eficiencia en la programación, ya que en todo momento tienes identificado los sensores y de la otra forma (sin dirección) la librería se encarga de establecer el orden aleatoriamente, es decir en referencia al ejemplo, puede que salga el orden correcto de los sensores o puede que salgan todos desordenados.

    En cuanto a mi experiencia, recomendaría el uso de la dirección, ya que hasta que no descubrí esto tenía que andar de sensor en sensor dándoles calor para determinar que sensor estaba leyendo en cada momento, y con el uso de dirección esto está todo controlado. Espero que se entienda, sino dímelo e intentaré explicártelo de otra manera. Un saludo!!

  21. 28/07/2013 en 11:02

    Muy buenas!!!
    Soy un visitante asiduo tu blog en busca de información, muchos dias ando por aki purulando y aprendiendo….
    Quiera presentarte un proyecto para que me dieras tu opinión. Se trata de un sistema domotico basado en arduino, este es totalmente funcional y lleva mucho tiempo funcionando sin ningún tipo de problema, se maneja desde cualquier dispositivo android.

    Entre sus características se encuentran:
    Control de iluminación con control de potencia.
    Control de iluminación on off.
    Control de persianas. Control de toldos.
    Control de climatización con temperaturas de consigna.
    Control de Calefacción con temperaturas de consignas.
    Control de riego automático.
    Programación de horarios.
    Programación de escenas o ambientes.
    Control por voz.
    Posibilidad de control desde fuera de la red local sin ip fija.
    Los dispositivos mínimos para hacer funcionar el sistema son:
    Arduino Mega.
    Arduino Ethernet Shield.
    Real Time Clock Module RTC DS1307
    En el siguiente enlace podeis visitar la web del proyecto en el se colgara toda la documentacion, programas y ejemplos para configurar el sistema.
    http://www.excontrol.es/Domotica-Arduino/

  22. 28/07/2013 en 11:20

    Hola Roberto!! He estado viendo la web del proyecto y este proyecto me parece muy interesante, tengo que echarle un vistazo con más calma al código en cuánto tenga algo de tiempo. La verdad es que es un proyecto que lleva su tiempo realizar si no me equivoco. Si te interesa grabar un vídeo del funcionamiento del mismo podría crear una entrada en el blog para dar a conocer a más gente este gran proyecto de domótica. Me interesaría saber más acerca del mismo, así como conexiones y demás. Desde luego un magnífico proyecto el que has realizado!! Un saludo!!

    PD: Echaré un vistazo al código para entender algo más del proyecto. Gracias por enseñárnoslo!!.

  23. 09/08/2013 en 22:46

    HOLA, quiero decirte que no he podido compilar el código que aparece mas arriba ya que me da error, podrías revisarlo y decirme si te pasa lo mismo, es que quiero adaptar ese código a un proyecto.
    Estoy usando el IDE 1.5.1r2 DE Arduino.
    Desde ya muchas gracias por tu atención, un saludo.

  24. 10/08/2013 en 1:42

    Hola picatilio!! He probado los códigos que aparecen arriba en la versión 1.5.2 (ya que también he descargado la que tu mencionas pero no sé porque no me arranca el IDE) y me han compilado perfectamente tanto para arduino uno, como para arduino mega y para arduino leonardo. ¿Será que estás usando otra placa distinta a estas y por eso te sale el error? Un saludo!!

  25. 10/08/2013 en 1:56

    Si estás usando un arduino Due, creo que he encontrado la solución al error de compilación, vas a tener que sustituir la librería oneWire por esta otra que te dejo: http://www.mediafire.com/?r1f2nrnzehlg5la. La he probado y ahora compila perfectamente para este tipo de placas, así como para el arduino Uno, Mega y Leonardo. Espero que te funcione. Un saludo!!!

  26. 23/09/2013 en 16:49

    Muy buenas otra vez… bueno pues te hice caso y prepare algunos vídeos explicando el funcionamiento del sistema domotico con arduino, si te sigue pareciendo bien lo de hacer una entrada te paso un enlace para que le des un vistazo. … Un saludo.

    http://excontrol.es/Arduino-Domotica-Foro/forumdisplay.php?fid=6

  27. 23/09/2013 en 17:25

    Hola Roberto, claro que me sigue gustando la idea de hacer un post con tu proyecto. Me parece un proyecto muy bueno y muy interesante. Ya había visto los vídeos en el foro de SpainLabs, pero sin tú permiso no me parecía bien publicar el material, en cuanto tenga un rato hago una entrada sobre tu proyecto. Un saludo!!

  28. 28 olivarive
    21/11/2013 en 14:35

    Muy buenos dias, saludos a todos, quisiera hacer una consulta tengo una inquietud y es la siguiente: es posible tener mas de una linea de sensores, es decir puedo yo configurar dos o mas puertos onewire en una misma placa arduino, lo que deseo hacer es un sisterma de termometria para un almacen de granos y necesito varias sondas para leer varios sensores en serie en cada una de ellas.

  29. 29 Silvio
    13/12/2013 en 0:33

    Hola que tal: Estoy muy interesado con arduino, quisiera usar 4 sensores y mostrar simplemente la medicion de cada uno en un LCD 20×4. No estoy muy ducho con la programacion.
    Me podras indicar como arranco?
    Muchas Gracias

  30. 19/12/2013 en 13:49

    Hola olivarive!! Aunque no he probado a realizar lo que comentas con varias líneas de sensores, creo que es posible realizar lo que comentas, añadiendo más líneas en el código como la configuración del pin conectado a la patilla DQ de los sensores, es decir, probando de la siguiente manera:

    // DQ esta conectado al pin 10 de Arduino linea 1 sensores
    #define ONE_WIRE_BUS 10
    // DQ esta conectado al pin 10 de Arduino linea 2 sensores
    #define ONE_WIRE_BUS_2 11

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

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

    Puedes probar este código, ya te digo que no he realizado pruebas, pero puede funcionar correctamente. Si funciona puedes dejar algún comentario por si le sirve a alguien más de ayuda. Un saludo!!

  31. 19/12/2013 en 14:31

    Hola Silvio!! Tu pantalla LCD tiene algún módulo I2C por detrás o es la pantalla solamente con sus 16 pines?, sabes como conectarla al Arduino?

    Te pongo una imagen de como conectarla al Arduino: http://fritzing.org/media/fritzing-repo/projects/h/how-to-connect-a-qy-1602a-lcd-to-arduino-correctly/images/conectar%20un%20lcd%20qy-1602%20a%20un%20arduino%20uno%20r3_bb.png

    En esta imagen también puedes ver un ejemplo de como mostrar información por pantalla, así que primero prueba a mostrar datos por pantalla (un hola mundo! suele funcionar) y posteriormente prueba a mostrar la temperatura de uno de los sensores, prueba a colocar la posición del cursosr en la pantalla para escribir en el centro de la misma, y con eso y el ejemplo que he dejado en esta entrada ya puedes realizar la medida y muestra por pantalla de los 4 sensores que indicas. La verdad es que es muy sencillo, si vas teniendo problemas no dudes en preguntar. Un saludo!!

  32. 32 Jose
    23/12/2013 en 20:26

    Hola Regata

    Ante todo darte las gracias por tus aportes, son fenomenales!!

    En segundo lugar, deseo consultarte, pues no me compila ninguna de las aplicaciones.

    Estoy usando un Arduino Nano V3, y la IDE es de la versión 1.0.5 para Windows, uso el Windows 8.

    Tengo el siguiente error;
    C:\Users\chispes\Documents\Arduino\libraries\DallasTemperature\DallasTemperature.cpp:9:26: error: WConstants.h: No such file or directory

    Estoy utilizando la libreria OneWire que indicas en tu post de fecha 10-08-2013, la más moderna.
    Antes de bajarla y de instalarla, todavia salian más errores.

    Mi tarjeta Nano no es la oficial, es de funduino, aunque no creo que esto impida la compilacion.

    Recibe mis saludos, y gracias por tu dedicación

  33. 33 Ruben
    23/12/2013 en 23:52

    Hola ante todo daros las gracias por explicarlo también… pero tengo un problema, la temperatura real me la muestra bien de 3 sensores… aparte de eso a cada sensor le tengo puesto que me guarde la temperatura máxima y mínima que registra…. eso también lo hace bien pero no se por que motivo, si porque falsea o porque motivo pero pone a veces no se si cada X minutos o por que motivo en temperatura mínima -127 (no estaba en modo parásito) y ahora lo e puesto en modo parásito y lo que fallan son las temperaturas Max, que al principio también las marca bien pero luego pone max 85ºC y es una lectura totalmente imposible…

    un saludo

  34. 24/12/2013 en 1:25

    Hola Jose!!

    Ese error te aparece, porque a partir de la versión 1, los chicos de Arduino han cambiado la cabecera WConstants.h por Arduino.h, y por eso no compila el ejemplo correctamente, esto pasa con muchas librerías antiguas pero se puede solucionar fácilmente. Te pongo como poder solucionar el error y además te voy a poner un enlace con la librería modificada como yo la uso y que funciona perfectamente.

    Para solucionar el error, hay que modificar alguna línea en los archivos .cpp o .h de la librería correspondiente (los encontraras en la carpeta donde tienes guardadas tus librerías para Arduino) (A veces hay que modificar el archivo .h y otras el archivo .cpp), para ello buscas por los archivos la palabra WConstants.h y procedes a sustituir por esto:

    #if ARDUINO >= 100
    #include "Arduino.h"
    #else
    extern "C" {
    #include "WConstants.h"
    }
    #endif

    Al modificar esto la librería ya valdría para usar tanto en versiones anteriores del IDE de Arduino como en las más actuales. Ahora te pongo un enlace para que puedas descargarte la librería tal y como la tengo yo modificada: https://www.mediafire.com/?62bxd9o0byl12kc (si quieres puedes comparar los archivos que te mencioné más arriba con los de esta librería para que veas de manera más sencilla lo que hay que modificar). Un saludo y espero que te funcione, si no intentaremos ver cual puede ser el fallo!!

  35. 24/12/2013 en 1:26

    Hola Ruben!!

    Te comento que a mí alguna vez también me ha pasado este fallo, y creo que era debido a un mal contacto de los pines de datos del sensor. ¿Puedes indicarme como los tienes conectados y si los tienes puestos en una protoboard? Te lo comento porque yo en la protoboard detectaba estos fallos, en cambio al soldarlos a una placa no los detectaba. Tengo una estación que marca temperatura que he diseñado y que lleva un sensor ds18b20 y lleva desde septiembre funcionando de manera seguida y nunca ha dado este fallo. Otro cosa que igual puede ser es el tiempo de consulta de la temperatura, ya que si es muy corto igual el sensor no ha terminado de realizar la lectura y puede fallar por eso. A ver si damos solucionado este problemilla.

    Un saludo!!

  36. 36 Ruben
    24/12/2013 en 18:40

    Pues te comento esta actualmente conectado a un protoboard, probare a soldarlos en una placa y te comento si el fallo era por el protoboard o no, el tiempo tengo tengo puesto un delay de 2 segundo como tu tienes puesto en tu codigo, y otra pregunta, existe la posibilidad de poder alimentarlo con 5v externos al arduino?¿?

    un saludo y gracias compañero

  37. 37 José
    24/12/2013 en 19:12

    Hola Regata,

    ¡¡Feliz Navidad!!

    En el archivo DallasTemperature.h no hay la referencia erronea.

    En el archivo DallasTemperature.cpp si que la hay, y he anotado los cambios que me has indicado.

    He desinstalado el IDE, he reseteado el PC, y he vuelto a instalar el IDE, instalando la libreria modificada y tambien la OneWire del último parche.

    He pegado tus programas, perdón Skeths, y ya los ha compilado sin ningún tipo de error.

    Mañana probare a correr los sketchs en el Arduino Nano, haber si tengo suerte y me funcionan, primero quiero identificar la direccion de los sensores y despues controlarlos individualmente, tomando lecturas.

    Deseo, agradecerte tu dedicación, y prontitud en responder y solucionar el problema,

    ¡Que Dios te bendiga!

  38. 38 JOse
    25/12/2013 en 11:53

    Hola de nuevo Regata,

    He lanzado el sketch para identificar los sensores, y ha funcionado bien, aunque esperaba ver las direcciones de todos los sensores, pero tan solo salia la direccion de un solo sensor.

    No me ha preocupado, pues he ido probando los sensores de uno en uno y así he conseguido la dirección de todos ellos.

    Luego he lanzado, o corrido el tercer sketch, cambiando las direcciones de los sensores, y también ha funcionado de maravilla.

    Tengo los 5 instalados en la protoboard, y le ponia el dedo a un sensor y se ve como sube la temperatura, y al quitarlo, vuelve a bajar, todos han ido bien.

    Bueno, ahora me queda escribir mi propio programa, para controlar las 2 bombas de agua,

    Gracias por tu ayuda, y por el post, o bolg

    José

  39. 39 Manuel
    31/01/2014 en 21:49

    Hola, tengo una pregunta, necesito conectar dos sensores ds1820, pero necesito saber cuando alguno de los dos no esta conectado, me podrias ayudar?? gracias

  40. 40 jose
    01/02/2014 en 21:55

    Hola a todos,
    paso a comentaros un problema que me ha surgido. Tengo identificadas las direcciones de mis sensores y de forma independiente me dan bien la temperatura pero cuando intento hacerlos trabajar en castaca se me queda el programa colgado, no me corre, de echo tengo en el sistema un rtc y ni este me da los datos.
    Lo tengo conectado con alimentación externa, es decir donde no se cortocircuitan a masa dos de las patas de los sensores. A ver si me podéis dar algo de luz.
    Jose

  41. 41 Jose
    02/02/2014 en 2:08

    En el Mail anterior quería decir que al conectar los sensores en “cascada”, es decir varios sensores en bus, no me funciona.
    Gracias
    Jose

  42. 42 Jose
    04/02/2014 en 7:20

    Sigo conjeturando con este tema y me doy cuenta que la topología que utilizo para conectar mis sensores no es en bus como se indica en los manuales si no en estrella, topologicamente es diferente pero a nivel eléctrico es igual, no tiene demasiado sentido porque se consume mucho más cable y se pierde la ventaja de la configuración en bus pero cuando en su día hice la instalación dedique un cable para cada sensor. Podría utilizar una entrada de micro para cada sensor pero consumo más entradas y pierdo la ventaja de trabajar en bus.
    Un saludo
    Jose

  43. 08/04/2014 en 21:38

    Hola a todos,
    Gracias por el aporte.
    Me ha surgido dos dudas, que os puede interesar. A ver si alguno es capaz de resolverlas.
    Primera:
    Imaginarios que en vuestra automatización tenéis 2 o mas sensores. Una función que sería interesante seria controlar cuando uno de los sensores da fallo, o se ha desconectado, y así dar un mensaje de alarma.
    Con la función “getDeviceCount” , me devuelve el numero de dispositivos conectados. Pero si yo desconecto uno, me sigue devolviendo el mismo número que al principio. ¿Alguna idea para resolver esto?
    Segunda:
    Imaginaros que realizáis una automatización para un tercero, que no tiene ni idea de electrónica. Esta automatización consta de 2 o más sensores. Obtenemos las temperaturas mediante las address. Si un sensor se estropea y es necesario remplazarlo, ¿hay alguna manera de cambiar la address del nuevo sensor por la que tenía el sensor averiado? De este modo, la persona solo tendría que comunicarte que sensor se le ha estropeado, y tu solo mandarle el sensor con la dirección cambiada, listo para conectar.
    Un saludo, y gracias por estas entradas tan bien explicadas.


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 )

Google+ photo

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

Conectando a %s


Si quieres ayudar a mantener el blog o su contenido te ha servido de ayuda, puedes realizar una donación

Visitas al blog

  • 405,499 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 1.038 seguidores

Posts mejor valorados:


Seguir

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

Únete a otros 1.038 seguidores

%d personas les gusta esto: