Sensor de temperatura y humedad conectado


Usando MQTT y el Node Red
sensor de temperatura y humedad terminado

Sensor de temperatura y humedad terminado en funcionamiento

Un sensor MQTT conectado con lectura LCD para monitorear las lecturas de temperatura y humedad en mi casa. He construido 3 de estos y los he colocado en diferentes habitaciones, las lecturas de temperatura y humedad son enviadas por el MQTT a mi tablero Node Red en el Raspberry Pi.

Aunque no es realmente necesario tener una lectura digital para un sensor conectado, es práctico poder ver la temperatura sin tener que conectarse al nodo rojo del tablero.


Las piezas utilizadas para construir la unidad del sensor

  • D1 mini
  • DHT22 Shield
  • Digital readout IC2 KY34-B
  • Dupont connectors
  • Caja impresa en 3D
  • Fuente de alimentación de 5v

Primer paso


Diseño e impresión

Modelado 3D del caso

Utilicé Tinkercad para crear el modelo 3D de mi diseño. Es la primera vez que uso Tinkercad y lo recomiendo encarecidamente. Es muy fácil de usar y produce un buen modelo.

Los archivos stl están disponibles para su descarga en Thingiverse

Modelo 3D de la base para el sensor de temperatura y humedad

Modelo 3D de la base

Modelo 3D de la base para el sensor de temperatura y humedad

Modelo 3d de la cubierta


3d Imprimiendo el caso

El diseño se imprimió en PLA negro con una resolución de 0,2 y un 20% de relleno. La base se imprimió con el soporte habilitado para el agujero oblongo de la fuente de alimentación.

Estuche impreso en 3d para el sensor de temperatura y humedad

Estuche impreso en 3d para el sensor de temperatura y humedad

Segundo paso


Programación y conexiones

Sube el código al mini D1

Usando el código de Arduino de abajo, cambie los detalles de la conexión wifi a su propia red wifi. También establezca la dirección IP del Raspberry Pi ejecutando el servidor mqtt.

También necesitarás las bibliotecas de la junta pertinente

  • ESP8266 support libraries
  • Mqtt support
  • IC2 Display
  • DHT22

estos pueden ser fácilmente instalados a través de la opción “administrar bibliotecas” dentro del IDE de Arduino

Cuando termines puedes compilar y subir al mini D1.

#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include <DHT.h>
#include "SSD1306.h" // alias for `#include "SSD1306Wire.h"`
 
#define DHTPIN D4     // what pin the DHT is connected to
 
// Initialize the OLED display using Wire library
SSD1306  display(0x3C, D3, D5); // (I2C Address, SCL Pin, SDA Pin)
 
#define DHTTYPE DHT22   // DHT 22  (AM2302)
const int TEMPERATURE_INTERVAL = 30;
unsigned long last_temperature_sent = 0;
 
// WiFi Connection Details
const char* ssid = "Your SSID";
const char* password = "Your password";
 
// Raspberry Pi IP address, so it connects to your MQTT broker
const char* mqtt_server = "IP address of mqtt server";
 
// Change these to suit
WiFiClient wemos_lounge;
PubSubClient client(wemos_lounge);
 
const int HUMIDITY_INTERVAL = 30;
unsigned long last_humidity_sent = 0;
String display_temp;
String display_humid;
 
DHT dht(DHTPIN, DHTTYPE);
 
// This functions connects your ESP8266 to your router
void setup_wifi() {
  delay(10);
  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("WiFi connected - ESP IP address: ");
  Serial.println(WiFi.localIP());
}
 
