MQTT mit ESP



Seite als PDF

Ziel des Projekts

Ein ESP-Mikro­con­trol­ler misst die Tem­pe­ra­tur. Die Daten wer­den an einen MQTT-Ser­ver gesen­det, ein zwei­ter ESP32 emp­fängt die Daten und zeigt sie auf einem OLED an.

Im Bei­spiel sen­det ein ESP32-Wroom die Daten, ein NodeM­CU und ein Ardui­no Nano ESP32 emp­fan­gen die Daten und zei­gen sie auf einem OLED an.

MQTT

MQTT (Mes­sa­ge Queue Tele­me­try Trans­port) ist ein Pro­to­koll für die Über­tra­gung von Daten nach dem Publisher-Sub­scri­ber-Modell. Es besteht aus dem Ser­ver (Bro­ker) und ver­schie­de­nen Kli­en­ten. Einer die­ser Kli­en­ten ver­öf­fent­licht (Publish) zu einem The­ma (Topic) eine Nach­richt und schickt sie an den Bro­ker. Ein ande­rer Kli­ent sen­det eine Anfra­ge (Sub­scri­be) zum Bro­ker und fragt nach Daten (Pay­load) zum fest­ge­leg­ten The­ma. Sind Daten vor­han­den, wer­den sie über­mit­telt.

Öffentliche Broker

Bro­kerPortBenut­zer­na­mePass­wort
test.mosquitto.org1883
public.mqtthq.com1883
broker.emqx.io1883emqxpublic

Benötigte Bauteile

  • ESP32 oder ESP8266-Mikro­con­trol­ler als Mess­ge­rät
  • ESP32 oder ESP8266-Mikro­con­trol­ler für die Anzei­ge
  • Lei­tungs­dräh­te
  • OLED
  • DHT22

Konfiguration der Mikrocontroller

Der Schaltplan

ESP32-Wroom als Sen­der, NodeM­CU als Emp­fän­ger

Das Programm

Benötigte Bibliotheken

Funktionen der Bibliothek u8g2

Schlüs­sel­wortPara­me­terAkti­on
begin();OLED star­ten
get­Dis­play­Width();Bild­schirm­brei­te fest­stel­len
get­Dis­play­H­eight();Bild­schirm­hö­he fest­stel­len
cle­ar­Dis­play();Bild­schirm dun­kel schal­ten
setdrawColor(Parameter)0 → schwarz
1 → weiß
Zei­chen­far­be fest­le­gen
setContrast(Parameter)0 ... 255Kon­trast ein­stel­len
setDisplayRotation(U8G2_R*);U8G2_R0 → 0 Grad
U8G2_R1 → 90 Grad
U8G2_R2 → 180 Grad
U8G2_R3 → 270 Grad
Anzei­ge dre­hen
flipMode(Parameter);0 → nor­ma­le Aus­rich­tung
1 → 180 Grad dre­hen
wirk­sam erst bei einer Rota­ti­on
Anzei­ge spie­geln (180 Grad)
home();Cur­sor in die lin­ke obe­re Ecke set­zen
drawPixel(x-Achse, y-Ach­se)ein­zel­nen Pixel zeich­nen
drawLine(StartX, StartX, End­eX, EndeY);Linie zeich­nen
drawHLine(StartX, Star­tY, Län­ge);hori­zon­ta­le Linie zeich­nen
drawVLine(StartX, Star­tY, Län­ge);ver­ti­ka­le Linie zeich­nen
drawFrame(StartX, Star­tY,, Brei­te, Höhe);Recht­eck zeich­nen
drawRFrame(StartX, Star­tY, Brei­te, Höhe, Ecken­ra­di­us);abge­run­de­tes Recht­eck zeich­nen
drawBox(StartX, Star­tY, Brei­te, Höhe);aus­ge­füll­tes Recht­eck zeich­nen
drawCircle(MittelpunkX, Mit­tel­punk­tY, Radi­us, Kreis­aus­schnitt);U8G2_DRAW_UPPER_RIGHT
U8G2_DRAW_UPPER_LEFT
U8G2_DRAW_LOWER_RIGHT
U8G2_DRAW_LOWER_LEFT
U8G2_DRAW_ALL
Kreis zeich­nen
Vier­tel­kreis oben rechts
Vier­tel­kreis oben links
Vier­tel­kreis unten rechts
Vier­tel­kreis unten links
vol­ler Kreis
drawDisc(MittelpunkX, Mit­tel­punk­tY, Radi­us);Aus­ge­füll­ten Kreis zeich­nen
drawEllipse(StartX, Star­tY, Radi­usX, Radi­usY);Ellip­se zeich­nen
drawXBM(StartX, Star­tY, Brei­te, Höhe, Array_Bilddatei);XBM-Bild anzei­gen
setCursor(x-Achse, y-Ach­se);Cur­sor set­zen
setFont(Schriftart)Bei­spie­le für funk­tio­nie­ren­de Schrift­ar­ten:
Schrift­hö­he in Pixeln (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
Schrift­art
print("Text");
drawStr(StartX, Star­tY ,"Text");
Text schrei­ben
setFontDirection(Wert);0 → nor­mal aus­ge­rich­tet
1 → 90 ° gedreht
2 → 180 ° gedreht
3 → 270 ° gedreht
Schreib­rich­tung
enableUTF8Print();Son­der­zei­chen anzei­gen

Funktionen der Bibliothek ArduinoMqtt

Schlüs­sel­wortPara­me­terAkti­on
con­nect()Name des Bro­kers, Port des Bro­kersBro­ker ver­bin­den
poll();Bro­ker abfra­gen
begin­Mes­sa­ge();
print();
end­Mes­sa­ge();
Min­des­tens Inhalt der Nach­richt
optio­nal:
Län­ge der Nach­richt,
auf dem Bro­ker behal­ten (true/false)
Qua­li­tät der Über­mitt­lung der Nach­richt
0 = Nach­richt wird ein­mal ver­sen­det
eine Über­prü­fung des Emp­fangs durch den Bro­ker fin­det nicht statt
1 = die Nach­richt wird solan­ge ver­sen­det, bis der Bro­ker den Emp­fang bestä­tigt hat
2 = die Nach­richt wird ein­mal gesen­det
es wird sicher gestellt, dass die Nach­richt beim Bro­ker ange­kom­men ist

Dupli­kat sen­den (true/false)
Nach­richt sen­den star­ten
und mit print() über­mit­teln
begin­Will();
print();
end­Will();
The­ma
Län­ge der Nach­richt,
auf dem Bro­ker behal­ten (true)
Qua­li­tät der Nach­richt (0 .. 2)
ver­sucht eine getrenn­te Ver­bin­dung neu auf­zu­bau­en
muss vor dem eigent­li­chen Ver­bin­dungs­auf­bau gestar­tet wer­den
onMes­sa­ge();Funk­ti­on für die Aus­wer­tung der emp­fan­gen Daten
Daten aus­wer­ten
sub­scri­be()Min­des­tens das The­ma
optio­nal:
Qua­li­tät der Über­mitt­lung der Nach­richt
nach­fra­gen ob Daten zum The­ma vor­han­den sind

Der Sender

Der Empfänger

MQTT mit Raspberry Pi

Die Ver­bin­dung zu den öffent­li­chen Bro­kern ist nicht ver­schlüs­selt und die Erreich­bar­keit ist nicht garan­tiert. Als Lösung bie­tet sich an mit einem Raspber­ry Pi einen eige­nen Bro­ker zu betrei­ben.

Raspber­ry Pi als Bro­ker


letz­te Aktua­li­sie­rung: Feb. 5, 2026 @ 19:26

Inhalt