sábado, 3 de diciembre de 2016

Utilizando el DHT22

El sensor DHT22 es un sensor de temperatura de mayor precisión que el DHT11.




En teoría hay que conectar una resistencia pull-up entre Vcc y el pin DATA de unos 10K pero yo he realizado pruebas con y sin resistencia y el resultado es el mismo por lo que interpreto que el módulo ya trae incorporado dicha resistencia o que el pin de entrada del ESP8266 la lleva.


Con respecto a las librerías, en el menú Programa - Incluir Librería - Gestionar Librerías buscamos por DHT22 e instalamos la librería:


Esta librería puede ser utilizada tanto para el DHT11, DHT21 y DHT22.

Además, a partir de la versión 2.3.0 de esta librería es necesario instalar tambien la librería Adafruit Unified Sensor de la misma forma que la explicada anteriormente

Una vez instaladas ambas librerías vamos a por el código.

Incluimos la librería, definimos el pin del módulo ESP8266 por el que realizaremos la lectura (en este caso el Pin D1) y definimos el sensor de temperatura:
#include "DHT.h"
#define DHTPIN 5
#define DHTTYPE DHT22


Declaramos una instancia de la librería que será usada por arduino para comunicarse con el sensor:
DHT dht(DHTPIN, DHTTYPE);

Para realizar la lectura de la humedad y la temperatura utilizamos variables tipo float (decimal) y utilizamos las sentencias:
float h = dht.readHumidity(); // Lee la humedad relativa %
float t = dht.readTemperature(); // Lee la temperatura ºC

*Nota: por defecto leemos el valor de la temperatura en grados Celsius. Si queremos leerlo en grados
Fahrenheit utilizaremos:
float t = dht.readTemperature(true); // Lee la temperatura ºF 

Por último mostramos la lectura por el puerto serie. El código completo es el siguiente

#include "DHT.h"
#define DHTPIN 5 // Pin D1
#define DHTTYPE DHT22 // Seleccionamos el sensor

DHT dht(DHTPIN, DHTTYPE); //Creamos una variable
void setup() {
  Serial.begin(9600); //Inicializamos el puerto serie
  Serial.println("\nDHT22 test!");
  dht.begin(); //Inicializamos el sensor
}

void loop() {
  delay(2000); // Esperamos 2 segundos entre medidas
  // La lectura de la temperatura y la humedad tarda unos 250 mseg. 
  float h = dht.readHumidity(); // Lee la humedad relativa
  float t = dht.readTemperature(); // Lee la temperatura en grados Celsius (por defecto)
  if (isnan(h) || isnan(t)) {
    Serial.println("Error en la lectura del sensor!\n");
    return;
  }
  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C \n");


Si queremos publicar estos datos en ThingSpeak el código sería el siguiente:

#include "DHT.h"
#include <ThingSpeak.h>
#include <ESP8266WiFi.h>

#define DHTPIN 5
#define DHTTYPE DHT22


const char* ssid = "SSID";
const char* password = "PASSWORD";
WiFiClient  client;
unsigned long myChannelNumber = CHANNEL_ID;
const char* myWriteAPIKey = "API_KEY";

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(9600);
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  Serial.println();
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  pinMode(15, OUTPUT);
  digitalWrite(15, HIGH);
  Serial.println();
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
  Serial.println();
 
  ThingSpeak.begin(client);
  dht.begin();
}

void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("Error en la lectura del sensor!\n");
    return;
  }
  Serial.print("Humedad: ");
  Serial.print(h);
  Serial.print(" %\t");
  Serial.print("Temperatura: ");
  Serial.print(t);
  Serial.print(" *C \n");
  ThingSpeak.setField(1, (float)t);
  ThingSpeak.setField(2, (float)h);
  ThingSpeak.writeFields(myChannelNumber, myWriteAPIKey);
  delay(20000); 
}



Fuentes:

No hay comentarios:

Publicar un comentario

Nota: solo los miembros de este blog pueden publicar comentarios.