Mostrando entradas con la etiqueta DHT11. Mostrar todas las entradas
Mostrando entradas con la etiqueta DHT11. Mostrar todas las entradas

miércoles, 30 de noviembre de 2016

Medida de Temperatura/Humedad y publicación en Thingspeak

Esta práctica ya la he realizado utilizando LUA pero en este artículo voy a programar el módulo ESP8266 con el IDE de Arduino. El esquema es sencillo:


Yo dispongo de este módulo que solo dispone de tres conectores pero no he encontrado su esquema:


Si deseas más información sobre estos módulos consulta este artículo 

Para programarlo utilizo la librería SimpleDHT11 que puedes instalar haciendo click en Programa - Incluir librerías - Gestionar librerías. Buscamos dht y elegimo SimpleDHT:


Para añadirlo a nuestro proyecto:
#include <SimpleDHT.h>

Hemos conectado el pin DATA del módulo DHT11 en el puerto D0 del módulo ESP8266 que corresponde con GPIO16.
int pinDHT11 = 16;

A continuación declaramos una instancia de la librería para comunicarnos con el sensor:
SimpleDHT11 dht11;

En loop definimos dos variables tipo byte t y h:
byte t = 0;
byte h = 0;


Para leer los datos del sesor utilizamos:
dht11.read(pinDHT11, &t, &h, NULL)

y luego la mostramos por el puerto serie. El código completo es el siguiente:

#include <SimpleDHT.h>

int pinDHT11 = 16; // Puerto D0 entrada de datos
SimpleDHT11 dht11; // Modelo de sensor

void setup() {
  Serial.begin(9600);
  delay(500);
}

void loop() {
  byte t = 0;
  byte h = 0;
  if (dht11.read(pinDHT11, &t, &h, NULL)) {
    Serial.print("Error en la lectura.");
    return;
  }
  // Muestra por el puerto serie las medidas obtenidas
  Serial.print("Humedad relativa: ");
  Serial.print((int)h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print((int)t);
  Serial.println(" *C");
  //El sensor realiza la lectura cada 20 segundos
  delay(20000);
}


Con este código obtenemos las siguientes lecturas:



Publicación en Thingspeak
ThingSpeak es una plataforma Open Source para conectar productos y servicios al Internet de las Cosas (IoT). Permite a los desarrolladores interactuar con los dispositivos utilizando tecnologías Web estándar.

En este artículo obtendrás más información de esta plataforma y de cómo darte de alta.

Vamos instalar la librería de ThingSpeak en el IDE de arduino. Hacemos click Programa - Incluir librería - Gestionar Librerías y en búsqueda escribimos thingspeak


Hacemos click en instalar y listo. Ahora, para añadir la librería a nuestro proyecto:
#include <ThingSpeak.h>

Además, incluimos la librería ESP8266WiFi:
#include <ESP8266WiFi.h>

Definimos los valores de nuestra wifi y creamos una instancia de WiFiClient:
const char* ssid = "WLAN_E17C";
const char* password = "ced0ccb58c84e525e35f";
WiFiClient  client;


Ademas definimos los valores de nuestro canal en ThingSpeak:
unsigned long myChannelNumber = NUMERO_CANAL;
const char* myWriteAPIKey = "API_kEY";

En NUMERO_CANAL y API_KEY teneis que introducir los datos de vuestro canal

En setup() establecemos la conexión wifi e inicializamos ThinkSpeak:
WiFi.mode(WIFI_STA);
WiFi.disconnect();
delay(100);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {   // wait for WiFi
  delay(500);
  Serial.print(".");
}
ThingSpeak.begin(client);


Para enviar los datos de temperatura y humedad a ThingSpeak utilizamos:
ThingSpeak.setField(1,(int)t);
ThingSpeak.setField(2,(int)h);
ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);


Si solo necesitamos enviar un dato (por ejemplo la temperatura) podríamos utilizar:
ThingSpeak.writeField(myChannelNumber, 1, (int)t, myWriteAPIKey);

ThingSpeak solo acepta actualizaciones cada 15 segundas como mínimo

El código completo es el siguiente:

#include <SimpleDHT.h>
#include <ThingSpeak.h>
#include <ESP8266WiFi.h>

