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

Specificaties DHT22 en DHT11

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:

DHT22ESP32
VCC3.3V
DATAGPIO 4 (voorbeeld)
GNDGND
DHT22 sensor

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"

Home Assistant Dashboard voor de DHT22
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