ESP-01 mit DHT22 (Temperatur und relative Luftfeuchtigkeit)

Der DHT22 ist ein preiswerter Sensor, der für seinen geringen Preis (3-5€ z.B. bei ebay.de) recht gute Messergebnisse liefert. Er liefert seine Daten über das One-Wire-Protokoll aus, so dass er sich problemlos an den ESP8266-01 anschließen lässt (solange man auf Batteriebetrieb verzichten kann).

Der Aufbau

Grundsätzlich ist der Aufbau der gleiche, wie für den DS 18B20, den ich in einem früheren Blog beschrieben habe:

DHT-Varianten

Der DHT22 wird in verschiedenen Ausführungen angeboten:

Auf dem „Shield“ wird Pin 3 nicht herausgeführt, im Netz wird er teilweise mit „GND“, teilweise mit „not connected“ beschrieben – für den Anschluss an den ESP ist er in der Tat nicht notwendig.

Pin 1 ist an 3,3V anzuschließen, Pin 2 ist der Datenausgang und geht an GPIO2. Gleichzeitig wird er über einen 4,7kΩ-Widerstand an 3,3V gelegt. Pin 4 geht an Masse (GND).

Bei ebay.de wird noch ein weiterse „Shield“ angeboten, dass auf den ersten Blick einen sehr nützlichen Eindruck macht:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Hier soll der ESP in den gelben Sockel eingesteckt werden, an 3,3V anschließen fertig!

Der Pferdefuß dabei ist, dass sich dann der Sensor und der ESP genau gegenüberstehen:

 

 

 

 

 

 

 

 

 

 

 

 

 

Damit heizen sie sich gegenseitig auf, und der DHT misst nur noch Fantasiewerte. Da die Messung der Feuchte auf der Temperaturmessung basiert, sind auch deren Werte unbrauchbar.

Wenn man dieses Shield dennoch benutzen möchte, muss man die beiden trennen, was z.B. so aussehen kann:

Der Lötaufwand ist hierbei größer, als wenn man den DHT direkt anschließt. Nebenbei wird auf diesem Shield ein DHT11 benutzt, der etwas größere Toleranzen bei der Messung besitzt.

Das Ergebnis

Mein fertiger Aufbau sieht dann so aus:

Als Gehäuse habe ich eine Plastikbox genommen, in der ich einmal einen Adapter für ein Objektiv geliefert bekommen habe. Der Sensor sitzt natürlich außen, der Innenraum wird durch den Spannungsregler und den ESP aufgeheizt, dort würde man nur Unsinn messen.

Nun steht er schön im Bad, ist Ehefrauen-kompatibel und sagt mir, ob ich nach dem Duschen lange genug gelüftet habe.

Einzig der Standort ist noch nicht optimal, weil zu dicht an der Heizung, daher etwas zu hohe Temperaturwerte (und entsprechend etwas zu niedrige Feuchte-Werte).

Für einen anderen Raum habe ich als Gehäüse eine alte Pillendose benutzt. Außerdem habe ich statt des AMS1117  den LM 1085 IT 3.3 Spannungsregler eingesetzt. Aufpassen, die 3.3 im Namen ist wichtig, denn es gibt den gleichen Regler (LM 1085) auch für andere Ausgangsspannungen! Zwischen Eingang und Masse bzw. Ausgang und Masse muss jeweils ein Kondensator gesetzt werden – je nach Quelle werden 10 bzw. 100μF. Ansonsten ändert sich an der Schaltung nichts.

Der Code zur Firmware

Der Code für den ESP unterscheidet sich auch nicht übermäßig von dem zum DS 18B20:

Code herunterladen

#include <PubSubClient.h>
#include <ESP8266WiFi.h>
#include <DHT.h>
#include <DHT_U.h>

#define INTERVAL 5 // Ableseintervall in Minuten
#define FAKTOR 60000 // 60.000 ms = 1 min

//**** Diese Daten müssen angepasst werden ***************

#define WIFI_AP "your_SSID"
#define WIFI_PASSWORD "your_passwd"

#define TOKEN "ESP8266_DHT22_TOKEN"

