jueves, 16 de junio de 2016

Ejemplos Basicos (Sensores) - Dallas DS18B20


En este tutorial vamos a explicar un ejemplo para añadir un sensor de temperatura Dallas DS18B20 que son bastante economicos y muy precisos, ademas de tener la posibilidad de conectar varios en un unico Pin, como vereis el ejemplo es bastante sencillo:




Necesitaremos la librerias DallasTemperature y OneWire que podeis encontrar aqui:
https://github.com/milesburton/Arduino-Temperature-Control-Library
https://github.com/PaulStoffregen/OneWire

Vamos con el ejemplo:

// Configure the framework
#include "bconf/MCU_ESP8266.h"              // Load the code directly on the ESP8266
#include "conf/Gateway.h"                   // The main node is the Gateway, we have just one node
#include "conf/IPBroadcast.h"

// Define the WiFi name and password
#define WIFICONF_INSKETCH
#define WiFi_SSID               "SSID"
#define WiFi_Password           "PASSWORD"    

// Include framework code and libraries
#include <ESP8266WiFi.h>
#include <EEPROM.h>
#include "Souliss.h"

// This identify the number of the SLOT logic
#define DALLAS              0

#define DALLASPIN 4 //Se declara el pin donde se conectará la DATA

#include <OneWire.h>
#include <DallasTemperature.h>
OneWire ourWire(DALLASPIN); //Se establece el pin declarado como bus para la comunicación OneWire
DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature

#define Debug Serial        //Change to Serial1 if you want to use the GPIO2 to TX

void setup()
{   
    Initialize();
    
    Serial.begin(115200);

    sensors.begin(); //Se inician los sensores DS18B20
    // Connect to the WiFi network and get an address from DHCP
    GetIPAddress();      
    SetAsGateway(myvNet_dhcp); 
 

    Set_Temperature(DALLAS);
}

void loop()
{ 
    EXECUTEFAST() {                     
        UPDATEFAST();   

        FAST_910ms()    {
          // Acquire temperature from the microcontroller ADC
          sensors.requestTemperatures(); //Prepara el sensor para la lectura
          float dallas = sensors.getTempCByIndex(0);
          Souliss_ImportAnalog(memory_map, DALLAS, &dallas);
        }      

        FAST_2110ms()
        {
           Logic_Temperature(DALLAS);
        } 
         // Here we handle here the communication with Android
        FAST_GatewayComms();                                        
    }
} 

Bien, como siempre resaltamos las partes relevantes del codigo, en este caso antes del setup() declaramos el Slot, el Pin al que conectaremos el Dallas y #incluiremos las librerias para posteriormente inicializarlas.

En el setup() iniciamos el sensor y hacemos el Set del Slot indicando que sera de Temperatura.

Por ultimo en el loop() podemos encontrar las funciones sensors.requestTemperatures(); y sensors.getTempCByIndex(0); que prepara el sensor para lectura y lee el sensor. Despues asignamos mediante Souliss_ImportAnalog() el valor leido al Slot para mostrarlo en la App.

Poco mas abajo encontramos el Logic que lo que hace es actualizar la App en caso de que el valor haya cambiado.

Como nota final cabe destacar la posibilidad de conectar multiples Dallas en el mismo Pin, el esquema de conexion seria este:

 
En la parte del codigo nos faltaria por añadir los nuevos Slots antes del setup(), los Set en el setup() y en la parte del Loop unicamente llamariamos una vez a sensors.requestTemperatures().
 
El resto de lineas habria que duplicarlas tambien para cada Slot y en la llamada a sensors.getTempCByIndex(0) debemos ir incrementando el valor 0, 1, etc... para leer los diferentes sensores.
 
He de anotar que no he probado -aun- con multiples sensores, por lo que si alguien lo prueba y hay algun problema que lo comente y modifico la entrada. :)
 
Para una comprension mas profunda de la estructura es recomendable leer esta Entrada:
Estructura del código Souliss

Comentarios, sugerencias o preguntas aqui abajo :P Salu2


