[DIY] Sensor IoT temperatura y humedad [3]: Leyendo del DHT22 y enviando por MQTT

[DIY] Sensor IoT temperatura y humedad [3]: Leyendo del DHT22 y enviando por MQTT

Después de solventar los problemas de alimentación con el ESP8266 toca leer datos y mandarlos hacía nuestros servidores para su almacenamiento.

ComponenteCantidad
ESP82661
DHT11/DHT221
Resistencia 4K7Ω ( o equivalentes)1

Lecturas del DHT22

Primero que todo vamos a conectar el pin2 de datos del DHT22 a GPIO02 del ESP8266 con una resistencia de 4k7Ω en pull-up (A la alimentación). En mi caso como no dispongo de una resistencia de ese valor. He enseriado varias resistencias de 1kΩ.

Luego agregamos la dependencia de la librería y configuramos la velocidad de comunicación:

monitor_speed = 115200
lib_deps =
        adafruit/DHT sensor library@^1.4.7

Abrimos el GPIO02 para lecturas e instanciamos los valores de la librería para leer el DHT.

#include <DHT.h>
...
DHT dht(2, DHT22);

void setup() {
...
  pinMode(2, INPUT);
  dht.begin();
...
}

Es importante saber saber que entre lecturas hay que dejar 2 segundos para obtener las lecturas de forma correcta. Si no lo hacemos podemos obtener números valores erróneos o incluso el valor nan (Not a Number).

Comunicando con MQTT

Para la mensajería de he decidido hace uso del protocolo MQTT por su sencillez. Y en el servidor he instalado el servidor de Mosquitto

Incluimos la librería PubSubClient@^2.8 al proyecto

Creamos las funciones para configurar la conexión con el servidor, y formamos el json en texto que mandamos con los datos de temperatura y humedad.

#include <PubSubClient.h>

const char* mqtt_server = "<MQTT-Server-IP>";
const int mqtt_port = 1883; // Default port

WiFiClient espClient;
PubSubClient mqttClient(espClient);

void reconnect() {
  while (!mqttClient.connected()) {
    if (!mqttClient.connect("ESP8266Client", MQTT_USER, MQTT_PASSWORD)) {
      delay(5000);
    }
  }
}

void setup() {
...
mqttClient.setServer(mqtt_server, mqtt_port);
...
}

void loop() {
  if (!mqttClient.connected()) {
    reconnect();
  }

  mqttClient.loop();

  float temperature = dht.readTemperature();
  delay(2500);
  float humidity = dht.readHumidity();

  String payload = "{ \"temperature\": " + String(temperature, 2) + ", \"humidity\": " + String(humidity, 2) + ", \"name\": \"ESP8266-DHT\" }";
  mqttClient.publish("spuertes/test/temperature", payload.c_str());
  delay(10000);
}

Siguiente Paso: Recepción y almacenaje

El próximo paso será crear el proceso de recepción que almacenará los datos en una base de datos.