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 {0x28, 0xC7, 0xE8, 0x06, 0x05, 0x00, 0x00, 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):
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:
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.
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
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
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!!
Regata Gracias, se entiende perfectamente, y sobre todo agradecerte la rapidez que te das en contestar
Un saludo
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.
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!!
Me pueden explicar que es la dirección, de que sirve, por que usarla, y sus ventajas y desventajas.
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 = {0x28, 0xC7, 0xE8, 0x06, 0x05, 0x00, 0x00, 0xDC}; //Sensor que se encuentra en la cocina
DeviceAddress Sensor_Salon = {0x28, 0xD7, 0xF2, 0x07, 0x05, 0x00, 0x00, 0xC9}; //Sensor que se encuentra en el salon
DeviceAddress Sensor_Dormitorio = {0x28, 0xC4, 0xF0, 0x07, 0x05, 0x00, 0x00, 0x48}; //Sensor que se encuentra en el dormitorio
DeviceAddress Sensor_Baño = {0x28, 0xC9, 0xB6, 0x07, 0x05, 0x00, 0x00, 0x77}; //Sensor que se encuentra en el baño
DeviceAddress Sensor_Exterior = {0x28, 0x8D, 0xE9, 0x06, 0x05, 0x00, 0x00, 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!!
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/
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!!.
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.
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!!
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!!!
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
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!!
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.
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
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!!
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!!
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
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
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!!
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!!
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
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!
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é
Hola, tengo una pregunta, necesito conectar dos sensores ds1820, pero necesito saber cuando alguno de los dos no esta conectado, me podrias ayudar?? gracias
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
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
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
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.
Hola, buenos días. Quisiera saber si hay forma de ver la trama de bits que envía el sensor al arduino! Muchas gracias
Hola Persi, creo que en la propia librería del DS18B20 puedes imprimir por puerto serie los valores del data que guarda el arduino cuando lee el sensor. Supongo que te referirás a eso.
estimados compañeros, tengo una situacion, por error al limpiar mi camara termografica dañe el sensor 18b20, y lo rompi, consulta si lo consigo en la electronica, solo lo reemplazo? o tengo hay que programarlo? la verdad que no se que hacer…
Buenas tardes estoy usando del otro tipo de sensor ds28b20 sumergible en el agua,,,, tengo un problema que en al momento de correr el programa el led verde enciende cuando el agua esta aun temperatura de 22 grados y el led rojo no enciende cuando la temperatura es mayor a los 22 grados , es como si no le estuviera mandando señal del Arduino no ce si me podrias ayudar en eso y muy biena explicacion.. saludos ojala puedas responder