10 comentarios:

  1. Hola Juan y demás editores.
    Yo tengo dos sondas en el mismo pin y funcionan correctamente.
    Saludos

    ResponderEliminar
  2. Quería saber que sensor de temperatura es mas recomendable para hacer domotica, el DS o el DHT? Creo que el principal punto se me ocurre que es la distancia de cable soportado y luego si se pueden conectar varios en un mismo nodo. Saludos

    ResponderEliminar
    Respuestas
    1. Respecto a la precision ambos son similares, el precio si que es mas caro el DHT pero hay que tener en cuenta que tambien mide de forma precisa la humedad ambiente, teniendo en cuenta esto y lo que tu comentas de la distancia del cable y que se pueden conectar varios es lo que debes valorar para decidir.

      Eliminar
  3. Por si a alguien le interesa, este es el código para 2 sensores DS18B20, la conexión eléctrica del segundo sensor es en paralelo.


    // Configure the framework
    #include "bconf/MCU_ESP8266.h" // Load the code directly on the ESP8266
    #include "conf/Gateway.h" // The main node is the Gateway, we have just one node
    #include "conf/IPBroadcast.h"
    #include "conf/DynamicAddressing.h" // Use dynamic address




    // Define the WiFi name and password
    #define WIFICONF_INSKETCH
    #define WiFi_SSID "MIWIFI"
    #define WiFi_Password "MICONTRASEÑA"


    // Include framework code and libraries
    #include
    #include
    #include "Souliss.h"


    // This identify the number of the SLOT logic
    #define DALLAS 0
    #define DALLAS1 2


    #define DALLASPIN 14 //Se declara el pin donde se conectará la DATA


    #include
    #include
    OneWire ourWire(DALLASPIN); //Se establece el pin declarado como bus para la comunicación OneWire
    DallasTemperature sensors(&ourWire); //Se instancia la librería DallasTemperature


    #define Debug Serial //Change to Serial1 if you want to use the GPIO2 to TX
    DeviceAddress address1 = {0x28, 0xF5, 0xED, 0xB3, 0x6, 0x0, 0x0, 0x79};//dirección del sensor 1
    DeviceAddress address2 = {0x28, 0x2F, 0x10, 0xB4, 0x6, 0x0, 0x0, 0xBE};//dirección del sensor 2
    float temp1= sensors.getTempC(address1);//Se obtiene la temperatura en °C del sensor 1
    float temp2= sensors.getTempC(address2);//Se obtiene la temperatura en °C del sensor 2


    void setup()
    {
    Initialize();

    Serial.begin(115200);


    sensors.begin(); //Se inician los sensores DS18B20
    // Connect to the WiFi network and get an address from DHCP
    GetIPAddress();
    SetAsGateway(myvNet_dhcp);



    Set_Temperature(DALLAS);
    Set_Temperature(DALLAS1);
    SetAddressingServer();
    }


    void loop()
    {
    EXECUTEFAST() {
    UPDATEFAST();


    FAST_910ms() {
    // Acquire temperature from the microcontroller ADC
    sensors.requestTemperatures(); //Prepara el sensor para la lectura
    float dallas = sensors.getTempC(address1);
    float dallas1 = sensors.getTempC(address2);
    Souliss_ImportAnalog(memory_map, DALLAS, &dallas);
    Souliss_ImportAnalog(memory_map, DALLAS1, &dallas1);
    }


    FAST_2110ms()
    {
    Logic_Temperature(DALLAS);
    Logic_Temperature(DALLAS1);
    float dallas = sensors.getTempC(address1);
    float dallas1 = sensors.getTempC(address2);
    Serial.print("Temperatura 1 = "); Serial.print(dallas); Serial.print(" C");
    Serial.print(" Temperatura 2 = "); Serial.print(dallas1); Serial.println(" C");
    }
    // Here we handle here the communication with Android
    FAST_GatewayComms();
    }
    }

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. Gracias !!! Me a sido muy útil tanto la entrada como tú aporte.

      Solo una pregunta es necesario incrementar los slots de 2 en 2? Yo lo he echo así y va.

      Eliminar
    3. Hola Miguel, gracias por tu comentario.
      Si, los valores de los sensores T5x ocupan 2 slots.

      Eliminar