const char* ssid = "SSID";
const char* password = "PASSWORD";
WiFiClient  client;
unsigned long myChannelNumber = NUMERO_CANAL;
const char* myWriteAPIKey = "API_KEY"; // API Key del canal
int pinDHT11 = 16; // Puerto D0 entrada de datos
SimpleDHT11 dht11;

void setup() {
  Serial.begin(9600);
  WiFi.mode(WIFI_STA); //Establece el módulo como cliente wifi
  WiFi.disconnect(); //Se desconecta de cualquier WiFi conectado
  delay(100);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {   // wait for WiFi
    delay(500);
    Serial.print(".");
  }
  ThingSpeak.begin(client);
}

void loop() {
  byte t = 0;
  byte h = 0;
  if (dht11.read(pinDHT11, &t, &h, NULL)) {
    Serial.print("Error en la lectura.");
    return;
  }
  // Muestra por el puerto serie las medidas obtenidas
  Serial.print("Humedad relativa: ");
  Serial.print((int)h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print((int)t);
  Serial.println(" *C");

  // Envía los datos a ThinkSpeak
  ThingSpeak.setField(1, (int)t);
  ThingSpeak.setField(2, (int)h);
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey); 

  delay(20000);
}


El resultado que obtenemos es el siguiente:


Fuentes:
Enlaces:

domingo, 13 de diciembre de 2015

Practicando con el sensor DHT11

Aprovechando que tengo un sensor DHT11 voy a realizar un pequeño montaje en el que voy a medir la temperatura y la humedad con dicho sensor.

Para obtener más información sobre el sensor, consultar la siguiente entrada del blog.

El esquema sería el siguiente:


Untitled Sketch 2_bb.png


Como se puede apreciar, alimentamos el sensor y el pin de datos lo conectamos al pin 5 del módulo NodeMCU.

Para programar el módulo haremos uso de la API dht

El siguiente programa muestra por consola la temperatura y la humedad cada 3 segundos y se basa en el ejemplo de la documentación de la API:

pin = 5
function LeeDatos()
    status,temp,humi,temp_decimial,humi_decimial = dht.read11(pin)
    if( status == dht.OK ) then
           print(
           string.format(
           "DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
           math.floor(temp),
           temp_decimial,
           math.floor(humi),
           humi_decimial
           )
       )
    end
end
tmr.alarm(0,3000,1, function() LeeDatos() end)


El resultado en consola es el siguiente:
DHT Temperature:23.000;Humidity:41.000

La instrucción que lee los datos es la siguiente:
status,temp,humi,temp_decimial,humi_decimial = dht.read11(pin)

Luego, se comprueba que el estado del sensor es correcto:
if( status == dht.OK ) then

Para mostrar en consola el resultado:
print(string.format(
"DHT Temperature:%d.%03d;Humidity:%d.%03d\r\n",
math.floor(temp),
temp_decimial,
    math.floor(humi),
      humi_decimial
))

La clave está en string.format que se utiliza para dar formato a cadenas. Se compone de diferentes directivas que indican dónde y cómo debe ser escrito cada argumento. Una directiva se compone del carácter % seguido de una letra que nos indica cómo formatear el argumento:
  • %d o %i: número decimal entero
  • %x: número hexadecimal
  • %o: número octal
  • &f: número en coma flotante
  • %s: string
  • %c: carácter

Por cada directiva hay que indicar un argumento separado por comas.

También podemos indicar el número de caracteres. Por ejemplo:
d = 5; m = 11; y = 1990
print(string.format("%02d/%02d/%04d", d, m, y)) --> 05/11/1990

Finalmente, los caracteres especiales:
  • \r: retorno de carro
  • \n: nueva línea

Nota: math.floor es una librería de Lua que redondea un número.

Más información sobre los string: The String Library

Notas:

Mi módulo DHT11 solo muestra valores de temperatura y humedad enteros por lo que no son necesarias las variables temp_decimial,humi_decimial. Por tanto, el código podría ser:
status,temp,humi = dht.read11(pin)

Podemos mostrar los códigos de error en el caso de que la lectura haya sido incorrecta. Para ello nos valemos del resultado que devuelve la lectura del sensor en su variable status:
if( status == dht.OK ) then
 print("DHT Temperatura: "..temp.."ºC - Humedad: "..humi.." %")
 elseif( status == dht.ERROR_CHECKSUM ) then
 print( "DHT Checksum error." );
 elseif( status == dht.ERROR_TIMEOUT ) then
 print( "DHT Time out." );
 end
end