// Das Handy muss im gleichen WLAN wie der PC-sein.
// Broker: broker.hivemq.com Port: 1883
// Topics: /sensors/dht22_temp und /sensors/dht22_hum
// Daten können mit MQTT-Dashboard auf Smartphone empfangen werden
#include <DHTesp.h> // DHT-Bibliothek für ESP32
#include <PubSubClient.h> // MQTT-Bibliothek
#include <WiFi.h> // Diese Bibliothek muss nicht extra eingebunden werden
const char *WIFI_SSID = "Wokwi-GUEST"; // Standard SSID bei Wokwi, genutzt wird das
const char *WIFI_PWD = ""; // WLAN mit dem der PC verbunden ist
const char *MQTT_SERVER = "broker.hivemq.com"; // der hier verwendete MQTT-Broker
const uint16_t MQTT_PORT = 1883; // der Standard-Port des Brokers
const byte DHT_PIN = 15; // der Empfangspin am ESP32 für das 1-Wire Signal
WiFiClient wifiClient; // Ein Objekt der Klasse WifiClient wird erzeugt
PubSubClient mqttClient(wifiClient); // Ein Objekt der Klasse PubSubClient wird erzeugt
DHTesp dhtSensor; // Ein Objekt der Klasse DHTesp wird erzeugt
// Callbackfunktionen werden i.d.R. durch spezielle Ereignisse augerufen.
// Hier: Werden Daten vom Broker empfangen, wird diese Funktion aufgerufen und die
// Nachricht auf dem Seriellen Monitor ausgegeben:
void CallbackMqtt(char* topic, byte* payload, unsigned int length)
{
Serial.print("Callback - ");
Serial.print("Message:");
for (int i = 0; i < length; i++)
{
Serial.print((char)payload[i]);
}
Serial.println();
}
// Der MQTT-Server wird initialisiert, ebenso der Name der Callback Funktion.
void SetupMqtt()
{
mqttClient.setServer(MQTT_SERVER, MQTT_PORT);
// set the callback function
mqttClient.setCallback(CallbackMqtt);
}
// Verbindung zum MQTT-Broker wird hergestellt
void ConnectToMqtt()
{
Serial.println("Connecting to MQTT Broker...");
while (!mqttClient.connected())
{
char clientId[100] = "\0";
sprintf(clientId, "ESP32Client-BuM", random(0xffff));
Serial.println(clientId);
if (mqttClient.connect(clientId))
{
Serial.println("Connected to MQTT broker.");
//subscribe to topic, nur dann wenn ESP32 vom Broker Daten erhalten soll
//mqttClient.subscribe("/sensors/commands"); // Gibt Topic der Empfangsdaten an
}
}
}
// Verbindung zum WLAN herstellen
void ConnectToWiFi()
{
Serial.print("Connecting to WiFi ");
Serial.println(WIFI_SSID);
WiFi.begin(WIFI_SSID, WIFI_PWD, 6);
while (WiFi.status() != WL_CONNECTED)
{
Serial.print(".");
delay(500);
}
Serial.print("\nConnected to ");
Serial.println(WIFI_SSID);
}
void setup()
{
Serial.begin(115200);
Serial.println("Setup begin");
ConnectToWiFi();
SetupMqtt();
dhtSensor.setup(DHT_PIN, DHTesp::DHT22);
Serial.println("Setup end");
}
// Dieser Buffer beinhaltet den String der Sendenachricht:
const size_t BUFFER_SIZE = 100;
const char *BUFFER_FORMAT = "%1.3f";
char buffer[BUFFER_SIZE + 1]; // Extrastelle für NULL Terminator.
void loop()
{
// Stellt sicher, dass Verbindung zum MQTT-Broker noch vorhanden ist
if (!mqttClient.connected())
{
ConnectToMqtt();
}
mqttClient.loop();
// Get new sensor events with the readings.
TempAndHumidity dht22Data = dhtSensor.getTempAndHumidity();
// Klimadaten in Sende-Buffer übernehmen und dessen Inhalt dann veröffentlichen
snprintf(buffer, BUFFER_SIZE, BUFFER_FORMAT, dht22Data.temperature);
mqttClient.publish("BuM/sensors/dht22_temp", buffer);
snprintf(buffer, BUFFER_SIZE, BUFFER_FORMAT, dht22Data.humidity);
mqttClient.publish("BuM/sensors/dht22_hum", buffer);
Serial.println("Temp: " + String(dht22Data.temperature, 2) + "°C");
Serial.println("Humidity: " + String(dht22Data.humidity, 1) + "%");
delay(500);
}