CAP 6- Monitorización de la temperatura

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
Pues sigamos avanzando, ahora vamos a monitorizar la temperatura del agua , la temperatura ambiente , del sump, etc etc.
El integrado de Dallas, DS18B20, es una sonda de temperatura digital con una exactitud muy alta y por un precio muy bueno por eso es elegido en casi todos los proyectos basados en la plataforma Arduino.
Una de las características que lo hacen aún más importante es su interfaz Onewire (un cable) que le permite interconectar muchas sondas de temperatura en seria utilizando una sola entrada digital de nuestra placa Arduino, pudiendo de esta manera monitorizar la temperatura del salón, del sump, y del agua por ejemplo utilizando una sola entrada digital de nuestra placa Arduino.
A cada una de las sondas la irá asignando un número de posición (1,2,3...) y con solo especificar que lectura queremos conocer sabremos la temperatura de la sonda indicada.

Hardware:
Es muy sencillo, solo necesitamos una sonda Ds18B20 y una resistencia de 4K7ohm.
La resistencia nos servirá para dar "corriente" al pin digital que alimentará a las sondas, debemos colocarla entre el pin digital en el que conectaremos la sonda y el pin de 5v de nuestra placa.
La sonda la podeis encontrar en 2 versiones, como circuito integrado con 3 patitas o bien como sonda sumergible, aquí os encontrareis 3 cables sueltos.
- Sonda como integrado: debemos unir las patitas laterales y conectarlas a Gnd en nuestra placa, y la patita del centro al pin digital de nuestra placa.
-Sonda sumergible: aquí dependiendo de donde la compreis los cables tendrán un color u otro, por lo que debeis ver que corresponde a cada cable, debeis unir Data+VDD(5v) y conectarlo al pin digital de la placa Arduino y por otro lado el cable Gnd a Gnd de la placa

Aqui una imagen ilustrativa:
DS18B20.jpg

En el caso de la placa Shield este es su conector:
shieldtemp.jpg

Software:
Para la lectura de la sonda necesitamos 2 librerias, (Onewire y DallasTemperature)
Lo mejor para saber si hemos conectado bien nuestra sonda es que cargemos uno de los ejemplos que viene.
Una vez que hemos visto que todo funciona correctamente podemos utilizar un código como este , más simplificado:
Código:
//CAP6 Temperatura

//LIBRERIAS
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>// Debemos instalar la libreria LiquidCrystal_I2C en la carpeta "libraries" del arduino IDE
LiquidCrystal_I2C lcd(0x27,16,2);  // direccion i2c(puede variar segun la placa) del LCD y columnas,lineas


#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14 //Conectaremos sonda a pin digital 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/*PINES CONECTADO EN ARDUINO MEGA
ANALOGICOS:

A14 - Potenciometro

DIGITALES:
D14 - sonda ds18b20
D19 - Boton
D20 - SDA I2C  / LCD
D21 - SCL I2C  / LCD

*/

//VARIABLES
byte boton=19, tempagua=14, pot=A14; //declaramos que la variable de los pines donde esta conectado boton y potenciometro
int menupot;// Numero de menu 
byte vboton,menus, menuactual,cambiomenu;//variables para los menus

   
void setup()
{
  
  
//CONFIG PINES  
  pinMode(boton, INPUT);//Inidicamos que es  una entrada 
  pinMode(pot, INPUT);
  pinMode(tempagua, INPUT);
  
  lcd.init();//Inicializamos el LCD
  lcd.backlight();//Encendemos la luz
  lcd.print("CAP6 Temperatura");
  
  delay(2000);//Hacemos una pausa de 2 segundos
  lcd.init();//Al inicializar el LCD tambien borramos la pantalla
 
}

void loop()
{

temperatura();

delay(1000);
}


void temperatura()
{
  
   sensors.requestTemperatures();
   delay(50);
   tempagua = sensors.getTempCByIndex(1);//En este caso si tenemos varias sondas estamos pidiendo que nos muestre kla lectura de la sonda "1"
   lcd.clear();
   lcd.print("T.Agua:");
   lcd.print(tempagua);        
  
}

Luego ya cada uno puede adaptarlo a su gusto, programando unos valores minimos y maximos para que se active un rele para ventiladores, alarmas etc....

Un saludo [email protected]!
Jorge.
 
27 Dic 2008
92
españa
Provincia
madrid
Tengo un problema. Resulta que al poner la sonda y cargar el código me sále en pantalla Temperatura=129..., y si suelto la sonda me marca lo mismo
 

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
  • Iniciador del tema
  • Moderador
  • #3
Debes tener mal conectado el cableado de la sonda ....o no estas conectado la sonda al mismo pin digital que tengas programado
 
