DHT22 – Temperatuur- en luchtvochtigheidssensor
De DHT22 is een eenvoudige digitale sensor die zowel temperatuur als luchtvochtigheid meet.
In combinatie met een ESP32 kun je deze sensor inzetten voor je domotica-projecten zoals Home Assistant,
een weerstation of klimaatregeling.
Let op: De DHT22 is niet waterdicht en kan slecht tegen direct zonlicht. Gebruik deze sensor bij voorkeur binnen, in een serre of schuur. De sensor kan wel bijvoorbeeld in een weerstation buiten gebruikt worden.
De DHT22 heeft een soort gelijke sensor de DHT11, deze is goedkoper maar de specificaties zijn minder.
⚙️ Specificaties
Aansluitschema ESP32 – DHT22
De DHT22 is verkrijgbaar in een 3 of 4 pin uitvoering. De 3 pin uitvoering zit op een printplaatje en is voorzien van een Pull-Up weerstand, bij de 4-uitvoering moet je deze zelf toevoegen. Hieronder een standaard 4-pins versie:
| DHT22 | ESP32 |
|---|---|
| VCC | 3.3V |
| DATA | GPIO 4 (voorbeeld) |
| GND | GND |
Let op: Gebruik een 10KΩ pull-up weerstand tussen VCC en DATA voor de 4-pin DHT22.
Arduino-code voorbeeld
Neem deze code gerust over, pas aan naar eigen behoefte en gebruik in projecten. Mocht je deze code gebruiken als basis voor code die openbaar gepubliceerd wordt, vergeet dan niet een vermelding of link naar deze site te maken.
Kijk ook even naar de Disclaimer
Dit is een 'basic' voorbeeld waarbij alleen de DHT22 wordt gebruikt. Onder dit voorbeeld vind je een uitgebreider voorbeeld wat samen is gevoegd met de code voor WiFi, MQTT en OTA.. Gebruik de bibliotheken DHT sensor library van Adafruit en Adafruit Unified Sensor. Deze kun je installeren via de Library Manager.
#include "DHT.h"
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(115200);
dht.begin();
}
void loop() {
float temp = dht.readTemperature();
float hum = dht.readHumidity();
if (isnan(temp) || isnan(hum)) {
Serial.println("Fout bij het lezen van de DHT22!");
return;
}
Serial.print("Temperatuur: ");
Serial.print(temp);
Serial.print(" °C - Luchtvochtigheid: ");
Serial.print(hum);
Serial.println(" %");
delay(2000);
}
Complete Arduino code met MQTT naar bijvoorbeeld Home Assistant
Hieronder de complete code voor de DHT22 sensor, inclusief WiFi, MQTT en OTA zodat je deze eenvoudig aan bijvoorbeeld je Home Assistant kan koppelen.
/*
* Maker : Matteman-Automation
* Project : DHT22 met WiFi, MQTT & OTA
* Version : 1.0
* Date : 10-2025
* Programmer : Ap Matteman
* Board : ESP32 Wroom
* Sensor : DHT22
*
* [Topic!] moet worden aangepast voor inkomende MQTT berichten
*
*/
#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoOTA.h>
#include <Arduino_Secrets.h>
#include "DHT.h"
const char* ssid = YourSSID;
const char* password = YourWiFiPassWord;
const char* HostName = "Demo_Code"; //Naam van het apparaat in het netwerk
const char* mqtt_broker = YourMQTTserver;
const char* mqtt_user = YourMQTTuser;
const char* mqtt_password = YourMQTTpassword;
String sMQTTName;
int iWiFiTry = 0;
int iMQTTTry = 0;
#define DHTPIN 4
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
//Nodig voor de verzend verzenden SSID
unsigned long lPrivMS = 0;
const unsigned long lInterval = 5000; // 5 seconde
WiFiClient espClient;
PubSubClient MQTTclient(espClient); // MQTT Client
void Connect2WiFi() {
WiFi.mode(WIFI_STA); //WiFi mode, Client
iWiFiTry = 0;
WiFi.begin(ssid, password);
WiFi.setHostname(HostName);
Serial.print("Connecting to WiFi ");
while (WiFi.status() != WL_CONNECTED && iWiFiTry < 11) { //Probeer 11 keer met WiFi te verbinden
++iWiFiTry;
Serial.print(".");
delay(500);
}
if(iWiFiTry < 11){
Serial.println("");
Serial.print("Got IP: "); Serial.println(WiFi.localIP());
} else {
Serial.println("");
Serial.print("Verbinding mislukt");
}
}
void Connect2MQTT() {
// Controleer of WiFi verbonden is, zo niet verbind met WiFi.
if (WiFi.status() != WL_CONNECTED) {
Connect2WiFi;
}
iMQTTTry=0;
sMQTTName = "MQTT-" + String(WiFi.macAddress()); //Unique MQTT Device name
Serial.print("Connecting to MQTT ");
MQTTclient.setServer(mqtt_broker, 1883);
while (!MQTTclient.connect(sMQTTName.c_str(), mqtt_user, mqtt_password) && iMQTTTry < 11) { ///Probeer 11 keer met MQTT te verbinden
++iWiFiTry;
++iMQTTTry;
Serial.print(".");
delay(500);
}
if(iMQTTTry < 11) {
Serial.println("");
Serial.println("Verbonden met MQTT");
} else {
Serial.println("");
Serial.println("Verbinding mislukt");
int iErrorCode = MQTTclient.state();
Serial.print("MQTT connect failed, code = "); Serial.println(iErrorCode);
}
}
void callback(char *topic, byte *payload, unsigned int length) {
String sStatus; // Bevat de waarde
Serial.println("-----------------------");
// Convert Char* to String
String STopic = topic;
payload[length] = 0; String recv_payload = String(( char *) payload);
Serial.print("Message arrived in topic: "); Serial.println(topic);
Serial.print("Message:");
for (int i = 0; i < length; i++) {
Serial.print((char) payload[i]);
sStatus+= (char)payload[i];
}
sStatus.trim();
Serial.println();
if(strcmp(topic,"[Topic!]")==0) {
// Doe iets als de [Topic!] binnenkomrt met sStatus
}
}
void setup() {
Serial.begin(115200); //Nodig voor de Serial Monitor
dht.begin();
Connect2WiFi();
Connect2MQTT();
// (optioneel) naam en wachtwoord voor OTA
ArduinoOTA.setHostname(HostName);
ArduinoOTA.setPassword(OTAPassword); // Wachtwoord opgeslagen in Arduino_Secrets.h
// OTA starten
ArduinoOTA.begin();
MQTTclient.setCallback(callback);
// MQTTclient.subscribe("[Topic!]");
}
void loop() {
unsigned long lNowMS = millis();
int iRSSI;
//MQTTclient.loop();
ArduinoOTA.handle();
if (lNowMS - lPrivMS >= lInterval) {
lPrivMS = lNowMS;
float fTemp = dht.readTemperature();
float fHum = dht.readHumidity();
Serial.print("Temperatuur: ");
Serial.print(fTemp);
Serial.print(" °C - Luchtvochtigheid: ");
Serial.print(fHum);
Serial.println(" %");
// Is MQTT nog verbonden?
if (!MQTTclient.connect(sMQTTName.c_str(), mqtt_user, mqtt_password)) {
Connect2MQTT();
}
if (iWiFiTry < 11) {
iRSSI = WiFi.RSSI();
MQTTclient.publish("kantoor/dht22/rssi", String(iRSSI).c_str());
Serial.print("kantoor/dht22/rssi = "); Serial.println(iRSSI);
char cTemp[16];
char cHum[16];
dtostrf(fTemp,0,2,cTemp); //omzetten van Float waarde naar Char.
dtostrf(fHum,0,2,cHum);
MQTTclient.publish("kantoor/klimaat/temperatuur", cTemp);
MQTTclient.publish("kantoor/klimaat/l_vochtigheid", cHum);
} else {
Serial.print("*** ERROR *** Geen WiFi.");
}
}
}
Toepassing in Home Assistant
In Home Assistant kan je vervolgens de MQTT code eenvoudig uitlezen doormiddel van dit stukje YAML-code welke ik in de MQTT.YAML heb geplaatst. (zie ook de video: De perfecte ESP32 code voor MQTT communicatie met Home Assistant ) waarin ik dit uitleg.
- sensor:
- name: Kantoor Temperatuur
unique_id: "kantoor_teller"
state_topic: "kantoor/klimaat/temperatuur"
unit_of_measurement: "ºC"
- name: Kantoor l.vochtigheid
unique_id: "kantoor_vocht"
state_topic: "kantoor/klimaat/l_vochtigheid"
unit_of_measurement: "%"
- name: DHT22 WiFi Signal
unique_id: "dht_wifi_signal"
state_topic: "kantoor/dht22/rssi"
unit_of_measurement: "dBm"

In Home Assistant kan je op eenvoudige wijze een mooi dashboard bouwen waarvan hieronder de code:
views:
- path: default_view
title: Home
cards:
- type: horizontal-stack
cards:
- type: gauge
entity: sensor.kantoor_temperatuur
needle: true
segments:
- from: -20
color: '#db4437'
- from: 17
color: '#ffa600'
- from: 19
color: '#43a047'
- from: 23
color: '#ffa600'
- from: 28
color: '#db4437'
- type: gauge
entity: sensor.kantoor_l_vochtigheid
needle: true
title: Temperatuur Kantoor
- type: entities
entities:
- entity: sensor.kantoor_temperatuur
- entity: sensor.kantoor_l_vochtigheid
- entity: sensor.dht22_wifi_signal
type: masonry