Inhaltsverzeichnis
Sender
#include "ArduinoMqttClient.h"
// ESP8266: NodeMCU, Wemos D1 Mini
// #include "ESP8266WiFi.h"
// ESP32
#include "WiFi.h"
#include "DHT.h"
// Pin des DHT-Sensors
int SENSOR_DHT = 4;
// DHT11
// #define SensorTyp DHT11
// DHT22
#define SensorTyp DHT22
// dht-Sensor einen Namen und Typ zuweisen
DHT dht(SENSOR_DHT, SensorTyp);
char Router[] = "Router_SSID";
char Passwort[] = "xxxxxxx";
WiFiClient wifiClient;
// wifiClient MqttClient zuordnen
MqttClient mqttClient(wifiClient);
// RaspberryPi als Broker
// const char broker[] = "192.168.1.222";
int port = 1883;
const char broker[] = "test.mosquitto.org";
/* öffentliche Broker
const char broker[] = "public.mqtthq.com";
int port = 1883;
const char broker[] = "test.mosquitto.org";
int port = 1883;
const char broker[] = "broker.emqx.io";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
int port = 1883;
*/
// Thema für Senden/Empfangen
const char Messdaten[] = "Messdaten";
// Thema für die "will"-Nachricht für den Versuch die Verbindung
// neu aufzubauen
const char getrennteVerbindung[] = "getrennteVerbindung";
// Intervall zwischen den Messungen
const long Interval = 5000;
unsigned long vorherigeZeit = 0;
void setup()
{
Serial.begin(9600);
while (!Serial);
delay(1000);
WiFi.begin(Router, Passwort);
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
Serial.println();
Serial.print("Verbunden mit ");
Serial.println(Router);
Serial.print("IP über DHCP: ");
Serial.println(WiFi.localIP());
/*
will-Nachricht:
wird an den Broker gesendet und versucht eine getrennte Verbindung neu aufzubauen
Parameter:
Thema, Länge des gesendeten Strings, Behalten der Anforderung, Qualität der Verbindung
muss vor dem Aufbau der Verbindung zum Broker festgelegt werden
*/
String willDaten = "getrennt";
bool Behalten = true;
int willQualitaetService= 2;
// will-Nachricht senden
mqttClient.beginWill(getrennteVerbindung, willDaten.length(), Behalten, willQualitaetService);
mqttClient.print(getrennteVerbindung);
mqttClient.endWill();
Serial.println("Versuche mit dem Broker " + String(broker) + " zu verbinden ... ");
delay(1000);
// Verbindungsversuch
if (!mqttClient.connect(broker, port))
{
Serial.print("Verbindung zum Broker gescheitert");
// Programm anhalten
while (1);
}
Serial.println();
Serial.println("Mit dem Broker " + String(broker) + " verbunden!");
Serial.println();
// dht-Sensor starten
dht.begin();
}
void loop()
{
// Broker abfragen
mqttClient.poll();
unsigned long aktuelleZeit = millis();
// Intervall zwischen den Sendezeiten
if (aktuelleZeit - vorherigeZeit >= Interval)
{
// letzte Sendezeit sichern
vorherigeZeit = aktuelleZeit;
// gemessene Temperatur dht in String umwandeln
String Temperatur = String(dht.readTemperature(), 1);
// . durch , ersetzen
Temperatur.replace(".", ",");
// gemessene Luftfeuchtigkeit in String umwandeln
String Luftfeuchtigkeit = String(dht.readHumidity(), 1);
// . durch , ersetzen
Luftfeuchtigkeit.replace(".", ",");
// String Senden zusammenbauen / als Trennzeichen
String Senden = Temperatur + "/" + Luftfeuchtigkeit;
Serial.println("Nachricht gesendet:");
// Anzeige im Seriellen Monitor: String Senden am / trennen
int Suche = Senden.indexOf("/");
// String bis zum /
Temperatur = Senden.substring(0, Suche);
// String vom ersten Zeichen hinter / bis zum Ende
Luftfeuchtigkeit = Senden.substring(Suche + 1, Senden.length());
// Daten im Seriellen Monitor anzeigen
Serial.println(Temperatur + "°C");
Serial.println(Luftfeuchtigkeit + "%");
Serial.println("---------------------");
// Messdaten senden
bool Behalten = false;
int ServiceQualitaet = 2;
bool Duplikat = false;
mqttClient.beginMessage(Messdaten, Senden.length(), Behalten, ServiceQualitaet, Duplikat);
mqttClient.print(Senden);
mqttClient.endMessage();
}
}
Empfänger
#include "ArduinoMqttClient.h"
// ESP32
// #include "WiFi.h"
// ESP8266: NodeMCU, Wemos D1 Mini
#include "ESP8266WiFi.h"
#include "U8g2lib.h"
/*
Typbezeichnung mit Bildschirmgröße in Pixeln
1 = page buffer mode, F = full screen buffer mode
Hardware I2C/Hardware SPI
Name des OLEDs
Rotation R0 (keine)
*/
U8G2_SSD1306_128X64_NONAME_1_HW_I2C oled(U8G2_R0, U8X8_PIN_NONE);
// Router SSID/Passwort
char Router[] = "FRITZ!Box 7590 LB";
char Passwort[] = "anea1246";
WiFiClient wifiClient;
MqttClient mqttClient(wifiClient);
// RaspberryPi als Broker
// const char broker[] = "192.168.1.222";
const char broker[] = "test.mosquitto.org";
int port = 1883;
/* öffentliche Broker
const char broker[] = "public.mqtthq.com";
int port = 1883;
const char broker[] = "test.mosquitto.org";
int port = 1883;
const char broker[] = "broker.emqx.io";
const char *mqtt_username = "emqx";
const char *mqtt_password = "public";
int port = 1883;
*/
// Thema für Senden/Empfangen
const char Messdaten[] = "Messdaten";
/*
Qualität der Verbindung (0 .. 2)
0 = Nachricht wird einmal versendet
eine Überprüfung des Empfangs durch den Broker findet nicht statt
1 = die Nachricht wird solange versendet, bis der Broker den Empfang bestätigt hat
2 = die Nachricht wird einmal gesendet, es wird sicher gestellt, dass sie
beim Broker angekommen ist
*/
int subscribeQoS = 2;
void setup()
{
Serial.begin(9600);
while (!Serial);
delay(1000);
WiFi.begin(Router, Passwort);
while (WiFi.status() != WL_CONNECTED)
{
delay(200);
Serial.print(".");
}
Serial.println();
Serial.print("Verbunden mit ");
Serial.println(Router);
Serial.print("IP über DHCP: ");
Serial.println(WiFi.localIP());
Serial.print("Versuche mit dem Broker " + String(broker) + " zu verbinden ... ");
// Verbindung zum Broker aufbauen
if (!mqttClient.connect(broker, port))
{
Serial.print("Verbindung zum Broker gescheitert");
// Programm anhalten
while (1);
}
Serial.println();
Serial.println("Mit dem Broker " + String(broker) + " verbunden!");
Serial.println();
// den Rückruf für den Nachrichtenempfang festlegen
mqttClient.onMessage(empfangeneNachricht);
// in das Thema Messdaten "einschreiben"
mqttClient.subscribe(Messdaten, subscribeQoS);
// OLED starten
oled.begin();
// Kontrast maximal 255
oled.setContrast(200);
oled.setFont(u8g2_font_helvR24_tf);
// Zeichenfarbe weiß
oled.setDrawColor(1);
// horizontale Schrift
oled.setFontDirection(0);
}
void loop()
{
// Broker abfragen
mqttClient.poll();
}
void empfangeneNachricht(int NachrichtGroesse)
{
Serial.println("Nachricht empfangen: ");
// Thema der Nachricht empfangen und anzeigen
String Nachricht = mqttClient.messageTopic();
Serial.println(Nachricht + " ");
// Nachricht als String lesen
String EmpfangeneNachricht = mqttClient.readString();
// String Anzeige am / trennen
int Suche = EmpfangeneNachricht.indexOf("/");
String Temperatur = EmpfangeneNachricht.substring(0, Suche);
String Luftfeuchtigkeit = EmpfangeneNachricht.substring(Suche + 1, EmpfangeneNachricht.length());
// Anzeige im Seriellen Monitor
Serial.println(Temperatur + "°C");
Serial.println(Luftfeuchtigkeit + "%");
Serial.println("---------------------");
Serial.println();
// Anzeige OLED
oled.clearDisplay();
oled.firstPage();
do
{
oled.setCursor(2, 30);
oled.print(Temperatur);
// Grad-Zeichen
oled.print((char)176);
oled.print("C");
oled.setCursor(2, 60);
oled.print(Luftfeuchtigkeit + "%");
}
while (oled.nextPage());
}