27 Dic 2008
92
españa
Provincia
madrid
Tengo tu placa shield que me la cogió Ruba. Y la sonda he juntado amarillo-rojo y el negro al gnd (este pin en tu placa es según la miras la mas cercana al conector de la sonda de ph). El caso es que la cargo el código y me marca directamente en el LCD "t. agua: 129"
 

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
  • Iniciador del tema
  • Moderador
  • #5
Vaya pues si estas usando la shield es raro si...comprueba que este correctamente "pinchada" en la placa arduino.
Si tienes un multimetro comprueba que le llega la señal al pin D14 y que entre D14 y 5V hay una resistencia de 4.7K

Tienes otra sonda para probar??

salu2
 
27 Dic 2008
92
españa
Provincia
madrid
ok. Haré las comprobaciones que dices a ver... También a ver si Ruba me deja sus trastos no sea que tenga algún fallo alguno de los mios... He probado con la sonda del oki que tengo que es de dos cables only y nada tampoco.

He probado a cambiar los cables no sea que los colores difirieran (la sonda es de las que tienes tu que me la dio Ruba también) pero cuando cambio los cables me dice que temperatura 0, y si cojo uno sólo de ellos (ya no me acuerdo si el amarillo u rojo)junto el GND me dice que 85....
Comprobaré y ya iré contando
 
27 Dic 2008
92
españa
Provincia
madrid
Buenas Jorge, he comprobado el pin y además he comprobado con la shield y la sonda de ruba e igual, no me marca la temperatura, me dice que tª 129.??
 

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
  • Iniciador del tema
  • Moderador
  • #9
B.Días y Feliz Año!!
Ok, dejarme que lo reviso con un controlador a ver que está fallando.

Saludos!
 

jmcadsl

Miembro Honorífico
17 Ene 2010
851
España
Provincia
Madrid
  • Iniciador del tema
  • Moderador
  • #11
Solucionado.

Pues el problema efectivamente estaba en el código.
No lo había probado en el controlador porque no lo tenía a mano....

Aquí el código correcto.
Código:
//CAP6 Temperatura

//LIBRERIAS
#include <Wire.h> 
#include <LiquidCrystal_I2C.h>// Debemos instalar la libreria LiquidCrystal_I2C en la carpeta "libraries" del arduino IDE
LiquidCrystal_I2C lcd(0x27,16,2);  // direccion i2c(puede variar segun la placa) del LCD y columnas,lineas


#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 14 //Conectaremos sonda a pin digital 14
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);

/*PINES CONECTADO EN ARDUINO MEGA
ANALOGICOS:

A14 - Potenciometro

DIGITALES:
D14 - sonda ds18b20
D19 - Boton
D20 - SDA I2C  / LCD
D21 - SCL I2C  / LCD

*/

//VARIABLES
byte boton=19, tempagua=14, pot=A14; //declaramos que la variable de los pines donde esta conectado boton y potenciometro
int menupot;// Numero de menu 
byte vboton,menus, menuactual,cambiomenu;//variables para los menus
float temp;
   
void setup()
{
  
  
//CONFIG PINES  
  pinMode(boton, INPUT);//Inidicamos que es  una entrada 
  pinMode(pot, INPUT);
  pinMode(tempagua, INPUT);
  
  lcd.init();//Inicializamos el LCD
  lcd.backlight();//Encendemos la luz
  lcd.print("CAP6 Temperatura");
  
  delay(2000);//Hacemos una pausa de 2 segundos
  lcd.init();//Al inicializar el LCD tambien borramos la pantalla
   
  sensors.begin();
}

void loop()
{

temperatura();

delay(1000);
}


void temperatura()
{
  
   sensors.requestTemperatures();
   delay(50);
   temp = sensors.getTempCByIndex(1);//En este caso si tenemos varias sondas estamos pidiendo que nos muestre kla lectura de la sonda "1"
   lcd.clear();
   lcd.print("T.Agua:");
   lcd.print(temp);        
  
}

Saludos y disculpar la molestias jejeje
 
16 Feb 2016
5
Barcelona
Provincia
Barcelona
Hola,

Lo primero darte las gracias ya que tus tutoriales son muy buenos, y me están ayudando mucho.

Simplemente quería comentar que para poder leer una única sonda, no se tiene que acceder a la posición 1 del vector sino a la 0. Hay que cambiar donde pone
temp = sensors.getTempCByIndex(1);//En este caso si tenemos varias sondas estamos pidiendo que nos muestre kla lectura de la sonda "1"
por
temp = sensors.getTempCByIndex(0);//En este caso si tenemos varias sondas estamos pidiendo que nos muestre kla lectura de la sonda "1"

saludos
 
Arriba