MQTT mit ESP

Lesezeit: 5 Minuten

Seite als PDF

Ziel des Projekts

Ein ESP-Mikro­con­troller misst die Tem­per­atur. Die Dat­en wer­den an einen MQTT-Serv­er gesendet, ein zweit­er ESP32 empfängt die Dat­en und zeigt sie auf einem OLED an.

Im Beispiel sendet ein ESP32-Wroom die Dat­en, ein NodeM­CU und ein Arduino Nano ESP32 emp­fan­gen die Dat­en und zeigen sie auf einem OLED an.

MQTT

MQTT (Mes­sage Queue Teleme­try Trans­port) ist ein Pro­tokoll für die Über­tra­gung von Dat­en nach dem Pub­lish­er-Sub­scriber-Mod­ell. Es beste­ht aus dem Serv­er (Bro­ker) und ver­schiede­nen Klien­ten. Ein­er dieser Klien­ten veröf­fentlicht (Pub­lish) zu einem The­ma (Top­ic) eine Nachricht und schickt sie an den Bro­ker. Ein ander­er Klient sendet eine Anfrage (Sub­scribe) zum Bro­ker und fragt nach Dat­en (Pay­load) zum fest­gelegten The­ma. Sind Dat­en vorhan­den, wer­den sie über­mit­telt.

Öffentliche Broker

Bro­kerPortBenutzer­namePass­wort
test.mosquitto.org1883
public.mqtthq.com1883
broker.emqx.io1883emqxpub­lic

Benötigte Bauteile

  • ESP32 oder ESP8266-Mikro­con­troller als Mess­gerät
  • ESP32 oder ESP8266-Mikro­con­troller für die Anzeige
  • Leitungs­drähte
  • OLED
  • DHT22

Konfiguration der Mikrocontroller

Der Schaltplan

ESP32-Wroom als Sender, NodeM­CU als Empfänger

Das Programm

Benötigte Bibliotheken

Funktionen der Bibliothek u8g2

Schlüs­sel­wortPara­me­terAktion
begin();OLED starten
get­Dis­play­Width();Bild­schirm­bre­ite fest­stellen
get­Dis­play­Height();Bild­schirmhöhe fest­stellen
clearDis­play();Bild­schirm dunkel schal­ten
setdrawColor(Parameter)0 → schwarz
1 → weiß
Zeichen­farbe fes­tle­gen
setContrast(Parameter)0 … 255Kon­trast ein­stellen
setDisplayRotation(U8G2_R*);U8G2_R0 → 0 Grad
U8G2_R1 → 90 Grad
U8G2_R2 → 180 Grad
U8G2_R3 → 270 Grad
Anzeige drehen
flipMode(Parameter);0 → nor­male Aus­rich­tung
1 → 180 Grad drehen
wirk­sam erst bei ein­er Rota­tion
Anzeige spiegeln (180 Grad)
home();Cur­sor in die linke obere Ecke set­zen
drawPixel(x‑Achse, y‑Achse)einzel­nen Pix­el zeich­nen
drawLine(StartX, StartX, EndeX, EndeY);Lin­ie zeich­nen
drawHLine(StartX, Star­tY, Länge);hor­i­zon­tale Lin­ie zeich­nen
drawVLine(StartX, Star­tY, Länge);ver­tikale Lin­ie zeich­nen
drawFrame(StartX, Star­tY„ Bre­ite, Höhe);Rechteck zeich­nen
drawRFrame(StartX, Star­tY, Bre­ite, Höhe, Eck­en­ra­dius);abgerun­detes Rechteck zeich­nen
drawBox(StartX, Star­tY, Bre­ite, Höhe);aus­ge­fülltes Rechteck zeich­nen
drawCircle(MittelpunkX, Mit­telpunk­tY, Radius, Kreisauss­chnitt);U8G2_DRAW_UPPER_RIGHT
U8G2_DRAW_UPPER_LEFT
U8G2_DRAW_LOWER_RIGHT
U8G2_DRAW_LOWER_LEFT
U8G2_DRAW_ALL
Kreis zeich­nen
Viertelkreis oben rechts
Viertelkreis oben links
Viertelkreis unten rechts
Viertelkreis unten links
voller Kreis
drawDisc(MittelpunkX, Mit­telpunk­tY, Radius);Aus­ge­füll­ten Kreis zeich­nen
drawEllipse(StartX, Star­tY, RadiusX, RadiusY);Ellipse zeich­nen
drawXBM(StartX, Star­tY, Bre­ite, Höhe, Array_Bilddatei);XBM-Bild anzeigen
setCursor(x‑Achse, y‑Achse);Cur­sor set­zen
setFont(Schriftart)Beispiele für funk­tion­ierende Schrif­tarten:
Schrifthöhe in Pix­eln (px)
6px: u8g2_font_5x7_tr
7px: u8g2_font_torussansbold8_8r
8px: u8g2_font_ncenB08_tr
10px: u8g2_font_t0_15b_me
12px: u8g2_font_helvB12_tf
13px: u8g2_font_t0_22_te
14px: u8g2_font_helvB14_tf
17px: u8g2_font_timB18_tf
18px: u8g2_font_lubB18_tr
20px: u8g2_font_courB24_tf
23px: u8g2_font_timB24_tf
25px: u8g2_font_helvR24_tf
32px: u8g2_font_logisoso32_tf
42px: u8g2_font_fub42_tf
58px: u8g2_font_logisoso58_tf
62px: u8g2_font_logisoso62_tn
Schrif­tart
print(“Text”);
drawStr(StartX, Star­tY ‚“Text”);
Text schreiben
setFontDirection(Wert);0 → nor­mal aus­gerichtet
1 → 90 ° gedreht
2 → 180 ° gedreht
3 → 270 ° gedreht
Schreib­rich­tung

