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
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.
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).
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
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)
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.
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.