Arduino-Firmware für Seeed Studio XIAO ESP32-C6 auf dem XIAO Expansion Board, mit SSD1306-OLED (128 × 64) und Grove Temperature&Humidity Sensor (High-Accuracy & Mini) v1.0, TH02.
- Grove-I²C-Port: SDA = D4 (GPIO22), SCL = D5 (GPIO23), 3V3 und GND.
- OLED: Adresse 0x3C. TH02: 0x40. Zusätzlich antwortet 0x51 auf dem Board.
- Temperatur und relative Luftfeuchte werden etwa alle zwei Sekunden auf dem Display und über USB (115200 Baud) ausgegeben.
- Bei Kommunikationsfehlern erscheint
Sensor pruefen; alte Messwerte werden nicht weiter angezeigt. Eine Wandlung wird nach spätestens 200 ms abgebrochen.
Der TH02 wird mit Arduino Wire nach dem Seeed-Beispiel angesprochen.
Die Lesesequenz mit STOP liefert drei Bytes: Status, Messwert High, Messwert Low.
Eine automatische Erkennung anhand des ID-Registers funktionierte an diesem
Modul nicht; der Sensortyp ist deshalb passend zum bestätigten Aufdruck festgelegt.
Die Feuchteumrechnung entspricht dem einfachen Seeed-Beispiel ohne zusätzliche
Linearisierung oder Temperaturkompensation.
Das Gerät verbindet sich mit einem WLAN und bietet die Messwerte über HTTP und
SNMP an. Alle Netzwerk- und Anzeige-Einstellungen werden per serieller
Kommandozeile (USB, 115200 Baud) konfiguriert und in NVS (Preferences)
gespeichert. Die Serielle Konsole druckt beim Boot die aktuelle Konfiguration
und eine Befehlsübersicht (help).
| Befehl | Wirkung |
|---|---|
set ssid <name> |
WLAN-SSID setzen |
set pass <passwort> |
WLAN-Passwort setzen |
set snmpRo <community> |
SNMP Read-Community (Standard public) |
set snmpRw <community> |
SNMP Write-Community (Standard public) |
set disptimeout <ms> |
Display-Timeout in ms (0 = dauerhaft an) |
set httpport <port> |
HTTP-Port (Standard 80) |
set oidprefix <oid> |
SNMP-OID-Präfix, z. B. .1.3.6.1.4.1.54021 |
save |
Konfiguration dauerhaft speichern |
status |
Konfiguration und WLAN-Status anzeigen |
wifiscan |
sichtbare WLANs auflisten (hilfreich für exakte SSID) |
scan |
I2C-Bus-Scan |
reboot |
Gerät neu starten |
q |
laufende Messausgabe pausieren und CLI aktivieren |
watch |
laufende Messausgabe wieder starten |
Hinweis: Die Werte werden erst nach save + reboot wirksam (ausgenommen
disptimeout). WLAN-SSIDs sind groß-/kleinschreibungsabhängig — bei
Verbindungsproblemen wifiscan verwenden und die SSID exakt eintragen.
Nach dem Boot läuft die Messausgabe automatisch. In einem Terminal wie
screen /dev/ttyACM0 115200 pausiert q die Ausgabe und öffnet eine CLI mit
Eingabe-Echo; watch setzt die laufende Ausgabe fort.
Das Gerät überwacht die WLAN-Verbindung dauerhaft (Auto-Reconnect + eigene Reconnect-Logik mit 20-s-Timeout und 5-s-Wiederholung). Verliert es das WLAN, verbindet es sich automatisch erneut und startet HTTP/SNMP danach wieder — ein Power-Cycle ist nicht nötig.
Nach erfolgreicher WLAN-Verbindung:
http://<ip>/— HTML-Seite mit<meta http-equiv="refresh">(aktualisiert automatisch alle 2 Sekunden), darin Temperatur, Feuchte und Status.http://<ip>/json— JSON:{"temperature_c":24.91,"humidity_rh":69.56,"valid":true}
SNMP v2c mit Community public/public auf Port udp/161. Die OID-Basis ist
.1.3.6.1.4.1.54021 (Standard, über set oidprefix änderbar). Ausschließlich
lesend (get); die Werte sind Ganzzahlen, skaliert auf 1/100:
| OID | Inhalt | Beispiel |
|---|---|---|
.1.3.6.1.4.1.54021.1.1.0 |
Temperatur (1/100 °C) | 2525 = 25,25 °C |
.1.3.6.1.4.1.54021.1.2.0 |
relative Feuchte (1/100 %RH) | 6888 = 68,88 %RH |
.1.3.6.1.4.1.54021.1.3.0 |
1 = gültige Messung, 0 = Sensorfehler | 1 |
Bei Sensorfehlern liefern Temperatur- und Feuchte-OID noSuchInstance, nicht
0. Dadurch schreibt Zabbix keinen falschen Messwert von 0 °C bzw. 0 %RH. Die
Status-OID bleibt erreichbar und meldet dann 0.
Abfrage (net-snmp):
snmpget -v2c -c public 192.168.1.126 .1.3.6.1.4.1.54021.1.1.0 .1.3.6.1.4.1.54021.1.2.0Einschränkung: Die verwendete SNMP_Agent-Bibliothek (2.1.0) unterstützt
Einzel-GetRequest/GetNext zuverlässig; snmpwalk und Multi-Varbind-
GET-Requests werden von ihr nicht korrekt beantwortet (GetNext-Implementierung
unvollständig). Für Monitoring-Werkzeuge (z. B. Zabbix) die feste OIDs einzeln
pollen ist das kein Problem.
Unter zabbixtemplates/zabbix_6.4_ardutemp.xml liegt eine Zabbix-6.4-Vorlage
(Ardutemp - SNMP) mit drei Items:
| Item | OID | Einheit | Anmerkung |
|---|---|---|---|
| Temperatur | .1.3.6.1.4.1.54021.1.1.0 |
°C | Custom multiplier 0.01 (aus 1/100 °C) |
| Relative Luftfeuchte | .1.3.6.1.4.1.54021.1.2.0 |
% | Custom multiplier 0.01 (aus 1/100 %RH) |
| Sensor gültig | .1.3.6.1.4.1.54021.1.3.0 |
– | 1 = gültig, 0 = Sensorfehler |
Einrichten in Zabbix:
Datenraster→Vorlagen→Importieren, Datei auswählen.- Host anlegen und die Vorlage
Ardutemp - SNMPverknüpfen. - Beim Host ein SNMP-Interface mit der IP des Geräts, Port
161, und Communitypublicanlegen (in Zabbix 6.4 wird die Community am SNMP-Interface konfiguriert, nicht im Item).
Die Items pollen einzeln per GetRequest — das umgeht die oben erwähnte
GetNext-Einschränkung der Library und funktioniert zuverlässig.
Arduino CLI ist unter .tools/arduino-cli installiert, Boardpaket und Bibliotheken
liegen unter .arduino/. Die Konfiguration enthält absolute Pfade; bei Umzug
arduino-cli.yaml anpassen.
.tools/arduino-cli core update-index --config-file arduino-cli.yaml
.tools/arduino-cli core install esp32:esp32@3.3.11 --config-file arduino-cli.yaml
.tools/arduino-cli lib install 'U8g2@2.36.19' --config-file arduino-cli.yaml
.tools/arduino-cli lib install 'SNMP_Agent@2.1.0' --config-file arduino-cli.yaml
.tools/arduino-cli compile --config-file arduino-cli.yaml --fqbn esp32:esp32:XIAO_ESP32C6 --output-dir build ardutemp
.tools/arduino-cli upload --config-file arduino-cli.yaml --fqbn esp32:esp32:XIAO_ESP32C6 --port /dev/ttyACM0 --input-dir build ardutemp
.tools/arduino-cli monitor --config-file arduino-cli.yaml --port /dev/ttyACM0 --config baudrate=115200Die lokale SNMP_Agent-Library ist um einen nullable Integer-Handler erweitert,
damit Temperatur und Feuchte bei Sensorfehlern noSuchInstance liefern koennen.
Nach einer frischen Library-Installation den Patch
patches/SNMP_Agent-nullable-integer.patch im Library-Verzeichnis anwenden.
Alternativ ardutemp/ardutemp.ino in der Arduino IDE öffnen, Espressif-Boardpaket
und U8g2 installieren, Board XIAO ESP32C6 auswählen und USB CDC On Boot aktivieren.
Nach dem ersten Flashen ist keine SSID konfiguriert, WLAN (und damit HTTP/SNMP) bleibt aus. Im Seriellen Monitor dann z. B.:
set ssid MeinWLAN
set pass meinPasswort
save
reboot
Danach zeigt status die vergebene IP.
Build und Upload erfolgreich, Flash-Hashes verifiziert. Display-Ausgabe vom Benutzer bestätigt. Nach kurzem Trennen und Wiederverbinden des Grove-Kabels lieferte der Sensor fortlaufend Messwerte, z. B. 25,28 °C und 68,12 % RH. Zuvor blieb die Wandlung hängen; bei erneutem Auftreten den Sensor kurz stromlos machen. Keine Kalibrierung gegen ein Referenzmessgerät durchgeführt.
HTTP-Webinterface (Refresh-HTML + JSON) und SNMPv2c-Agent ergänzt, Konfiguration per serieller Kommandozeile. Getestet:
- WLAN-Verbindung erfolgreich (IP per DHCP), Serielle CLI inkl.
wifiscan. http://<ip>/und/jsonliefern korrekt Temperatur/Feuchte.snmpget -v2c -c public <ip> <oid>für Temperatur und Feuchte antwortet mit plausiblen Werten (z. B. Temperatur 2525 = 25,25 °C).
Bekannte Einschränkung: snmpwalk bzw. Multi-Varbind-get werden von der
SNMP_Agent-Bibliothek 2.1.0 nicht korrekt beantwortet (siehe Abschnitt SNMP).