Einsteiger begegnen dem Problem beim ersten Flashen: Die Firmware wird über USB in den Flash-Speicher geschrieben, und genau dann, wenn in setup() das WLAN gestartet wird, startet das Gerät endlos neu. Wer den Brownout-Reset nicht kennt, sucht wochenlang nach Softwarefehlern.
Ein Brownout-Reset ist das kontrollierte Abschalten des Mikrocontrollers, wenn die Versorgungsspannung kurz unter eine festgelegte Abschalt-Schwelle fällt. Der Chip startet dann bewusst neu, um Datenfehler zu vermeiden. Das Hochfahren des Funkmoduls zieht für Millisekunden deutlich mehr Strom als im Ruhezustand.
Das ohmsche Gesetz erklärt den Zusammenbruch: Jede Spannungsquelle hat einen Innenwiderstand. Steigt der Strom, sinkt die Spannung um Widerstand mal Strom, und der Chip fällt unter die Schwelle.
Klassisches Bild: Ein ESP32 an einem schwachen Netzteil. Serial.begin() im setup() läuft, der serielle Monitor zeigt Meldungen – bis die WLAN-Verbindung startet. Dann Neustart, wieder WLAN, wieder Neustart. Die Baudrate, also die Übertragungsgeschwindigkeit der seriellen Schnittstelle, ist bei Firmware und Monitor gleich, die Firmware auch. Nur die Versorgung bricht zusammen.
Der Unterschied: Der Chip startet nicht neu, weil das Programm fehlschlägt, sondern weil die Spannung fehlt. Auch ein zu dünnes USB-Kabel oder ein schlechter Breadboard-Kontakt verursacht denselben Reset.
Brownout ist kein Softwarefehler, sondern ein Symptom zusammenbrechender Versorgung. Abhilfe: ein ausreichend dimensioniertes Netzteil, kurze dicke Leitungen und ein Abblockkondensator, also ein Kondensator von der Versorgung nach Masse nahe am Chip, der Stromspitzen abfängt.
📌 Brownout-Reset · Innenwiderstand · Abblockkondensator
📚 IoT von Grund auf · Tag 6 von 30
#esp32 #Mikrocontroller #firmware
Viele Einsteiger glauben, die Stromversorgung sei gut genug, wenn der Spannungsregler (das Bauteil, das die Betriebsspannung bereitstellt) die richtige Spannung liefert. Klingt plausibel: Der Chip läuft ja stabil, solange er nur rechnet.
Tatsächlich zieht ein Mikrocontroller kurzzeitig deutlich mehr Strom, etwa beim Aktivieren des Funkmoduls. Der Entkopplungskondensator ist ein kleiner Ladungsspeicher direkt am Versorgungspin, der solche Spitzen ausgleicht. Jede Leitung zur Stromquelle hat einen kleinen Innenwiderstand und eine Induktivität (Trägheit gegen plötzliche Stromänderungen). Deshalb reagiert eine lange Leitung zu träge, und die Spannung am Pin bricht kurz ein.
Der Irrtum entsteht, weil das Messgerät nur Durchschnittswerte zeigt. Ein Spannungseinbruch von Mikrosekunden bleibt unsichtbar, führt aber zum Neustart.
Espressif empfiehlt für den ESP32 eine Versorgung, die mindestens 500 mA liefern kann, weil das Senden kurze Stromspitzen verursacht. Ein USB-2.0-Port liefert nach Spezifikation höchstens 500 mA; Entwicklungsboards mit weiteren Verbrauchern erreichen diese Grenze schnell. Praxisregel: 100 nF je Versorgungspin direkt daneben, plus ein größerer Puffer im Mikrofarad-Bereich nahe am Regler.
Woran man es erkennt: Der Controller startet sich genau beim Senden neu oder friert ein. Ein Brownout-Reset (Schutzmechanismus, der bei zu niedriger Spannung geordnet neu startet) bei WLAN-Aktivität deutet auf lange Leitungen, schwache Regler oder fehlende Pufferkondensatoren hin.
Entkopplung heißt nicht verschwendeter Platz auf der Platine, sondern ein lokaler Energiespeicher, der Stromspitzen am Pin abfängt, bevor sie den Chip abschalten.
📌 100 nF am Versorgungspin · Stromspitzen abfangen · Brownout-Reset beim Senden
📚 IoT von Grund auf · Tag 6 von 30
#esp32 #Mikrocontroller
Ein Spannungsregler ist ein Bauteil, das an seinem Ausgang eine feste, nahezu konstante Spannung hält, obwohl die Eingangsspannung schwankt. Er sitzt in fast jedem USB-Netzteil und auf jedem Entwicklungsboard.
Zuerst kommt die Schwankung am Eingang an. Eine Akkuzelle, ein Netzteil oder USB liefert keine exakt konstante Spannung. Ohne Regler läge diese Schwankung direkt am Chip.
Dann vergleicht der Regler fortlaufend seine Ausgangsspannung mit einem internen Sollwert. Ein Linearregler arbeitet dabei wie ein ständig nachgeregeltes Vorwiderstands-Bauteil. Er hält die 3,3 V stabil, indem er die überschüssige Spannung selbst abbaut.
Danach fällt die überschüssige Energie als Wärme ab. Die Verlustleistung ergibt sich aus der Spannungsdifferenz zwischen Ein- und Ausgang mal dem Strom. Bei 9 V Eingang und 3,3 V Ausgang wird so mehr als die Hälfte der Energie zu Wärme. Typisch ist ein 5-V-USB-Netzteil, das über einen Linearregler einen ESP32 versorgt. Der Regler wandelt die Differenz von 1,7 V in Wärme um. Bei hohem Strom und großer Differenz ist ein Schaltregler effizienter, der durch schnelles Ein- und Ausschalten arbeitet, aber mehr Störungen verursacht.
Zuletzt versorgt der geregelte Ausgang den Mikrocontroller. Der ESP32 arbeitet mit 3,3-V-Logik und braucht beim Senden kurze Stromspitzen. Deshalb gehören Entkopplungskondensatoren – kleine Kondensatoren, die Stromspitzen kurzzeitig abpuffern –, typisch 100 nF, so nah wie möglich an jeden Versorgungspin.
Ein ESP32 gehört also nie direkt an eine höhere Versorgungsspannung. Der Regler heißt nicht „unnötiges Bauteil“, sondern er ist der Grund, warum der Chip stabile 3,3 V bekommt – und überlebt.
📌 Spannungsregler · Linearregler · Verlustleistung
📚 IoT von Grund auf · Tag 6 von 30
#esp32 #iot
Die Verwechslung entsteht, weil alle drei Modi „Schlaf“ heißen. In Wahrheit schaltet der Chip verschieden viel ab, vom bloßen Funkteil bis zum fast kompletten Abschalten.
Modem Sleep ist der mildeste Modus: Nur das Funkteil für WLAN und Bluetooth ist stumm, die CPU läuft weiter. Das Programm arbeitet ohne Unterbrechung, gezahlt wird mit 20 bis 68 mA, je nach Takt. Das taugt für netzversorgte Geräte, die Funkspitzen vermeiden wollen, nicht für Batterien.
Light Sleep hält CPU und Speicher mit Takt-Gating versorgt: Taktsignale stocken, die Spannung bleibt an, der RAM-Inhalt bleibt erhalten. Typisch sind 0,8 mA, und das Aufwachen ist deutlich schneller als aus dem Deep Sleep. Das Programm läuft an derselben Stelle weiter, ideal, wenn ein Interrupt-Pin sofortige Reaktion verlangt.
Deep Sleep schaltet CPU, Hauptspeicher und Funk ab; nur der RTC-Controller (RTC = Real-Time Clock, Echtzeituhr), die RTC-Peripherie, der RTC-Speicher und der ULP-Coprozessor, ein kleiner Zusatzprozessor, der auch im Schlaf Sensoren auslesen kann, bleiben an. Der typische Strom liegt bei 10 µA, mit laufendem ULP-Coprozessor bei 150 µA. Nach dem Aufwachen startet das Programm neu, nur Werte mit RTC_DATA_ATTR überleben im RTC-Slow-Memory. Beispiel: ein Temperatursensor, der stündlich per RTC-Timer aufwacht und per MQTT sendet.
Je länger das Messintervall, desto mehr dominiert der Schlafstrom die Batterielaufzeit.
Faustregel: Netzteil und Dauerbetrieb verlangen Modem Sleep, schnelle Reaktion Light Sleep, langes Intervall und Batteriebetrieb Deep Sleep.
Deep Sleep heißt nicht „aus“, sondern „nur der Echtzeitbereich wacht“.
📌 Schlafmodi · Strombudget · Aufwachquellen
📚 IoT von Grund auf · Tag 5 von 30
#esp32 #iot
Vorstellbar ist ein Bauer, der seinem Nachbarn kilometerweit drüben winkt. Bei Wind und Distanz versteht der Nachbar kein ganzes Wort. Aber ein einziges kurz signalisiertes „Alles gut!“ kommt an. Der Bauer schreit nicht lange durcheinander, sondern sendet ein knappes Zeichen und schweigt dann.
Genauso funktioniert das LoRaWAN-Netz, ein Funkprotokoll für kleine Sensornachrichten über viele Kilometer. Ein Sensor sendet nur wenige Bytes und verstummt dann lange. Die Reichweite entsteht nicht durch lautes Senden, sondern durch langsames, geduldiges Sprechen.
Fachlich entspricht das Schweigen dem Duty Cycle: In den meisten Teilbändern des EU868-Bands um 868 MHz darf ein Gerät im Mittel höchstens 1 % der Zeit senden. Das langsame, geduldige Sprechen ist der Spreading Factor (SF7 bis SF12): Er zieht jedes Datenbit über viele Chips, also kurze Funkimpulse, auseinander. Das kurz gesprochene Zeichen selbst sind die wenigen Bytes Nutzdaten. Höherer SF heißt mehr Reichweite, aber auch längere Airtime, also die Zeit, die eine Nachricht den Kanal belegt. In The Things Network darf ein Gerät daher nur 30 Sekunden Uplink-Airtime pro Tag (Uplink: Richtung vom Gerät zum Netz) nutzen.
Konkret meldet etwa ein Bodenfeuchtesensor auf dem Feld zweimal täglich Temperatur und Luftfeuchte als binär kodierte Werte. Ein Füllstandsmesser im Brunnen passt ebenso; ein Feldbus oder Videostream niemals.
Das Bild hat eine Grenze: Der Bauer muss nicht nach dem Winken lauschen. Ein Klasse-A-Gerät öffnet nur zwei kurze Empfangsfenster nach dem eigenen Uplink, Klasse C hört dauernd und verbraucht mehr Strom.
LoRaWAN erkauft Reichweite also mit schmaler Bandbreite und kurzen Nachrichten, nicht mit schnellem Datentransport.
📌 Airtime · Duty Cycle · Spreading Factor
📚 IoT von Grund auf · Tag 5 von 30
#lorawan #iot #sensorik
Ein Temperatursensor meldet Lücken im Verlauf, etwa wenn die WLAN-Verbindung kurz abbricht. Der Schaltbefehl an die Steckdose kommt dagegen zuverlässig an, manchmal sogar doppelt.
MQTT heißt das Protokoll, über das IoT-Geräte Nachrichten austauschen. Geräte senden und empfangen dabei nicht direkt untereinander, sondern immer über einen zentralen Broker, der alle Nachrichten annimmt und verteilt. Jede Nachricht bekommt eine QoS-Stufe mit: QoS steht für Quality of Service und legt fest, wie stark sich Absender und Broker um die Zustellung bemühen. Der Unterschied zwischen Sensorwert und Befehl entsteht also schon beim Senden, nicht zufällig unterwegs.
Ein Sensor veröffentlicht alle paar Minuten den Wert im Topic wohnzimmer/temperatur, etwa mit QoS 0. QoS 0 sendet die Nachricht und vergisst sie: Ohne Bestätigung bleibt eine verlorene Nachricht verloren. Weil die nächste Messung bald folgt, ist das verschmerzbar. Der Schaltbefehl an die Steckdose geht mit QoS 1: Der Broker bestätigt jede Nachricht, und fehlt die Bestätigung, sendet der Client erneut. So kommt der Befehl mindestens einmal an, Duplikate sind möglich. Damit ein Duplikat nicht doppelt schaltet, setzt der Empfänger einen Zielszustand statt eines Zählschritts. QoS 2 liefert genau einmal, braucht dafür aber einen vierstufigen Handshake mit mehr Zeit und Volumen.
So prüft man es: Im Log des Clients die QoS-Stufe neben jedem Publish und Subscribe nachsehen. Dann gezielt die Verbindung unterbrechen und zählen, welche Nachrichten ankommen.
QoS heißt nicht „besser ist immer höher“, sondern „passend zum Inhalt“. Messwerte dürfen fehlen, Befehle müssen ankommen.
📌 QoS 0/1/2 · Broker · Duplikate
📚 IoT von Grund auf · Tag 5 von 30
#mqtt #iot #esp32
Wer die Laufzeit seines Akkus kennt, plant Wartungsintervalle und Standorte vorher. Ohne diese Rechnung bleibt jedes Batteriebudget ein Rätsel.
🔋 Milliamperestunden geteilt durch Milliampere ergibt die Laufzeit in Stunden. Milliamperestunden (mAh) sind eine Ladungsmenge: Ein Akku mit 2000 mAh versorgt einen Verbraucher mit 1 mA rund 2000 Stunden lang. Die Nennkapazität steht auf jedem Akku oder Datenblatt. Sie ist der Vorrat, aus dem der Knoten schöpft.
📡 Maßgeblich ist der Mittelstrom, nicht der Strom beim Senden. Ein Sensorknoten wechselt zwischen kurzen aktiven Phasen mit hohem Strom und langen Schlafphasen mit sehr kleinem Strom. Gemittelt über den ganzen Zyklus aus Messen, Senden und Schlafen entsteht ein viel kleinerer Wert. Genau dieser gehört in die Rechnung. Beim Abschätzen zählt die Summe aller Mittelströme: Mikrocontroller, Sensor und Funkmodul zusammen, nicht nur der Chip allein.
🔧 Die Faustrechnung liefert eine obere Grenze, keine Garantie. Ein Temperatur-Sensorknoten liest die Temperatur, sendet sie über ein Funkmodul und schläft bis zur nächsten Messung. Dabei gilt: Bluetooth Low Energy (BLE) braucht für kleine Datenmengen wenig Strom, WLAN deutlich mehr. In der Praxis fällt die nutzbare Laufzeit etwas kürzer aus, etwa durch den inneren Widerstand des Akkus und Selbstentladung. Akkus nur mit dem vorgesehenen Laderegler laden und nie kurzschließen. Also großzügig planen.
Akkulaufzeit heißt nicht Stromverbrauch mal aktivem Betrieb, sondern Kapazität geteilt durch den Mittelstrom des gesamten Zyklus. Wer nur den Sendestrom einsetzt, rechnet die Laufzeit viel zu kurz.
📌 Milliamperestunden · Mittelstrom · Faustrechnung
📚 IoT von Grund auf · Tag 5 von 30
#iot #Energieeffizienz #Mikrocontroller
Sobald ein Gerät ohne Kabel Daten senden soll, durchläuft es diesen Ablauf. Wer ihn nicht kennt, sucht bei Verbindungsproblemen an der falschen Stelle und versteht nicht, warum Geräte nach dem Deep Sleep (dem Stromsparmodus mit vollständigem Neustart) träge wirken.
Der WLAN-Verbindungsaufbau ist die Sequenz aus Kanalscan, Authentifizierung, Assoziation und DHCP, mit der der ESP32 ins Netzwerk kommt. Jeder Schritt braucht eine Antwort vom Router, erst dann beginnt der nächste.
Zuerst beim Scan: Der ESP32 hört die WLAN-Kanäle der Reihe nach ab und lauscht auf die Broadcast-Signale (regelmäßige Funkmeldungen) der Router. Dieser Schritt dauert am längsten, weil mehrere Kanäle abgehört werden. Danach authentifiziert sich der ESP32 beim Access Point – dem Funkgerät im Router – mit dem WLAN-Passwort. Im dritten Schritt folgt die Assoziation: Der Router nimmt das Gerät als Teilnehmer auf. Zuletzt vergibt DHCP (Dynamic Host Configuration Protocol), der Austausch, bei dem der Router dem ESP32 eine IP-Adresse zuteilt. Ohne IP-Adresse kann der ESP32 keine Server erreichen.
Verwechselt wird das gern mit der Signalstärke: Volle Balken zeigen nur einen guten Funkkontakt, nicht aber ein abgeschlossenes Assoziationsverfahren. Ebenso häufig: Der ESP32 ist verbunden, aber DHCP schlägt fehl – dann steht die WLAN-Verbindung, der Datenverkehr tut es nicht.
Der Verbindungsaufbau ist nicht ein Schritt, sondern vier. Bei Verbindungsproblemen zuerst prüfen: Findet der Scan das Netzwerk überhaupt?
📌 Kanalscan · Assoziation · DHCP
📚 IoT von Grund auf · Tag 5 von 30
#esp32 #iot #Mikrocontroller
Viele denken, ein Topic sei nur eine Beschriftung und die Auswahl der Nachrichten erledigt man am besten selbst. Das klingt plausibel, weil ein flacher Name wie messwerte einfacher wirkt als eine verschachtelte Adresse.
Tatsächlich ist ein Topic die Adresse einer Nachricht im MQTT-System, dem Nachrichtenprotokoll, mit dem Geräte Daten austauschen; sie ist ähnlich aufgebaut wie ein Ordnerpfad im Dateisystem. Der Schrägstrich trennt Ebenen, und die Reihenfolge geht vom Allgemeinen zum Besonderen: haus/wohnzimmer/temperatur. Beim Abonnieren erlaubt MQTT Wildcards: das Plus steht für genau eine Ebene, die Raute für alle folgenden Ebenen und darf nur am Ende stehen.
Der Irrtum entsteht, weil Einsteiger die Hierarchie nicht gliedern und dann jede Nachricht mitlesen. Die gewünschten Werte per Textfilter selbst herauszusuchen wirkt schnell, liest dann aber jede Nachricht mit und belastet den Mikrocontroller unnötig.
Ein Sensor schreibt in haus/wohnzimmer/temperatur und haus/kueche/temperatur. Ein Display abonniert haus/+/temperatur und erhält beide Werte mit einem Abonnement. Befehle liegen getrennt in haus/wohnzimmer/relay/gesetzt, damit das Display keine Schaltbefehle empfängt.
Woran man es erkennt: Stehen Messgröße und Befehl in verschiedenen Zweigen, ist die Struktur richtig. Läuft alles durch ein flaches Topic, fehlt die Gliederung.
Topic heißt nicht eine Beschriftung für alles, sondern eine Adresse mit Ebenen. Wer gut gliedert, wählt mit Plus und Raute aus, statt selbst zu filtern.
📌 Schrägstrich als Ebene · Plus für eine Ebene · Raute für alles darunter
📚 IoT von Grund auf · Tag 5 von 30
#mqtt #iot #esp32
Dort kennt niemand die Adresse des anderen. Man legt nur den Brief mit einem Verteilernamen ab und verlässt sich auf die Stelle hinter dem Schalter. Wer etwas erfahren will, meldet sich für einen Verteiler an. Die Poststelle behält den Überblick, wer Briefe einwirft und wer sie abholt. Und wer den Status einer Ablage wissen will, schaut ins letzte hinterlegte Blatt.
In MQTT ist diese Poststelle der Broker, ein Server, der alle Nachrichten entgegennimmt und verteilt. Geräte reden nie direkt miteinander, sondern immer über ihn. Ein Client veröffentlicht eine Nachricht per Publish an ein Topic, ein benanntes Adressfeld; Topics sind hierarchisch mit Schrägstrich getrennt, das Wildcard + steht für genau eine Ebene, # für alle folgenden Ebenen und darf nur am Ende stehen. Der Broker verwaltet offene Verbindungen, Topics und hinterlegte Nachrichten und merkt auch, wenn ein Client unvermutet abbricht.
Ein Temperatursensor veröffentlicht alle paar Minuten den Wert im Topic wohnzimmer/temperatur. Eine App abonniert dieses Topic und bekommt jeden Wert sofort. Mit einer Retained Message speichert der Broker den letzten Wert je Topic, sodass ein neu verbundenes Display sofort beim Abonnieren den Stand sieht. Auf dem Standardport 1883 lauscht der Broker unverschlüsselt, über TLS, eine verschlüsselte Verbindung, auf Port 8883.
Das Bild hat eine Grenze: Die Poststelle wartet auf Briefe, der Broker aber hält alle Verbindungen dauerhaft offen und prüft sie. Ein Sensor sendet und eine App liest gleichzeitig, ohne dass beide voneinander wissen.
MQTT heißt nicht Geräte-zu-Gerät, sondern Vermittlung über den Broker: verbinden, verteilen, hinterlegen.
📌 Publish und Subscribe · Topic und Wildcards · Broker statt Direktverbindung
📚 IoT von Grund auf · Tag 5 von 30
#mqtt #iot
Ein Sensor sendet Messwerte, aber das andere Gerät zeigt nichts an. Im Code fehlt jede Spur eines Empfängers, weil man einen gar nicht angeben kann.
MQTT ist ein Publish-Subscribe-System, also ein Verfahren, bei dem niemand direkt miteinander redet. Jedes Gerät sendet seine Nachrichten nur an den Broker, eine zentrale Vermittlungsstelle im Netzwerk. Diese verteilt jede Nachricht an alle Geräte, die das zugehörige Topic abonniert haben. Ein Topic ist ein hierarchischer Name mit Schrägstrichen, etwa wohnzimmer/temperatur, der eine Nachricht wie eine Adresse kennzeichnet. Wer published, veröffentlicht also unter einem Topic, ohne zu wissen, wer die Nachricht liest. Wer subscribed, meldet sich für ein Topic an und erhält künftig alle Nachrichten dazu. Ohne Broker findet in MQTT keine Kommunikation statt – die gesuchte Direktverbindung existiert nicht.
Ein Temperatur-Sensor am ESP32 liest die Temperatur und veröffentlicht sie alle paar Minuten unter wohnzimmer/temperatur. Danach schläft der Mikrocontroller bis zur nächsten Messung, was den Akku schont. Ein Display abonniert genau dieses Topic und zeigt den Wert an. Beide Geräte können unabhängig voneinander neu starten, ohne dass das andere davon abhängt.
So prüft man es: Zuerst nachsehen, ob der Broker läuft und beide Geräte mit ihm verbunden sind. Dann ein Testgerät unter wohnzimmer/temperatur publishen und am Display den eintreffenden Wert beobachten.
MQTT heißt nicht, Nachrichten direkt zu verschicken, sondern unter einem Topic zu veröffentlichen und den Broker verteilen zu lassen. Wer den Broker vergisst, sucht eine Verbindung, die es nie gab.
📌 Publish · Subscribe · Broker
📚 IoT von Grund auf · Tag 4 von 30
#mqtt #iot #esp32 #Mikrocontroller
Wer die Wahl begründen kann, plant Akkulaufzeit und Reichweite von Anfang an richtig. Wer sie errät, baut sich später teure Umbauten in die Firmware.
🔋 Der mittlere Stromverbrauch eines Akku-Geräts wird vom Stromverbrauch im Schlafzustand dominiert. Ein Funkmodul ist nur kurz aktiv; danach schläft der Mikrocontroller. Deshalb verlängert jede Stunde Schlaf die Laufzeit stärker als eine schnellere Übertragung. Ein Temperatur-Sensorknoten liest die Temperatur, sendet sie und schläft bis zur nächsten Messung.
📡 BLE ist für kurze Distanzen und kleine Datenmengen bei niedrigem Stromverbrauch gebaut. WLAN überträgt mehr Daten, braucht aber deutlich mehr Energie und verbindet direkt mit dem heimischen Netz, etwa für eine Kamera oder Web-Oberfläche. LoRaWAN überträgt sehr kleine Datenmengen über mehrere Kilometer; die Nachrichten laufen über Gateways, also Funkempfänger mit Internetanschluss, zu einem Netzwerkserver.
🔧 Die Wahl folgt einer einfachen Regel: große Datenraten und Anschluss ans eigene Netzwerk gehören auf WLAN. Kurze Distanzen mit geringem Energiebedarf passen zu BLE. Kleine Messwerte über große Distanzen ohne Stromanschluss gehören auf LoRaWAN, denn dort sendet der Knoten nur und schläft sofort.
Der Funkweg heißt nicht „so viel wie möglich“, sondern „so viel wie der Anwendungsfall braucht“. Wer Datenmenge, Reichweite und Energiebedarf zuerst festlegt, findet die Antwort fast von selbst.
📌 Datenmenge · Reichweite · Energiebedarf
📚 IoT von Grund auf · Tag 4 von 30
#iot #lorawan #Energieeffizienz #embedded
Kennt ein Sensor nach Wochen plötzlich keine Meldung mehr, zeigt sich erst im Log, ob ein Watchdog den Neustart erzwungen hat. Wer ihn nicht kennt, dreht bei jedem Hänger die Stromversorgung von Hand.
Ein Watchdog ist ein Zähler, den die laufende Firmware (das Programm auf dem Chip) regelmäßig zurücksetzen muss; bleibt das aus, löst der Chip einen Reset aus. Er ist ein eigener, von der Firmware unabhängiger Schaltungsteil und zählt wie ein Timer von einem Startwert gegen null. Nur der regelmäßige Aufruf eines Zurücksetz-Befehls lädt den Zähler wieder auf.
Am Arduino Uno aktiviert die avr/wdt.h-Bibliothek den Watchdog des ATmega328P, mit bis zu 8 Sekunden Timeout. Beim ESP32 konfiguriert man den Task-Watchdog mit esp_task_wdt_init, ein Task (Programmteil) meldet sich mit esp_task_wdt_add an und bedient ihn mit esp_task_wdt_reset. Der Befehl gehört ans Ende der Hauptschleife, denn nur dort ist bewiesen, dass der Durchlauf hängenfrei war. Nach einem Neustart liefert der ESP32 den Grund über esp_reset_reason, etwa Watchdog oder Brownout (Reset bei zu niedriger Versorgungsspannung); dieser Grund gehört ins Log.
Verwechselt wird der Watchdog gern mit einem Einschalten. Tatsächlich ist er eine Rückkehr in einen definierten Startzustand, ohne dass jemand die Stromversorgung unterbrechen muss. Vor dem Aktivieren muss die Initialisierung durchlaufen sein, sonst löst ein langsamer WLAN-Verbindungsaufbau den Timeout schon vor der Hauptschleife aus.
Der Watchdog ist keine Fehlerbehebung, sondern ein Zurückversetzen in einen definierten Zustand. Die eigentliche Fehlersuche beginnt mit dem Reset-Grund im Log.
📌 Zähler gegen null · Zurücksetzen in der Hauptschleife · Reset-Grund im Log
📚 IoT von Grund auf · Tag 4 von 30
#esp32 #Mikrocontroller #firmware
Viele Einsteiger nehmen an, die Unterbrechungsfunktion sei der richtige Ort für alles, was zum Ereignis gehört. Schließlich heißt sie Interrupt-Service-Routine, kurz ISR – dort gehört also der Service hin.
Tatsächlich ist ein Interrupt nur ein Hardware-Signal, das den Mikrocontroller sofort aus dem laufenden Programm herausholt. Er pausiert den Code an der aktuellen Stelle, springt in eine vorher festgelegte Funktion und kehrt danach exakt zurück. In dieser ISR stehen nur kurze Aktionen: ein Flag setzen oder einen Zähler erhöhen.
Der Irrtum entsteht, weil das Ereignis und die Bearbeitung im Alltag zusammengehören. Aber während die ISR läuft, sind oft weitere Interrupts gesperrt; eine lange ISR verzögert deshalb auch andere kurzzeitige Ereignisse.
Ein Taster an einem GPIO, also einem per Software einstellbaren digitalen Pin, löst per attachInterrupt() bei einer Flanke aus, also dem Wechsel von Low nach High. Die ISR erhöht nur einen Zähler. Prellen, das kurzzeitige unkontrollierte Öffnen und Schließen des mechanischen Kontakts, zählt dabei trotzdem mehrere Flanken pro Druck. Eine Sperrzeit in der Auswertung in der Hauptschleife behebt das, nicht in der ISR selbst.
Woran man es erkennt: Die ISR enthält nur volatile deklarierte Variablen, also solche, die der Compiler nicht wegoptimieren darf, weil ISR und loop() sie gemeinsam nutzen, und minimalste Befehle; auf dem ESP32 trägt sie zusätzlich das Attribut IRAM_ATTR. Alles Langsame wie Ausgaben und Netzwerkzugriffe liegt in loop(), gesteuert über Flags.
Interrupt heißt nicht „hier wird alles erledigt“, sondern „hier wird nur vermerkt, dass etwas passiert ist“. Merken: kurz unterbrechen, schnell zurückkehren.
📌 Interrupt · ISR · volatile
📚 IoT von Grund auf · Tag 4 von 30
#Mikrocontroller #esp32 #Arduino
Zwei Busse bestimmen den Alltag am Mikrocontroller: SPI und I2C. Sie verbinden Sensoren, Displays und Speicherkarten mit dem Controller, also dem steuernden Chip.
Zuerst zählt man die Anschlüsse. SPI (Serial Peripheral Interface) nutzt eine Taktleitung, je eine Datenleitung pro Richtung (MOSI, MISO) und eine Chip-Select-Leitung je Gerät. I2C (Inter-Integrated Circuit) kommt für alle Geräte mit zwei Leitungen aus: SDA für Daten, SCL für Takt. Dazu kommt die Masse (GND), der gemeinsame Bezugspunkt aller Spannungen.
Dann geht es um die Auswahl. Bei SPI zieht die Chip-Select-Leitung genau das Gerät auf den Bus, mit dem gerade gesprochen wird. Jedes weitere SPI-Gerät kostet also einen zusätzlichen Anschlusspin am Controller.
Danach betrachtet man das Tempo. SPI ist schneller, weil mehrere Datenleitungen und ein fester Takt ohne Adressoverhead genutzt werden. Typische Einsatzfälle sind Displays und Speicherkarten, wo viele Daten fließen.
Zuletzt wählt man nach Gerätezahl und Datenmenge. I2C eignet sich für viele kleine Sensoren mit wenigen Daten pro Messung; jedes hat eine Adresse, die der Controller gezielt aufruft. Wird die Leitung länger oder die Zahl der Geräte groß, kann der Bus störanfällig werden. Beim Anschluss gilt: 5-V-Teilnehmer dürfen nicht direkt an 3,3-V-Eingängen hängen, wie beim ESP32 mit seiner 3,3-V-Logik.
Viele kleine Sensoren mit wenigen Daten gehören an I2C; viele Daten oder ein Display sprechen für SPI. Nicht besser oder schlechter, sondern mehr Leitungen für mehr Tempo.
📌 Leitungsbedarf · Adressierung · Tempo
📚 IoT von Grund auf · Tag 4 von 30
#I2C #esp32 #embedded
Die Verwechslung ist verständlich, weil beide Zeit in Millisekunden behandeln. Wer „warte eine Sekunde“ denkt, greift schnell zu delay(1000) – und wundert sich später über tote Tasten.
delay() ist ein Befehl, der das Programm an dieser Stelle pausiert. Die gesamte Hauptschleife, also die loop()-Funktion, steht dabei still. Ein delay(1000) bei einer blinkenden LED blockiert eine Taste für eine volle Sekunde; ein kurzer Druck bleibt meist unbemerkt. Auch Sensorwerte und Netzwerkereignisse werden während der Pause nicht bearbeitet.
millis() ist eine Funktion, die beim Aufruf die Millisekunden seit dem Programmstart als Zahl zurückgibt. Sie hält nichts an, sie liest nur die Uhr und kehrt sofort zurück. Ein typisches Beispiel: eine LED im Sekundentakt blinken lassen, die Taste aber in jedem Schleifendurchlauf lesen. Dazu notiert man die Startzeit in einer Variablen, prüft später, ob das Intervall verstrichen ist, und führt die Aktion aus. Die Startzeit speichert man im Typ unsigned long, einem vorzeichenlosen 32-Bit-Wert.
delay() verwaltet die Zeit, indem sie das Programm opfert. millis() verwaltet die Zeit, während das Programm weiterläuft. Bei mehreren Aufgaben mit unterschiedlichen Intervallen bekommt jede ihre eigene Zeitvariable.
Faustregel: Für kurze Pausen ohne Nebenläufigkeit genügt delay(). Sobald während der Wartezeit etwas anderes passieren soll, immer millis() mit Zeitvergleich nehmen.
Ein Zeitvergleich heißt jetzt minus Startzeit größer gleich Intervall, nicht jetzt größer gleich Zielzeit. Die Differenz bleibt auch beim Überlauf korrekt, den der Zähler nach rund 49,7 Tagen macht.
📌 millis() statt delay() · Differenz bilden · unsigned long
📚 IoT von Grund auf · Tag 4 von 30
#Arduino #Mikrocontroller #esp32 #iot
Stehende Autos wollen abbiegen, Fußgänger wollen queren, ein Krankenwagen will durch. Die Ampel interessiert das nicht. Sie zählt rot herunter und lässt nichts vorbei. Erst wenn die Zeit um ist, fließt der Verkehr wieder.
So arbeitet delay() auf einem Arduino oder ESP32: Die Funktion pausiert das Programm für die angegebenen Millisekunden. Die Arduino-Firmware besteht aus der Endlosschleife loop(), in der alle Aufgaben drankommen müssen. Während delay() läuft, zählt der Controller nur Zeit ab. Tasten, Sensorabfragen und Netzwerkereignisse warten, bis die Schleife wieder frei ist.
Eine Taste soll eine LED im Sekundentakt blinken lassen. Mit delay(1000) blockiert die Schleife für eine volle Sekunde, ein kurzer Tastendruck bleibt meist unbemerkt. Stattdessen notiert man die Startzeit mit millis(), dem Millisekundenzähler seit dem Start, und prüft in jedem Durchlauf, ob das Intervall verstrichen ist. Die Taste bleibt dadurch ständig lesbar. Beim Entprellen, dem Unterdrücken des mechanischen Nachschwingens eines Tasters, bremst eine millis()-Sperrzeit nur diese eine Taste aus statt der ganzen Schleife.
Das Bild hat eine Grenze: Die Ampel regelt bewusst, wer fährt und wer wartet. delay() trifft keine solche Entscheidung, es lähmt ausnahmslos alle Aufgaben. Eine kurze Pause am Programmende ist harmlos, solange dort keine Eingaben anfallen.
delay() heißt nicht „Programm pausieren lassen“, sondern „alle Aufgaben gleichzeitig anhalten“. Wer mehrere Aufgaben bedient, vergleicht Zeitdifferenzen mit millis() statt zu warten.
📌 blockierendes Warten · millis()-Vergleich · reaktionsfähige Schleife
📚 IoT von Grund auf · Tag 4 von 30
#Arduino #Mikrocontroller #firmware
Das Symptom kennen viele beim ersten Vergleich. Der DHT22 liefert feine Werte, wirkt aber trotzdem unzuverlässig, und schnell gilt ein Sensor als kaputt. Meist sind beide in Ordnung, und die Differenz hat eine saubere Erklärung.
Dahinter stehen zwei Angaben, die das Datenblatt getrennt nennt. Auflösung ist der kleinste Schritt, den ein Sensor überhaupt ausgeben kann. Genauigkeit ist die maximal zulässige Abweichung vom wahren Wert, die der Hersteller zusichert; sie gilt meist nur in einem begrenzten Messbereich. Ein Wert mit zwei Nachkommastellen kann trotzdem um mehrere Grad danebenliegen.
Der DHT22 ist mit etwa 0,5 °C Temperaturgenauigkeit und 2 bis 5 % relativer Luftfeuchte (rF) spezifiziert, der DHT11 dagegen mit etwa 2 °C und 5 % rF; er misst nur ganze Grad und Prozent. Zwei Geräte dürfen also ruhig auseinanderliegen, ohne defekt zu sein. Dazu misst jeder nur die Luft unmittelbar an seinem Gehäuse; Wärme von Spannungsregler und Funkmodul macht einen Sensor direkt daneben zu warm.
So prüft man es: Erst beide Datenblätter auf Genauigkeit, Messbereich und Wiederholgenauigkeit vergleichen. Dann den Sensor neben ein als genauer bekanntes Referenzgerät legen und beide Werte über einige Stunden vergleichen.
Genauigkeit heißt nicht, wie fein der Sensor zählt, sondern wie nah er am wahren Wert bleibt. Die Nachkommastellen der Anzeige sagen darüber nichts aus.
📌 Auflösung vs. Genauigkeit · Datenblatt lesen · Referenzvergleich
📚 IoT von Grund auf · Tag 4 von 30
#iot #sensorik #Mikrocontroller #embedded
I2C ist ein serieller Bus (eine gemeinsame Datenverbindung mehrerer Bausteine) mit nur zwei Leitungen: SDA trägt die Daten, SCL den Takt, an dem der Empfänger die Bits erkennt. Wer versteht, wie sich viele Geräte diese zwei Adern teilen, spart Pins und erkennt Störungen sofort.
🔋 Eine Baugruppe zieht den Bus nur nach unten, nie nach oben.
SDA und SCL sind Open-Drain-Leitungen: Ein Baustein kann seinen Ausgang nur gegen Masse schalten. Zieht keiner aktiv auf Low, laden die Pull-up-Widerstände beide Leitungen auf High. Deshalb liegt der Bus im Leerlauf ruhig auf High.
📡 Jedes Gerät hört mit, aber nur eines antwortet.
Der Master, also die steuernde Instanz wie ein ESP32, startet jede Übertragung mit der Slave-Adresse des gewünschten Bausteins. Alle am Bus hören mit, doch nur der Angesprochene reagiert. Mit 7-Bit-Adressen stehen 128 Werte bereit; 16 sind reserviert, also bleiben 112 nutzbare Adressen je Bus.
🔧 Fehlen die Pull-ups, bleibt der Bus stumm.
Ein verbreiteter Startwert ist 4,7 kΩ bei 3,3 V und 100 kHz. Achtung: Viele Breakout-Module bringen eigene Widerstände mit. Mehrere parallel senken den Gesamtwiderstand und können für die Treiber zu klein werden. Am ESP32 liegen die Standardpins auf GPIO21 (SDA) und GPIO22 (SCL). Ein Kollisionsfall bleibt: Zwei Bausteine mit gleicher Adresse, etwa zwei BME280 auf 0x76, stören sich. Abhilfe: ein Adresspin am Baustein, ein I2C-Multiplexer (Umschalter auf mehrere Busse) oder ein zweiter I2C-Controller.
I2C heißt nicht ein Drahtpaar je Sensor, sondern ein geteilter Bus mit Adressen und Pull-ups. Wer die Adresse kennt, findet sein Gerät.
📌 SDA und SCL · Pull-ups · 7-Bit-Adresse
📚 IoT von Grund auf · Tag 3 von 30
#I2C #esp32 #Mikrocontroller
Wer ein erstes IoT-Programm auf einen Mikrocontroller lädt, trifft schnell auf Serial.println(). Wer nicht weiß, was dahinterläuft, sieht nur wirre Zeichen im Monitor und hält die Platine für kaputt.
Der serielle Monitor der Arduino-IDE zeigt Textausgaben der Firmware über die USB-Verbindung an, etwa mit Serial.println(). Dahinter steckt dieselbe UART-Verbindung, also die serielle Schnittstelle mit einer TX- und einer RX-Leitung, über die auch die Firmware in den Flash-Speicher geschrieben wird. UART überträgt Daten ohne gemeinsamen Takt, deshalb müssen Firmware und Monitor dieselbe Baudrate verwenden, also dieselbe Übertragungsgeschwindigkeit in Bits pro Sekunde.
In der Praxis sieht das so aus: In setup(), dem Vorbereitungsteil, der genau einmal läuft, startet Serial.begin() die Schnittstelle und legt die Baudrate fest. Danach gibt die Firmware mit Serial.print() Text aus dem laufenden loop(), der Endlosschleife nach dem Start, an den PC. Serial.println() fügt am Ende einen Zeilenumbruch an, sodass jede Ausgabe eine eigene Zeile erhält. Vor dem WLAN-Verbinden etwa eine Zeile „WLAN verbinde…“, danach die Antwort der Firmware.
Verwechselt wird der Monitor gern mit einem Messgerät. Er ist keins: Er zeigt nur, was die Firmware selbst ausgibt, etwa den gelesenen Pin-Zustand, nicht was ein Multimeter messen würde. Auch Serial.begin() gehört in setup(), nicht in loop(), sonst wiederholt die Firmware die Startarbeit bei jedem Durchlauf und kann Abläufe stören, die nur beim Start gehören.
Der serielle Monitor ist kein separates Werkzeug, sondern dasselbe UART-Kabel, nur in Gegenrichtung. Er ersetzt kein Messgerät – aber er ersetzt das Raten.
📌 Serieller Monitor · Serial.println() · Baudrate
📚 IoT von Grund auf · Tag 3 von 30
#Arduino #esp32 #Mikrocontroller
Viele Einsteiger denken, eine Datenleitung reiche: Ein Gerät sendet, das andere hört zu, wie bei einem Lautsprecher. Plausibel klingt das, weil USB und viele Kabel im Alltag ja auch nur „ein Kabel“ sind. Man verbindet TX mit TX und wundert sich, dass nichts ankommt.
Tatsächlich arbeitet UART, kurz für Universal Asynchronous Receiver Transmitter, mit zwei Leitungen: TX (Sende-Pin) und RX (Empfangs-Pin). Die werden über Kreuz verbunden, also TX des einen Geräts an RX des anderen. Dazu gehört GND, die gemeinsame Masse als Bezugspunkt aller Spannungen. Der UART-Baustein zerlegt Bytes in eine Kette von High- und Low-Pegeln und setzt sie auf der anderen Seite wieder zusammen.
Der Irrtum entsteht, weil I2C wirklich mit zwei Leitungen für alle Geräte auskommt und SPI sogar eine Taktleitung nutzt. UART hat keinen gemeinsamen Takt, dafür aber zwei Richtungen.
Wichtigste Regel: beide Seiten müssen dieselbe Baudrate, also Bits pro Sekunde, verwenden – etwa 115200. Der Empfänger erkennt den Anfang eines Zeichens am Startbit und tastet die Pegel dann im Takt dieser Rate ab. Bei Serial.println() in der Arduino-Firmware muss der serielle Monitor auf denselben Wert eingestellt sein.
Woran man es erkennt: Im seriellen Monitor erscheint statt lesbarem Text wirrer Datenschrott mit seltsamen Zeichen. Dann Baudrate in der Firmware und im Monitor abgleichen.
UART heißt nicht „ein Draht für alles“, sondern zwei gekreuzte Leitungen plus Masse bei gleicher Baudrate.
📌 TX an RX · Baudrate 115200 · gemeinsame Masse
📚 IoT von Grund auf · Tag 3 von 30
#embedded #Mikrocontroller #iot
Schuld ist nicht das Programm, sondern der Taster selbst. Der Vorgang heißt Prellen (englisch bouncing): Der mechanische Kontakt öffnet und schließt kurzzeitig mehrfach, bevor er endgültig anliegt.
Zuerst trifft beim Drücken eine federnde Kontaktfeder mit Schwung auf die Gegenfläche. Die Kontaktfedern im Taster sind federnd, dadurch schließt der Kontakt sicher. Der Schwung lässt die Flächen aber nicht sofort ruhig liegenbleiben.
Dann schwingen die Kontaktflächen für einige Millisekunden. In dieser Phase berühren sie sich, trennen sich kurz und berühren sich wieder. Elektrisch sieht das wie ein schneller Wechsel zwischen gedrückt und losgelassen aus.
Danach liest der Mikrocontroller seinen Eingang und sieht jedes dieser kurzen Kontakte. Er prüft den Pin so schnell, dass er jedes der kurzen Kontakte als eigenen Tastendruck erkennt. Ein Interrupt-gesteuerter Zähler ohne Entprellung zählt deshalb pro Druck mehrere Flanken.
Zuletzt fängt das Programm das Prellen ab. Die Sperrzeit ignoriert den Eingang nach einer erkannten Flanke, also einem Pegelwechsel, für wenige Millisekunden. Für die Zeitmessung eignet sich millis() (liefert die Millisekunden seit dem Start) besser als delay(), weil delay() die gesamte Hauptschleife anhält. Beim Nachfrage-Verfahren wird der Pegel erst gewertet, wenn er über mehrere Abtastungen stabil bleibt. In einer Interrupt-Service-Routine gehört nur eine kurze Aktion hinein, etwa ein Flag setzen.
Ein Tastendruck ist elektrisch erst fertig, wenn er still ist. Entprellen heißt nicht warten um jeden Preis, sondern gezielt die ersten Millisekunden ignorieren.
📌 Prellen · Sperrzeit · millis()
📚 IoT von Grund auf · Tag 3 von 30
#embedded #Mikrocontroller #Arduino
Beide heißen umgangssprachlich „Klimasensor“, weil sie Temperatur und relative Luftfeuchte liefern. Relative Luftfeuchte (rF) vergleicht den Wasserdampf in der Luft mit der maximal möglichen Menge bei derselben Temperatur; warme Luft nimmt mehr auf als kalte.
Der DHT22 (auch AM2302 genannt) ist ein günstiges Kombibauteil für Temperatur und Feuchte. Er schickt seine Werte über eine einzige Datenleitung an den Mikrocontroller und darf höchstens alle 2 Sekunden einen Wert liefern. Laut Spezifikation erreicht er etwa 0,5 °C und 2 bis 5 % rF; ein ESP32 liest ihn per Bibliothek aus und erhält zwei Werte pro Messung.
Der BME280 von Bosch misst zusätzlich den Luftdruck, also das Gewicht der Luftsäule über dem Sensor. Er hängt an einem Bus wie I2C, bei dem mehrere Geräte zwei gemeinsame Leitungen teilen und über Adressen (0x76 oder 0x77) unterschieden werden. Seine Genauigkeit liegt bei etwa 1 °C, 3 % rF und 1 hPa.
Der BME280 liefert drei physikalische Größen und spricht flexible Busse. Der DHT22 liefert zwei Größen über seine eine Datenleitung und ist träger, dafür einfacher anzubinden.
Zwei Sensoren im selben Raum zeigen oft verschiedene Werte, weil jeder nur die Luft an seinem Gehäuse misst; Zugluft, Heizung oder Außenwand verfälschen zusätzlich. Spannungsregler, Funkmodul und Prozessor erwärmen die Platine; ein Temperatursensor gehört deshalb mit Abstand an einen kühleren Ort oder auf ein eigenes Modul.
Faustregel: Für Feuchte und Druck ist der BME280 erste Wahl; wer nur Temperatur und Feuchte nebenbei braucht, nimmt den DHT22.
Die Nachkommastellen der Anzeige sind keine Genauigkeit, sondern Auflösung – wie fein der Sensor zählt, nicht wie exakt er misst.
📌 DHT22 · BME280 · Luftfeuchte
📚 IoT von Grund auf · Tag 3 von 30
#iot #sensorik #embedded
Stellen Sie sich vor, Sie decken ein Fenster mit der Hand ab. Mal halten Sie die Hand davor, mal frei. Die Hand bewegt sich blitzschnell im Wechsel. Sieben Zehntel der Zeit verdeckt, wirkt das Fenster gedämpft hell. Halten Sie die Hand fast immer davor, wirkt das Zimmer dunkel. Die Sonne selbst wird dabei nie schwächer.
So arbeitet ein digitaler Ausgang: Er kennt nur zwei Zustände, High (etwa 3,3 V beim ESP32) und Low (0 V gegen Masse). digitalWrite(PIN, HIGH) legt die Versorgungsspannung an, digitalWrite(PIN, LOW) zieht den Pin auf Masse. Das schnelle Umschalten ist die Pulsweitenmodulation, kurz PWM.
Der Anteil der Ein-Zeit ist das Tastverhältnis, auch Duty Cycle genannt. Die Zahl der Umschaltungen pro Sekunde ist die PWM-Frequenz. Beide zusammen bestimmen die mittlere Leistung.
Eine LED mit Vorwiderstand am ESP32 dimmt mit 50 Prozent Tastverhältnis: In jedem Moment fließt entweder der volle Strom oder keiner. Das träge Auge mittelt die Impulse und sieht halbe Helligkeit. Ein Gleichstrommotor läuft langsamer, weil seine Schwungmasse die Impulse mittelt; wirksam ist näherungsweise 3,3 V mal Tastverhältnis.
Das Bild hat eine Grenze: Das Fenster wird wirklich dunkler, die LED aber nie halb so hell. PWM erzeugt keine echte Zwischenspannung, nur eine scheinbar analoge Wirkung über Mittelung. Wer eine tatsächliche einstellbare Spannung braucht, nimmt einen Digital-Analog-Wandler.
PWM heißt nicht Spannung regeln, sondern Zeitanteile schalten. Die Wirkung entsteht erst im träge mittelnden Auge, Motor oder Heizung.
📌 Tastverhältnis · PWM-Frequenz · Mittelung
📚 IoT von Grund auf · Tag 3 von 30
#Mikrocontroller #esp32 #embedded
Der Rohwert des Analogeingangs erreicht nie 4096, sondern endet bei 4095. Ein Zahlenvergleich auf 4096 löst deshalb nie aus, weil er auf Off-by-one (einen um eins verschobenen Zahlenvergleich) beruht. Umgekehrt entspricht ein Wert wie 2048 fast, aber nicht ganz der halben Referenzspannung.
Der Analog-Digital-Wandler (ADC), also die Schaltung, die eine Spannung in eine Zahl umsetzt, liefert beim ESP32 12 Bit Auflösung. 12 Bit bedeuten 2 hoch 12, also 4096 mögliche Stufen. Da die Zählung bei 0 beginnt, ist der größte Rohwert 4095, nicht 4096. Die Auflösung teilt den Messbereich in diese Stufen, sagt aber nichts über die Genauigkeit: 4096 Stufen garantieren nicht, dass der Wert der wahren Spannung entspricht.
Bei einer Referenzspannung, also der Vergleichsspannung für die Messung, von 3,3 V ergibt sich der kleinste Schritt aus 3,3 V geteilt durch 4095, etwa 0,8 mV je Stufe. Zurückrechnen ist ein Dreisatz: Spannung gleich Rohwert geteilt durch 4095, multipliziert mit der Referenzspannung. Wichtig: Die Referenzspannung des ESP32 streut von Chip zu Chip; Espressif speichert deshalb einen Kalibrierwert im eFuse, den die Kalibrierfunktionen von ESP-IDF nutzen.
„So prüft man es:“ Einen Spannungsteiler (zwei Widerstände, die eine Spannung herabsetzen) oder ein als Referenz geeignetes Multimeter an den Pin legen und Rohwert sowie gerechnete Spannung vergleichen. Weicht der Wert stark ab, die Kalibrierfunktionen nutzen und mehrere Messungen mitteln.
12 Bit heißt nicht 4095 Stufen, sondern 4096 Stufen mit letztem Wert 4095. Auflösung ist nicht Genauigkeit: Sie zählt Stufen, nicht Messfehler.
📌 ADC-Auflösung · Dreisatz · Referenzspannung
📚 IoT von Grund auf · Tag 3 von 30
#esp32 #Arduino #sensorik
Ein ADC (Analog-Digital-Wandler) macht diese stetigen Signale für die Firmware, das Programm auf dem Mikrocontroller, lesbar. Ohne ihn könnte kein Mikrocontroller eine Spannung messen oder einen Sensor sinnvoll auswerten.
🔋 Ein ADC übersetzt eine Spannung am Pin in eine Zahl. Dabei wird die Spannung gegen die Masse (GND) gemessen, den gemeinsamen Bezugspunkt aller Spannungen in der Schaltung. Die Firmware kann diesen Zahlenwert auslesen und weiterverrechnen.
📡 Der Messbereich begrenzt, was der ADC erfassen kann. Spannungen außerhalb des Bereichs liefern nur den größten oder kleinsten möglichen Rohwert und keine sinnvolle Information. Beim ESP32 mit 3,3-V-Logik reicht der Messbereich typisch bis 3,3 V, passend zur Versorgungsspannung.
🔧 Die Auflösung in Bit bestimmt die Zahl der Stufen. Ein 12-Bit-Wandler wie im ESP32 teilt den Messbereich in 4096 Stufen; die Rohwerte laufen von 0 bis 4095. Bei 10 Bit wären es 1024 Stufen.
Ein Spannungsteiler, also zwei Widerstände, die eine Spannung teilen, liefert an den ADC-Pin die Hälfte der Versorgungsspannung. Bei einem Messbereich bis 3,3 V und 12 Bit liegt der Rohwert nahe der Mitte, also um 2048, weil eine Stufe nur etwa 0,8 Millivolt breit ist.
Ein Rohwert heißt nicht Spannung, sondern ist nur ein Zwischenschritt. Die Firmware muss den Rohwert erst über die Rechnung in eine Spannung umrechnen und dann über die Kennlinie des Sensors in die eigentliche Einheit wie Grad Celsius. Wer den Rohwert direkt als Messwert nimmt, misst falsch.
📌 Messbereich · Stufen · Rohwert umrechnen
📚 IoT von Grund auf · Tag 3 von 30
#esp32 #Mikrocontroller #sensorik
Wer die zwei Rollen kennt, zerlegt jedes Gerät sauber in Sensor- und Aktorteile. Wer sie nicht kennt, verwechselt Messwert und Befehl und wundert sich, warum die Schaltung nichts tut.
Ein Sensor übersetzt eine physikalische Größe wie Temperatur oder Helligkeit in ein elektrisches Signal. Ein Aktor dreht diesen Weg um: Er setzt ein elektrisches Signal in eine Wirkung, etwa das Schließen eines Relais, einen Motorlauf oder das Aufleuchten einer LED. Beim Sensor fließt die Information von der Außenwelt zum Gerät, beim Aktor zurück in die Außenwelt.
Ein Mikrocontroller-Pin ist nur eine Metallfläche mit Anschluss innen; ob sie Spannung ausgibt oder einen Pegel einliest, entscheidet erst die Software. GPIO-Pins (General Purpose Input/Output) lassen sich per Software als Eingang oder Ausgang einstellen.
Ein Thermostat-Knoten vereint beide Rollen. Ein Temperatursensor misst etwa 22 °C, ein Analog-Digital-Wandler (ADC) macht aus der Spannung des Sensors eine Zahl. Die Firmware läuft nach dem Start in einer Endlosschleife, vergleicht den Wert mit dem Sollwert. Ist es zu kalt, schaltet ein Relais die Heizung – der Aktor übersetzt den elektrischen Befehl in den geschlossenen Kontakt. Schaltet das Relais Netzspannung, gehören Arbeiten daran an eine Fachkraft, und zwar nur spannungsfrei.
Verwechselt wird Sensor oft mit Sensorik-Modulen oder mit dem Mikrocontroller selbst. Der Sensor ist nur der Übersetzer am Rand des Systems; gerechnet wird im Mikrocontroller, gewirkt im Aktor.
Sensor heißt nicht „kleines Bauteil“, sondern eine Richtung: Information hinein. Aktor ist die Gegenrichtung: Wirkung hinaus. Beides sind Rollen, keine Bauteilklassen.
📌 Sensor · Aktor · Informationsrichtung
📚 IoT von Grund auf · Tag 2 von 30
#iot #Mikrocontroller #sensorik #embedded
Viele Einsteiger denken, ein 3,3-V-Chip und ein 5-V-Chip passen nie zusammen. Sie suchen dann vorsorglich für jede Verbindung einen Pegelwandler. Das klingt plausibel, weil die Spannungen tatsächlich unterschiedlich sind.
Tatsächlich gibt es zwei Richtungen mit zwei verschiedenen Antworten. Ein Logikpegel ist die Spannung, mit der ein Pin High (logisch eins) oder Low (logisch null) anzeigt. Umgekehrt ist es gefährlich: Ein 5-V-Ausgang auf einen 3,3-V-Eingang übersteigt dessen Grenze.
Der Irrtum entsteht, weil Chips nach Spannung kategorisiert werden, Signale aber nach Richtung. Genaues Hinsehen ins Datenblatt ersetzt jede Faustregel.
Ein Beispiel: Der ESP32 arbeitet mit 3,3 V, seine Eingänge vertragen laut Datenblatt maximal 3,6 V – er ist nicht 5-V-tolerant. Der ATmega328P im Arduino Uno arbeitet mit 5 V und erkennt ein High ab etwa 3 V. Ein ESP32-Pin darf also einen Uno-Eingang treiben. Vom Uno-Ausgang zum ESP32 gehört ein Spannungsteiler (zwei Widerstände, nur für langsame Signale) oder ein aktiver Pegelwandler dazwischen. Für schnelle und bidirektionale Leitungen wie I2C gehört ein aktiver Pegelwandler dazwischen, klassisch je Leitung ein BSS138 mit Pull-ups auf beiden Seiten.
Woran man es erkennt: Im Datenblatt des Empfängers stehen die Grenzen für High und für die maximale Eingangsspannung. Übersteigt die Ausgangsspannung des Senders die Eingangsgrenze, gehört ein Wandler dazwischen.
Pegelwandlung heißt nicht, Chips mit gleicher Spannung zu verbinden, sondern die Signalgrenzen beider Datenblätter in der richtigen Richtung zu prüfen. Und vorher immer die gemeinsame Masse verbinden.
📌 Logikpegel · Signalrichtung · Datenblatt-Grenzen
📚 IoT von Grund auf · Tag 2 von 30
#esp32 #Arduino #Mikrocontroller
GPIO ist die allgemeine Bezeichnung für einen anpassbaren Pin am Mikrocontroller, also dem kleinen Computer-Chip auf dem Board. GPIO-Pins können als Ausgang eine LED schalten oder als Eingang einen Taster abfragen. GPIO-Eingänge sind hochohmig: Sie lesen den Pegel nur ab, steuern ihn aber nicht selbst. Ohne feste Verbindung bleibt die Spannung am Pin zufällig, etwa durch Störungen aus der Umgebung.
Zuerst fehlt dem offenen Pin jede Referenz. High und Low sind keine festen Spannungspunkte, sondern Bereiche: Der Eingang wertet alles oberhalb einer Schwelle als High, alles darunter als Low. Ein unbeschalteter, sogenannter floating Eingang pendelt willkürlich dazwischen.
Dann entscheidet der gemeinsame Bezugspunkt. Die Masse (GND) ist der Punkt, gegen den alle Spannungen gemessen werden. Erst über die gemeinsame Masse weiß der Eingang, was High und Low überhaupt bedeuten.
Danach zieht ein Widerstand den Eingang auf den Ruhepegel. Ein Pull-up liegt zwischen Versorgungsspannung und Eingang und hält ihn auf High; ein Pull-down liegt zwischen Eingang und Masse und hält ihn auf Low. Spannungen nahe der Schwelle wären unsauber, weil sie mal so, mal so gelesen werden.
Zuletzt kommt der Taster ins Spiel: pinMode(4, INPUT_PULLUP) aktiviert den internen Pull-up, digitalRead(4) liest den Pin. Der Taster drückt den Eingang gegen Masse; gedrückt bedeutet also LOW, ungedrückt HIGH – invertiert zur Intuition. Der Widerstandswert ist ein Kompromiss: Kleinere Widerstände geben steife Pegel, größere sparen Strom.
Ein offener Eingang lügt nicht böswillig, er weiß es einfach nicht besser. Wer den Ruhepegel definiert, bekommt eine eindeutige Antwort.
📌 Floating-Eingang · Pull-up · Ruhepegel
📚 IoT von Grund auf · Tag 2 von 30
#Mikrocontroller #Arduino #iot #embedded
Die Verwechslung ist verständlich: Signalleitungen sind sichtbar und auffällig, die Masse wirkt wie selbstverständlich. Einsteiger nehmen an, GND sei bei allen Geräten von selbst derselbe Punkt, weil alles an Strom hängt.
Ein Signal ist die Information selbst. Es kennt digital nur zwei Zustände: Low und High. Welche Spannung als High gilt, hängt von der Logikfamilie ab, also der Chip-Gattung mit ihren Pegelvorgaben. Der ESP32 arbeitet mit 3,3 V, sein Eingang verträgt laut Datenblatt höchstens 3,6 V. Ein Arduino Uno mit ATmega328P arbeitet mit 5 V und erkennt High ab etwa 3 V.
Die Masse (GND) ist der Bezugspunkt aller Spannungen. Eine Spannung ist nie eine Eigenschaft eines einzelnen Punktes, sondern immer eine Differenz zwischen zwei Punkten. Gemessen wird sie gegen GND. Fehlt eine gemeinsame Masse, bezieht jedes Gerät High und Low auf seinen eigenen Bezugspunkt.
Das Signal ist die Botschaft, die Masse ist die gemeinsame Sprache, in der sie gelesen wird. Ohne gemeinsamen Bezugspunkt ist selbst eine korrekte Signalleitung bedeutungslos – zufällige Messwerte oder gar keine Kommunikation folgen.
Faustregel: Beim Aufbau einer Schaltung zuerst die Masse aller Beteiligten verbinden, erst danach die Signalleitungen anschließen. Bei getrennten Netzteilen verbindet man ebenfalls deren Massepunkte.
Eine Spannung ist keine Zahl auf einem Pin, sondern immer eine Differenz. GND heißt nicht „irgendwo Masse“, sondern „elektrisch verbunden“.
📌 GND · Bezugspunkt · Spannungsdifferenz
📚 IoT von Grund auf · Tag 2 von 30
#esp32 #Mikrocontroller #embedded