CAP 6- Monitorización de la temperatura

Tema en 'Tutorial Controlador' iniciado por jmcadsl, 9 Nov 2014.

  1. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    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:
    Insertar CODE, HTML o PHP:
    //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 chic@s!
    Jorge.
     
  2. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
    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
     
  3. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    Debes tener mal conectado el cableado de la sonda ....o no estas conectado la sonda al mismo pin digital que tengas programado
     
  4. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
    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"
     
  5. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    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
     
  6. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
    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
     
  7. Ruba

    Ruba

    Mensajes:
    22
    Registrado:
    28 May 2010
    Ubicación:
    Espeña
    Vamos david!!!

    Aplícate que te ainidyu
     
  8. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
    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.??
     
  9. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    B.Días y Feliz Año!!
    Ok, dejarme que lo reviso con un controlador a ver que está fallando.

    Saludos!
     
  10. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
    Ok. Gracias y feliz año
     
  11. jmcadsl

    jmcadsl Miembro Honorífico

    Mensajes:
    852
    Registrado:
    17 Ene 2010
    Ubicación:
    España
    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.
    Insertar CODE, HTML o PHP:
    //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
     
  12. dem365

    dem365

    Mensajes:
    88
    Registrado:
    27 Dic 2008
    Ubicación:
    españa
  13. Pablitom

    Pablitom

    Mensajes:
    5
    Registrado:
    16 Feb 2016
    Ubicación:
    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