Ein Raspberry Pi Sense HAT MQTT Projekt ist einer der schnellsten Wege zu einem echten bidirektionalen IoT-Gerät: Die Platine trägt bereits Sensoren für Temperatur, Luftfeuchtigkeit und Luftdruck, einen Beschleunigungssensor, ein Gyroskop und ein Magnetometer, einen Joystick und eine 8x8-RGB-LED-Matrix. In diesem Tutorial veröffentlichen Sie Umwelt- und IMU-Daten als JSON an einen MQTT-Broker und lassen jede an den Pi gesendete Nachricht über die LED-Matrix laufen, alles in einem einzigen Python-Skript.
Was der Sense HAT bietet
| Sensor oder Ausgabe | Python-Aufruf | Einheiten |
|---|---|---|
| Temperatur | sense.get_temperature() |
Grad Celsius |
| Relative Luftfeuchtigkeit | sense.get_humidity() |
Prozent |
| Luftdruck | sense.get_pressure() |
Millibar (hPa) |
| Lage | sense.get_orientation() |
Pitch, Roll, Yaw in Grad |
| Beschleunigung | sense.get_accelerometer_raw() |
x, y, z in g |
| Joystick | sense.stick.get_events() |
Richtung und Aktion |
| LED-Matrix | sense.show_message(), sense.clear() |
8x8 RGB |
Der HAT wird direkt auf die 40-polige Stiftleiste jedes Pi mit dieser Leiste gesteckt, einschließlich Pi 4 und Pi 5. Verdrahtung ist nicht nötig, was ihn ideal für Unterricht, Demos und schnelle Prototypen macht. Die offizielle Sense-HAT-Dokumentation beschreibt die Hardware ausführlich.
Die Software installieren
Die Sense-HAT-Bibliothek wird als Debian-Paket ausgeliefert. Installieren Sie sie systemweit und legen Sie dann eine virtuelle Umgebung an, die sie sehen kann:
sudo apt update
sudo apt install -y sense-hat python3-venv
mkdir -p ~/sensehat-mqtt && cd ~/sensehat-mqtt
python3 -m venv --system-site-packages .venv
source .venv/bin/activate
pip install "paho-mqtt>=2.0"
Prüfen Sie, ob der HAT erkannt wird, bevor Sie MQTT-Code schreiben:
python -c "from sense_hat import SenseHat; s = SenseHat(); print(s.get_temperature(), s.get_humidity()); s.show_message('OK')"
Sehen Sie zwei Zahlen und läuft „OK“ über die Matrix, ist die Hardware bereit. Erhalten Sie einen Fehler zum Framebuffer oder zu I2C, prüfen Sie, ob der HAT richtig sitzt und I2C in sudo raspi-config unter Interface Options aktiviert ist.
Topic-Struktur
Halten Sie die Sense-HAT-Topics unter einem eindeutigen Präfix, damit nichts mit anderen Nutzern des geteilten öffentlichen MQTT-Brokers kollidiert:
| Topic | Richtung | Rate | Retained |
|---|---|---|---|
connectmq/demo/5d82be/sensehat/env |
Pi veröffentlicht | Alle 10 s | Nein |
connectmq/demo/5d82be/sensehat/imu |
Pi veröffentlicht | Jede Sekunde | Nein |
connectmq/demo/5d82be/sensehat/joystick |
Pi veröffentlicht | Bei Ereignis | Nein |
connectmq/demo/5d82be/sensehat/display |
Pi abonniert | Bei Bedarf | Nein |
connectmq/demo/5d82be/sensehat/status |
Pi veröffentlicht, plus Last Will | Beim Verbinden | Ja |
Ersetzen Sie 5d82be durch Ihre eigene Zufallszeichenfolge. Der öffentliche MQTT-Broker erlaubt 10 Nachrichten pro Sekunde und Client; eine IMU-Nachricht pro Sekunde plus gelegentliche Umwelt- und Joystick-Ereignisse bleiben also bequem unter dem Limit.
Das Raspberry Pi Sense HAT MQTT-Skript
Der wichtigste Designpunkt: show_message() blockiert, solange der Text läuft. Rufen Sie es im MQTT-Callback auf, stockt die Netzwerkschleife, und der Client kann Keepalives verpassen. Das folgende Skript legt eingehende Nachrichten in eine Queue und lässt einen separaten Anzeige-Thread sie darstellen, während der Hauptthread Sensoren liest und veröffentlicht. Speichern Sie es als sensehat_mqtt.py:
#!/usr/bin/env python3
"""Publish Sense HAT data over MQTT and show incoming messages on the LED matrix."""
import json
import os
import queue
import threading
import time
import uuid
import paho.mqtt.client as mqtt
from sense_hat import SenseHat
BROKER = os.getenv("MQTT_HOST", "broker.connectmq.com")
PORT = int(os.getenv("MQTT_PORT", "1883"))
USERNAME = os.getenv("MQTT_USERNAME")
PASSWORD = os.getenv("MQTT_PASSWORD")
CLIENT_ID = os.getenv("MQTT_CLIENT_ID", f"sensehat-{uuid.uuid4().hex[:8]}")
PREFIX = os.getenv("MQTT_PREFIX", "connectmq/demo/5d82be/sensehat")
ENV_INTERVAL = 10
IMU_INTERVAL = 1
CPU_FACTOR = 2.0 # gegen ein Referenzthermometer kalibrieren
sense = SenseHat()
sense.set_imu_config(True, True, True) # Kompass, Gyroskop, Beschleunigungssensor
sense.low_light = True
messages = queue.Queue(maxsize=20)
def cpu_temperature():
with open("/sys/class/thermal/thermal_zone0/temp") as f:
return int(f.read()) / 1000.0
def corrected_temperature():
raw = sense.get_temperature_from_humidity()
cpu = cpu_temperature()
# Der HAT sitzt über der CPU, daher messen seine Sensoren zu warm. Diese einfache
# Heuristik zieht einen Teil der Differenz ab; CPU_FACTOR für Ihren Fall anpassen.
return raw - (cpu - raw) / CPU_FACTOR, raw
def display_worker():
while True:
text, colour = messages.get()
try:
sense.show_message(text, scroll_speed=0.06, text_colour=colour)
finally:
sense.clear()
def on_connect(client, userdata, flags, reason_code, properties):
if reason_code.is_failure:
print(f"Connection refused: {reason_code}")
return
print(f"Connected as {CLIENT_ID}")
client.publish(f"{PREFIX}/status", "online", qos=1, retain=True)
client.subscribe(f"{PREFIX}/display", qos=1)
def on_message(client, userdata, msg):
raw = msg.payload.decode(errors="ignore").strip()
colour = [255, 255, 255]
text = raw
if raw.startswith("{"):
try:
data = json.loads(raw)
text = str(data.get("text", ""))
colour = data.get("colour", colour)
except json.JSONDecodeError:
pass
text = text[:80]
if text:
try:
messages.put_nowait((text, colour))
except queue.Full:
print("Display queue full, dropping message")
client = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2, client_id=CLIENT_ID)
client.on_connect = on_connect
client.on_message = on_message
client.will_set(f"{PREFIX}/status", "offline", qos=1, retain=True)
client.reconnect_delay_set(min_delay=1, max_delay=60)
if USERNAME:
client.username_pw_set(USERNAME, PASSWORD)
if PORT == 8883:
client.tls_set()
threading.Thread(target=display_worker, daemon=True).start()
client.connect(BROKER, PORT, keepalive=30)
client.loop_start()
last_env = 0.0
last_imu = 0.0
try:
while True:
now = time.time()
# Lage häufig abfragen, damit die Sensorfusion genau bleibt.
orientation = sense.get_orientation()
if now - last_imu >= IMU_INTERVAL:
accel = sense.get_accelerometer_raw()
imu = {
"pitch": round(orientation["pitch"], 1),
"roll": round(orientation["roll"], 1),
"yaw": round(orientation["yaw"], 1),
"ax": round(accel["x"], 3),
"ay": round(accel["y"], 3),
"az": round(accel["z"], 3),
"ts": int(now),
}
client.publish(f"{PREFIX}/imu", json.dumps(imu), qos=0)
last_imu = now
if now - last_env >= ENV_INTERVAL:
temp, raw_temp = corrected_temperature()
env = {
"temperature": round(temp, 1),
"temperature_raw": round(raw_temp, 1),
"humidity": round(sense.get_humidity(), 1),
"pressure": round(sense.get_pressure(), 1),
"cpu_temp": round(cpu_temperature(), 1),
"ts": int(now),
}
client.publish(f"{PREFIX}/env", json.dumps(env), qos=1)
last_env = now
for event in sense.stick.get_events():
if event.action == "pressed":
payload = {"direction": event.direction, "ts": int(event.timestamp)}
client.publish(f"{PREFIX}/joystick", json.dumps(payload), qos=1)
time.sleep(0.05)
except KeyboardInterrupt:
pass
finally:
client.publish(f"{PREFIX}/status", "offline", qos=1, retain=True).wait_for_publish(2)
client.loop_stop()
client.disconnect()
sense.clear()
Starten Sie es mit python sensehat_mqtt.py. Die Hauptschleife fragt die Lage alle 50 ms ab, weil die Sensorfusion des Sense HAT häufige Lesevorgänge braucht, um Pitch, Roll und Yaw stabil zu halten; veröffentlicht wird aber nur einmal pro Sekunde.
Nachrichten an die LED-Matrix senden
Abonnieren Sie zunächst von einem beliebigen Rechner aus die Daten:
mosquitto_sub -h broker.connectmq.com -p 1883 -i viewer-5d82be \
-t 'connectmq/demo/5d82be/sensehat/#' -v
Senden Sie dann reinen Text oder eine JSON-Nachricht mit Farbe:
mosquitto_pub -h broker.connectmq.com -p 1883 -i sender-5d82be \
-t 'connectmq/demo/5d82be/sensehat/display' -m 'Hello from MQTT'
mosquitto_pub -h broker.connectmq.com -p 1883 -i sender-5d82be \
-t 'connectmq/demo/5d82be/sensehat/display' \
-m '{"text":"Door open","colour":[255,80,0]}'
Die Nachricht läuft in Weiß oder Orange durch, während Temperatur- und Lagedaten weiter fließen. Neigen Sie den Pi und beobachten Sie, wie sich Pitch und Roll im Abonnentenfenster ändern; drücken Sie den Joystick, um Ereignisse eintreffen zu sehen. Das Display-Topic ist bewusst nicht retained, sonst würde die letzte Nachricht bei jeder Wiederverbindung des Pi erneut angezeigt.
Ehrliche Temperaturwerte erhalten
Der Sense HAT sitzt direkt über dem Prozessor, daher messen seine Temperatursensoren einige Grad zu hoch, bei einem ausgelasteten Pi 4 oder Pi 5 noch mehr. Das Skript veröffentlicht sowohl den Rohwert als auch eine korrigierte Schätzung. So kalibrieren Sie die Korrektur:
- Legen Sie ein verlässliches Thermometer neben den Pi und lassen Sie beide 20 Minuten lang einpendeln.
- Vergleichen Sie den Referenzwert mit
temperature_rawundcpu_tempaus den MQTT-Nachrichten. - Passen Sie
CPU_FACTORan, bistemperaturemit der Referenz übereinstimmt. - Für höhere Genauigkeit schließen Sie den HAT über eine 40-polige Flachbandverlängerung an, damit er von der CPU entfernt sitzt.
Wenn Sie eine präzise Raumtemperatur statt einer Demo brauchen, ist ein eigener Fühler das bessere Werkzeug. Unsere Anleitungen zum Raspberry Pi DHT22 mit MQTT und zum 1-Wire-Fühler DS18B20 zeigen, wie Sie externe Sensoren im selben Topic-Stil veröffentlichen.
Die Daten visualisieren
Weil alles als kompaktes JSON über MQTT übertragen wird, kann jeder Abonnent es nutzen. Node-RED zeichnet eine Live-Anzeige, Telegraf schreibt in InfluxDB, und Grafana stellt Monate an Verlauf dar; die Anleitung Raspberry Pi mit Grafana und InfluxDB baut diesen Stack auf. Für einen schnellen Blick ohne Installation zeigen der MQTT-Client im Browser und der Live-Topic-Explorer im ConnectMQ-Portal jede env- und imu-Nachricht, sobald sie eintrifft.
Von der Demo zum privaten Broker
Der öffentliche MQTT-Broker ist für alle lesbar. Für einen Lauftext-Gruß ist das in Ordnung, für einen Sensor in Ihrer Wohnung oder Ihrem Klassenzimmer nicht. ConnectMQ bietet Ihnen einen privaten Broker mit generierten Zugangsdaten und TLS. Setzen Sie vier Umgebungsvariablen, und das Skript verbindet sich sicher:
export MQTT_HOST=broker.connectmq.com
export MQTT_PORT=8883
export MQTT_USERNAME=YOUR_USERNAME
export MQTT_PASSWORD=YOUR_PASSWORD
export MQTT_CLIENT_ID=YOUR_CLIENT_ID
export MQTT_PREFIX=classroom/lab1/sensehat
python sensehat_mqtt.py
Damit das Skript nach einem Neustart weiterläuft, verpacken Sie es in einen systemd-Dienst, wie im Raspberry Pi MQTT Tutorial gezeigt.
Ideen zur Erweiterung des Projekts
Sobald die Grundschleife funktioniert, wird der Sense HAT zu einem praktischen Prüfstand für MQTT-Muster, die Sie auf echten Geräten wiederverwenden:
- Neigungsalarm: Ein zweites Skript abonniert das
imu-Topic und veröffentlicht eine Warnung, wenn Pitch oder Roll einen Grenzwert überschreitet, ein einfacher Ersatz für die Überwachung einer Maschine, die sich nicht bewegen sollte. - Statusanzeige aus der Ferne: Veröffentlichen Sie kurze Statusmeldungen aus einer CI-Pipeline, einem Hausautomations-Flow oder einem Server-Health-Check an das
display-Topic und nutzen Sie die Matrix als Schreibtisch-Melder. - Joystick als Fernbedienung: Abonnieren Sie das
joystick-Topic aus Node-RED und ordnen Sie jeder Richtung eine Szene, ein Relais oder eine Dashboard-Seite zu. - Schwellwert-Alarme ohne Code: Legen Sie auf einem privaten ConnectMQ-Broker im Portal eine Alarmregel auf den Feuchtewert des
env-Topics an und prüfen Sie ausgelöste Alarme im Alarmprotokoll. - Mehrere Klassenzimmer: Geben Sie jedem Pi eine eigene Präfixebene, etwa
school/room12/sensehat, und abonnieren Sie mit einem+-Wildcard, um Räume nebeneinander zu vergleichen.
Jede Idee braucht nur einen neuen Abonnenten oder ein neues Topic. Das Pi-Skript bleibt gleich, und genau diese Entkopplung macht die Arbeit mit MQTT so angenehm.
Fehlerbehebung
OSError: Cannot detect RPi-Sense FB device: Der HAT wird nicht erkannt; stecken Sie ihn bei ausgeschaltetem Pi neu auf.- Yaw driftet oder springt: Kalibrieren Sie das Magnetometer und halten Sie den Pi fern von Motoren und Lautsprechern; die Lage braucht außerdem häufige Abfragen.
- Nachrichten laufen durch, aber Sensordaten bleiben aus: Etwas blockiert die Hauptschleife; rufen Sie
show_message()nie aus einem Callback auf. - Luftfeuchtigkeit zeigt 0: Der Feuchtesensor braucht nach dem Start einen Moment; verwerfen Sie den ersten Messwert.
Starten Sie mit ConnectMQ
Ziehen Sie Ihren Sense HAT in wenigen Minuten vom öffentlichen MQTT-Broker auf einen privaten Broker um. Erstellen Sie einen kostenlosen Serverless-Broker, ohne Kreditkarte, und verbinden Sie sich mit den generierten Zugangsdaten per TLS. Sie erhalten einen verwalteten MQTT-Broker, der MQTT 3.1.1 und 5.0 unterstützt, sowie ein Portal, in dem Sie Anzeige-Nachrichten senden und jeden Messwert live verfolgen.
Häufig gestellte Fragen
Warum ist die Sense-HAT-Temperatur höher als die Raumtemperatur?
Die Wärme des Raspberry-Pi-Prozessors heizt den HAT auf. Nutzen Sie die CPU-basierte Korrektur aus diesem Tutorial, ein Flachband-Verlängerungskabel oder einen externen Sensor für genaue Werte.
Kann ich Sense-HAT-Daten häufiger als einmal pro Sekunde veröffentlichen?
Ja, aber bleiben Sie innerhalb der Ratenlimits Ihres Brokers; der öffentliche MQTT-Broker erlaubt 10 Nachrichten pro Sekunde und Client. Fassen Sie hochfrequente Bewegungsdaten zu mehreren Messwerten in einer JSON-Nachricht zusammen.
Funktioniert der Sense HAT auf einem Raspberry Pi 5?
Ja, er nutzt die Standard-Stiftleiste mit 40 Pins und das Paket sense-hat aus Raspberry Pi OS. Rechnen Sie mit größeren Temperaturabweichungen, weil der Pi 5 wärmer läuft.
Wie sende ich farbigen Text an die LED-Matrix?
Veröffentlichen Sie JSON wie {"text":"Hi","colour":[0,255,0]} an das Display-Topic. Das Skript liest die Farbe als RGB-Liste und verwendet bei reinem Text Weiß.



