Aventuras y Desventuras de un hobbyist

Aventuras y Desventuras de un hobbyist....
Mostrando entradas con la etiqueta DS18B20. Mostrar todas las entradas
Mostrando entradas con la etiqueta DS18B20. Mostrar todas las entradas

Multiple DS18B20 parasitic mode.

En un post anterior he realizado un termómetro con un Sensor de Temperatura DS18B20 de Dallas.

Esta vez estoy usando 3 sensores de temperatura y así probar el parasitic mode con posibilidad de aplicar  esto en una vivienda unifamiliar para monitorizar la temperatura en diferentes estancias / zonas de la casa.
El cable necesario seria uno de únicamente un par de hilos, uno con GND para el pin 3 del DS18B20 y otro para la transmisión de datos en el pin 2. Planeo realizar pruebas futuras sobre la eficacia del sensor en función de la longitud del cable.
Aquí tenéis un par de imágenes del setup:



 
El código que he usado es el siguiente:




#include "onewire.h"

#include "dallastemperature.h"

#include "liquidcrystal.h" //Libreria para el LCD


// Data wire is plugged into pin 8 on the Arduino

#define ONE_WIRE_BUS 8


// Setup a oneWire instance to communicate with any OneWire devices (not just Maxim/Dallas temperature ICs)

OneWire oneWire(ONE_WIRE_BUS);


// Pass our oneWire reference to Dallas Temperature.

DallasTemperature sensors(&oneWire);
//Iniciamos la libreria del LCD con los respectivos pines

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


void setup(void)

{

  
      //Setup de las lineas y columnas.

      lcd.begin(16, 2);


  Serial.begin(9600);


  // Start up the library

  sensors.begin();

}



void loop(void)

{

  // call sensors.requestTemperatures() to issue a global temperature

  // request to all devices on the bus

  Serial.print("Requesting temperatures...");

  sensors.requestTemperatures(); // Send the command to get temperatures

  Serial.println("DONE");

 

  Serial.print("Temperature for Device 1 is: ");

  Serial.println(sensors.getTempCByIndex(0)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
float val1 =  sensors.getTempCByIndex(0) ; // Almacenar la temperatura

 Serial.print("Temperature for Device 2 is: ");    

  Serial.println(sensors.getTempCByIndex(1)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
float val2 =  sensors.getTempCByIndex(1) ; // Almacenar la temperatura

 Serial.print("Temperature for Device 3 is: ");

  Serial.println(sensors.getTempCByIndex(2)); // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire
float val3 =  sensors.getTempCByIndex(2) ; // Almacenar la temperatura


    
lcd.setCursor(1, 0);
lcd.print("T1");
lcd.setCursor(0, 1);
lcd.print(val1);
lcd.setCursor(4, 1);
lcd.print("  ");

lcd.setCursor(7, 0);
lcd.print("T2");
lcd.setCursor(6, 1);
lcd.print(val2);do
lcd.setCursor(10, 1);
lcd.print("  ");

lcd.setCursor(13, 0);
lcd.print("T3");
lcd.setCursor(12, 1);
lcd.print(val3);

}

Termòmetro LCD y led que se enciende cuando se supera una temperatura X

Finalmente he terminado el termómetro digital mediante el cual obtengo la temperatura y el led se enciende si la temperatura es superior a 22ºC.
(Se puede ampliar el sketch para que cuando la temperatura sea menor de 18 un led azul se ilumine, cuando la temperatura sea entre 18 y 24 un led amarillo se ilumine y cuando sea superior a 24 el led rojo se ilumine.)


Los Materiales son los siguientes:
  • Arduino UNO (bricogeek.com)
  • Breadboard (bricogeek.com)
  • LCD PC1602F (16*2) (Diotronic.com)
  • Sensor de Temperatura DS18B20+ (bricogeek.com)
  • Resistencia de 4.7K.
  • LED
  • Cables varios incluido el usb para conectar el arduino al PC.
Para empezar conecte el sensor de temperatura a Arduino en el pin 10, la forma de conectar es la siguiente:
Source: http://www.flickr.com/photos/sctv/3138287688/#/
Primero hice pruebas para ver si el sensor funcionaba correctamente, usando el Serial  Monitor obtuve esto:

Ahora que se que el sensor funciona correctamente conecto el LCD a arduino de la siguiente forma:
Source: http://luckylarry.co.uk
Ahora desarrolamos el código, que os lo podéis descargar de aquí: Archivo.pde(arduino)




#include  //Libreria para el sensor

    #include  //Libreria para el sensor

    #include  //Libreria para el LCD


    // Conectamos el sensor de temperatura al pin 10 de Arduino

    #define ONE_WIRE_BUS 10


    // Setup de oneWire instance para que se comunique con dispositivos OneWire

    OneWire oneWire(ONE_WIRE_BUS);


    // Pasomos la referencia de oneWire a Dallas Temperature.

    DallasTemperature sensors(&oneWire);


    //Iniciamos la libreria del LCD con los respectivos pines

    LiquidCrystal lcd(12, 11, 5, 4, 3, 2);


    const int ledPin =  13;      // Pin al que esta conectado el led


    void setup(void)

    {

    //Setup de las lineas y columnas.

      lcd.begin(16, 2);

    //Escribimos Temperatura en el LCD.


      lcd.print("Temperatura:");

     

      // initialize the LED pin as an output:

      pinMode(ledPin, OUTPUT);

      // start serial port

      Serial.begin(9600);

      Serial.println("Control de Temperatura");


      // Start up the library

      sensors.begin();

    }


    float val = 0; // Importate usar el float para obtener la temperatura en formato ºC y NN,NN


    void loop(void)

    {

      // call sensors.requestTemperatures() to issue a global temperature

      // request to all devices on the bus

      Serial.print("Requesting ...");

      sensors.requestTemperatures(); // Send the command to get temperatures

      Serial.println("DONE");

      Serial.print("Temperatura es  ");

      Serial.print(sensors.getTempCByIndex(0))  ; // Why "byIndex"? You can have more than one IC on the same bus. 0 refers to the first IC on the wire

      Serial.print("  ");

      float val =  sensors.getTempCByIndex(0) ; // Almacenar la temperatura

      //Serial.println(val);      // print the value to

                                // the serial port

     // set the cursor to column 0, line 1

      // (note: line 1 is the second row, since counting begins with 0):

      lcd.setCursor(0, 1);

      // print the number of seconds since reset:

      lcd.print(val);                       

                            

      if (val >= 22) {

         // turn LED on:  

        digitalWrite(ledPin, HIGH);

      }

      else {

        // turn LED off:

        digitalWrite(ledPin, LOW);

      }


      delay(4000);              // wait for 4 second

    }






Cosas a tomar en cuenta:

  • Usar las librerias oneWire y DallasTemperature para el sensor.
  • No olvidarse de usar "float" a la hora de leer la temperatura, sin esta funcion a mi me salian caracteres muy raros o sino la temperatura sin decimales.
  • Soldar bien los cables en el LCD ya que si no lo estan es muy probable obtener caracteres raros. 
Librerias Necesarias para el proyecto:

Libreria Dallas Temperature