// This functions reconnects your ESP8266 to your MQTT broker
void reconnect() {
  // Loop until we're reconnected
  while (!client.connected()) {
    Serial.print("Attempting MQTT connection...");
    if (client.connect("wemos_lounge")) {
      Serial.println("connected");  
      // Subscribe or resubscribe to a topic
      client.subscribe("heating/temperature_lounge");
    } else {
      Serial.print("failed, rc=");
      Serial.print(client.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}
 
void setupHandler() {
  // Do what you want to prepare your sensor
  display.clear();
}
 
void getSendTemperature() {
  if (millis() - last_temperature_sent >= TEMPERATURE_INTERVAL * 1000UL || last_temperature_sent == 0) {
    float temperature = dht.readTemperature(false);
    if (isnan(temperature)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
// May need to offset temperature reading:
// I found the reading to be 3.1° too high
    display_temp = (temperature-3.1);
    int temp = round(temperature-3.1);
    char cstr[16];
    itoa(temp, cstr, 10);
    client.publish("heating/temperature_lounge",cstr);
    Serial.print("Temperature: ");
    Serial.print(temperature);
     
    Serial.println(" °C");
  }
}
 
void getSendHumid() {
  if (millis() - last_humidity_sent >= HUMIDITY_INTERVAL * 1000UL || last_humidity_sent == 0) {
    float humidity = dht.readHumidity();
 
    if (isnan(humidity)) {
      Serial.println("Failed to read from DHT sensor!");
      return;
    }
    display_humid = humidity;
    int humid = round(humidity);
    char cstr[16];
    itoa(humid, cstr, 10);
    client.publish("heating/humidity_lounge", cstr);
    Serial.print("Humidity: ");
    Serial.print(humidity);
    Serial.println(" %");
  } 
 }
 
void displayData() {
    display.clear();
    display.setTextAlignment(TEXT_ALIGN_CENTER);
    display.setFont(ArialMT_Plain_24);
    display.drawString(66, 5, display_temp + "C");
    display.drawString(66, 35, display_humid + "%");
    display.display();
}
 
void setup() {
 
  Serial.begin(115200);
  setup_wifi();
  client.setServer(mqtt_server, 1883);
  // Initialising the display.
  WiFi.mode(WIFI_STA);
  display.init();
  display.clear();
  display.flipScreenVertically();
  display.setTextAlignment(TEXT_ALIGN_CENTER);
  display.display();
}
 
void loop() {
  //connect wifi if not connected
  if (WiFi.status() != WL_CONNECTED) {
    delay(1);
    setup_wifi();
    return;
}
  if (!client.connected()) {
    reconnect();
  }
  if(!client.loop())
    client.connect("wemos_lounge");
  getSendTemperature();
  getSendHumid(); 
  displayData();
  delay(2000);
}

Ensamblar los componentes

Compré tanto el mini D1 como el sombrero DHT22 en AliExpress. Una fuente barata para este tipo de componentes (si no tienes mucha prisa, puede tardar hasta 3 semanas en ser entregado).

soldando bloques de pines a d1 mini

Soldar el bloque de pines hembra al escudo DHT22 y el bloque macho al mini D1

conectando la pantalla a d1mini

Acorta y suelda los cuatro cables DuPont para conectar la pantalla


Conexiones de la pantalla al D1 mini

  • Cable rojo VCC a 3.3v
  • Cable negro GND a G
  • Alambre blanco SCL a D5
  • Alambre púrpura SDA a D3
el sensor de temperatura y humedad se encendió

El sensor de temperatura y humedad se encendió

Tercer paso


Ensamblar los componentes en la caja

He usado mi pistola de pegamento caliente para montar el sensor de temperatura y humedad conectado.

Empieza pegando la pantalla en su lugar. Hay alfileres de localización en la impresión (pero no siempre se alinean muy bien)

Adjuntar la pantalla de LCD

Pegamento caliente la pantalla en su lugar


Es necesario cortar la lengüeta del sensor DHT22 para que quepa en la caja


Luego inserte el ensamblaje D1 mini y DHT22, asegúrese de usar una gota de pegamento caliente para asegurar un espacio entre el escudo DHT22 y la pantalla.

Ensamblando los componentes de temperatura y humedad en la caja
Ensamblando los componentes de temperatura y humedad con pegamento caliente
los componentes de temperatura y humedad en la caja
el sensor de temperatura y humedad terminado se encendió

El ensamblaje terminado listo para ser cerrado y puesto en su lugar

Usando el sensor de temperatura y humedad conectado


Node Red Dashboard

En la actualidad sólo los uso para tener una idea de la temperatura y la humedad en toda la casa, el objetivo es utilizarlos eventualmente para abrir y cerrar los circuitos de calefacción por suelo radiante.

salida del nodo rojo para los sensores de temperatura y humedad

Captura de pantalla del panel Node Red