viernes, 10 de junio de 2016

Ejemplos Basicos (Sensores) - DHT11 / DHT22




En este tutorial vamos a configurar Souliss para leer un Sensor de Temperatura - Humedad de los modelos DHT11 - DHT22, la diferencia de precision entre uno y otro es bastante notable por lo que dependiendo del entorno y la precision necesaria es importante elegir uno u otro.

Vamos con el ejemplo:


Antes del ejemplo es importante destacar que necesitamos una #incluir una Libreria para leer el DHT, en este link podeis encontrar muchas librerias desarrolladas para el ESP8266

https://github.com/esp8266/Arduino/blob/master/doc/libraries.md

En este caso vamos a utilizar la libreria DHT obviamente, este seria en enlace:
https://github.com/adafruit/DHT-sensor-library

Una vez descargada e instalada la libreria ahora si pasamos al ejemplo:

/**************************************************************************
    Souliss - DHT11/22 for Expressif ESP8266
   
    Load this code on ESP8266 board using the porting of the Arduino core
    for this platform.
       
***************************************************************************/

// Let the IDE point to the Souliss framework
#include "SoulissFramework.h"

// 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               "mywifi"
#define WiFi_Password           "mypassword"   

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

/*** All configuration includes should be above this line ***/
#include "Souliss.h"

// Include and Configure DHT11 SENSOR
#include "DHT.h"
#define DHTPIN              13       // what pin we're connected to
#define DHTTYPE             DHT11   // DHT 22
DHT dht(DHTPIN, DHTTYPE, 15);
      

// This identify the number of the LED logic
#define TEMPERATURE         0
#define HUMIDITY            2


#define Debug               Serial  //Change to Serial1 if you want to use the GPIO2 to TX
#define DebugDHT            1       //0 - None      / 1 - Show data on Serial 
#define Celsius             1       //0 - Farenheit / 1 Celsius


void setup()
{  
    Debug.begin(115200);
    Debug.println("DHTxx test!");
    dht.begin();

    Initialize();

    // Connect to the WiFi network and get an address from DHCP
    GetIPAddress();                          
    SetAsGateway(myvNet_dhcp);       // Set this node as gateway for SoulissApp 

    Set_Temperature(TEMPERATURE);
    Set_Humidity(HUMIDITY);

}

void loop()
{
    // Here we start to play
    EXECUTEFAST() {                    
        UPDATEFAST();  
       
        FAST_2110ms()
        {
           Logic_Temperature(TEMPERATURE);
           Logic_Humidity(HUMIDITY);

        }
             
        // Here we handle here the communication with Android
        FAST_GatewayComms();                                       
    }
    EXECUTESLOW() {
        UPDATESLOW();
            SLOW_10s() { 
                Souliss_ReadDHT(TEMPERATURE, HUMIDITY);  
            }
    }
}  

void Souliss_ReadDHT(uint8_t TEMPERATURE_SLOT, uint8_t HUMIDITY_SLOT){
    // Read temperature and humidity from DHT every 10 seconds 
    float h = dht.readHumidity();
    // Read temperature as Celsius
    float t = dht.readTemperature();
    // Read temperature as Fahrenheit
    float f = dht.readTemperature(true);

    // Check if any reads failed and exit early (to try again).
    if (isnan(h) || isnan(t) || isnan(f)) {
        Debug.println("Failed to read from DHT sensor!");
    }
    if(DebugDHT){
        Debug.print("Humidity: ");
        Debug.print(h);
        Debug.print(" %\t");
        if(Celsius){
            Debug.print("Temperature: ");
            Debug.print(t);
            Debug.print(" *C ");
        }else{
            Debug.print("Temperature: ");
            Debug.print(f);
            Debug.print(" *F ");
        }
    }
               
    if(Celsius) Souliss_ImportAnalog(memory_map, TEMPERATURE_SLOT, &t);
    else Souliss_ImportAnalog(memory_map, TEMPERATURE_SLOT, &f);
    Souliss_ImportAnalog(memory_map, HUMIDITY_SLOT, &h);
}

Comenzamos con la explicacion, basicamente al inicio del codigo #incluimos la libreria, #definimos el PIN al que irá conectado el DHT y #definimos el tipo de Sensor DHT11 / DHT22, por ultimo declaramos el sensor en la libreria.

Despues #definimos los Slots para almacenar los valores de Temperatura / Humedad, recordamos que cualquier valor de sensor almacenado en los T5n ocupa 2 "huecos" en el memory_map, de ahí que TEMPERATURE sea 0 y HUMIDITY es 2.

El resto de #defines antes del setup() son para activar/desactivar el Debug por el puerto Serie y para mostrar la temperatura en grados Celsius o Farenheit.

En el setup() inicializamos tanto el Serial como el sensor DHT, ademas de hacer el Set de los Slots de Temperatura y Humedad.

En el loop() realizamos el Logic de ambos Slots cada 2 segundos y llamamos a la funcion Souliss_ReadDHT cada 10 segundos, esta es la que realmente lee los datos del Sensor DHT.

Por ultimo la funcion Souliss_ReadDHT que es una adaptacion del ejemplo que incluye la propia libreria de Adafruit nombrada anteriormente.

Comentarios, sugerencias o preguntas aqui abajo :P Salu2

4 comentarios:

  1. Excelente Juan, felicitaciones por los aportes. Tendrías el código para arduino en lugar del ESP? O en que sitio lo podría encontrar? Trate de trasladarlo con los tips que diste pero souliss no me muestra los valores, tampoco el puerto serie de arduino. Gracias desde ya

    ResponderEliminar
    Respuestas
    1. Hola "Unknown" :S :P
      Lo mas probable es que sea por la libreria, prueba con el ejemplo y la libreria de este link a ver si te aparecen los datos por Serial:
      https://github.com/adafruit/DHT-sensor-library

      Una vez que te funcione asi fijate que lo unico que cambia con respecto al codigo de esta entrada es que en la llamada:
      DHT dht(DHTPIN, DHTTYPE, 15); no se usa el tercer parametro, es decir, seria:
      DHT dht(DHTPIN, DHTTYPE);

      Salu2 y gracias por comentar :)

      Eliminar
  2. Gracias Juan por contestar, no es precisamente eso, hay algo mas. Los datos por serial sin souliss los obtengo bien, es cuando involucro souliss. Es mas, se vuelve loco el sensor ya que cuando hago correr el codigo souliss y despues quiero volver al codiogo tester que antes funcionaba ya no funciona. No se que podrá ser

    ResponderEliminar
    Respuestas
    1. Hola Javier :P Pasate por aqui: https://groups.google.com/forum/#!forum/souliss-es Pega el codigo que estas utilizando y vamos a mirarlo.

      Salu2

      Eliminar