Funktionen der Bibliothek ArduinoMqtt

Schlüs­sel­wortPara­me­terAktion
con­nect()Name des Bro­kers, Port des Bro­kersBro­ker verbinden
poll();Bro­ker abfra­gen
begin­Mes­sage();
print();
endMes­sage();
Min­destens Inhalt der Nachricht
option­al:
Länge der Nachricht,
auf dem Bro­ker behal­ten (true/false)
Qual­ität der Über­mit­tlung der Nachricht
0 = Nachricht wird ein­mal versendet
eine Über­prü­fung des Emp­fangs durch den Bro­ker find­et nicht statt
1 = die Nachricht wird solange versendet, bis der Bro­ker den Emp­fang bestätigt hat
2 = die Nachricht wird ein­mal gesendet
es wird sich­er gestellt, dass die Nachricht beim Bro­ker angekom­men ist

Dup­likat senden (true/false)
Nachricht senden starten
und mit print() über­mit­teln
begin­Will();
print();
end­Will();
The­ma
Länge der Nachricht,
auf dem Bro­ker behal­ten (true)
Qual­ität der Nachricht (0 .. 2)
ver­sucht eine getren­nte Verbindung neu aufzubauen
muss vor dem eigentlichen Verbindungsauf­bau ges­tartet wer­den
onMes­sage();Funk­tion für die Auswer­tung der emp­fan­gen Dat­en
Dat­en auswerten
sub­scribe()Min­destens das The­ma
option­al:
Qual­ität der Über­mit­tlung der Nachricht
nach­fra­gen ob Dat­en zum The­ma vorhan­den sind

Der Sender

Der Empfänger

MQTT mit Raspberry Pi

Die Verbindung zu den öffentlichen Bro­kern ist nicht ver­schlüs­selt und die Erre­ich­barkeit ist nicht garantiert. Als Lösung bietet sich an mit einem Rasp­ber­ry Pi einen eige­nen Bro­ker zu betreiben.

Rasp­ber­ry Pi als Bro­ker


let­zte Aktu­al­isierung: Okt. 24, 2025 @ 11:43