char clientID[] = "DHT22_Sensor_Bad";
char mqttBroker[] = "192.168.xxx.xxx"; // Adresse des MQTT-Brokers
int subNetIP = xxx; //IP des Subnets
int myIP = 202; //nur der letzte Block der IP ändert sich
String myHostname = "Dallas_Sensor_Bad";
char mqttSubjectTemperatur[] = "wetter/bad/temperatur";
char mqttSubjectFeuchte[] = "wetter/bad/feuchte";

//**********************************************************

// DHT
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE,11);

String temperatur = "100";
String feuchte = "100";

WiFiClient wifiClient;

PubSubClient client(wifiClient);

int status = WL_IDLE_STATUS;
unsigned long lastMessage;

void setup()
{
Serial.begin(115200);
dht.begin();
delay(10);
InitWiFi();
client.setServer( mqttBroker, 1883 );
lastMessage = millis() + (INTERVAL * FAKTOR);
}

void loop()
{
if ( !client.connected() ) {
reconnect();
}
if ( millis() - lastMessage > INTERVAL * FAKTOR ) { // Update and send only after 30 Seconds
getData();
sendMQTTMessage(mqttSubjectFeuchte, feuchte);
sendMQTTMessage(mqttSubjectTemperatur, temperatur);
lastMessage = millis();
}

client.loop();
}

String getFormattedFloat(float x, uint8_t precision) {
char buffer[10];
dtostrf(x, 7, precision, buffer);
return (buffer);
}

void getData() {
delay(2000);
Serial.println("Collecting temperature data.");
// Reading temperature or humidity takes about 250 milliseconds!
float h = dht.readHumidity();
//Serial.println(h);
// Read temperature as Celsius (the default)
float t = dht.readTemperature();
//Serial.println(t);
// Check if any reads failed and exit early (to try again).
if (isnan(h) || isnan(t)) {
Serial.println("Failed to read from DHT sensor!");
client.publish( "Bad/Wetter/Temperatur", "no Data" );
client.publish( "Bad/Wetter/Feuchte", "no Data" );
return;
}

Serial.print("Humidity: ");
Serial.print(h);
Serial.print(" %\t");
Serial.print("Temperature: ");
Serial.print(t);
Serial.println(" *C ");
temperatur = getFormattedFloat(t, 1);
feuchte = getFormattedFloat(h, 1);
}

void sendMQTTMessage(char mqttSubject[], String message) {
char payload[100];
message.toCharArray( payload, 100 );
client.publish( mqttSubject, payload );
Serial.println( payload );
}

void connectToWiFi() {
WiFi.begin(WIFI_AP, WIFI_PASSWORD);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("Connected to AccessPoint");
}

void InitWiFi()
{
Serial.println("Connecting to AccessPoint ...");
// attempt to connect to WiFi network
// feste IP eistellen - muss nicht sein
IPAddress ip(192, 168, subNetIP, myIP);
IPAddress gateway(192, 168, subNetIP, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress dns(192, 168, subNetIP, 1);
WiFi.config(ip, dns, gateway, subnet); // auf feste IP einstellen
WiFi.hostname(myHostname); //Hostnamen setzen
WiFi.persistent(false);
WiFi.mode(WIFI_OFF);
WiFi.mode(WIFI_STA);
connectToWiFi();
}

void reconnect() {
// Loop until we're reconnected
while (!client.connected()) {
status = WiFi.status();
if ( status != WL_CONNECTED) {
connectToWiFi();
}
Serial.print("Connecting to MQTT_Broker ...");
// Attempt to connect (clientId, username, password)
if ( client.connect(clientID, TOKEN, NULL) ) {
Serial.println( "[DONE]" );
} else {
Serial.print( "[FAILED] [ rc = " );
Serial.print( client.state() );
Serial.println( " : retrying in 5 seconds]" );
// Wait 5 seconds before retrying
delay( 5000 );
}
}
}
ESP-01 mit DHT22 (Temperatur und relative Luftfeuchtigkeit)

Beitragsnavigation


Ein Gedanke zu „ESP-01 mit DHT22 (Temperatur und relative Luftfeuchtigkeit)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.