Technische Dokumentation

Erweiterungssteckplatz

Fast alle verfügbaren ESP32 IO-Pins befinden auf dem Erweiterungssteckplatz. Der Erweiterungssteckplatz enthält 13 Pins oben, 13 Pins unten, sowie 5 Pins quer dazwischen. Zusätzlich sind zwei Erweiterungspins am Programmieradapter (RX/TX) vorhanden. Alle Pins sind auf der Platine beschriftet, vorne aus Platzgründen in kleiner, auf der Rückseite in gut lesbarer Schriftgröße:

Wir haben Wert darauf gelegt, verwendete Pins, die sich zusätzlich für eigene Anwendungen nutzen lassen (z.⁥ B. Taster, LED1, LED2, IO35 für die Batteriespannungsmessung), auch auf dem Erweiterungssteckplatz verfügbar zu machen. Somit stehen viele Erweiterungsmöglichkeiten zur Verfügung.

Je nach Anforderungen können Erweiterungsplatinen oben aufgesteckt werden, alternativ lassen sich diese auch von unten aufstecken. Um ein Höchstmaß an Flexibilität zu bieten, sind die Buchsenleisten (2 x 13 Pins) nicht eingelötet, aber im Lieferumfang enthalten.

Standard Arduino SPI- und I2C-Schnittstelle

Die SPI- und I2C-Schnittstellen sind auf dem Erweiterungssteckplatz verfügbar. Die SPI-Schnittstelle wird auch für LoRa verwendet, die I2C Schnittstelle wird bereits für die Uhr (RTC) sowie für den externen Temperatur-/Feuchtigkeitssensor verwendet. Es ist zu beachten, dass die SPI- oder I2C-Schnittstellen weder von der RadioShuttle-Software noch von eigenen Anwendungen gleichzeitig genutzt werden.

Bei I2C bietet sich die Nutzung innerhalb der „loop“-Schleife an, da RadioShuttle hier nicht gleichzeitig darauf zugreift.

Bei SPI bietet es sich an, SPI nur zu verwenden, wenn LoRa nicht aktiv ist. Per Funktion UpdateNodeStartup(RS_Node_Offline) kann LoRa auch vorübergehend deaktivert werden. Alternativ lassen sich die Interrupts während des eigenen SPI-Zugriffs deaktivieren.

Drahtantenne installieren

Der mitgelieferte Antennendraht muss unten rechts auf der Platine in das vorgesehene Lötloch (Bezeichung „ANT“) gelötet und danach auf 8,2 cm gekürzt werden. Damit ist die Antenne λ/4 für 868,1 MHz angepasst.

Die genaue Formel zur Berechnung der Antennenlänge ist:
Wellenlänge = Lichtgeschwindigkeit / Frequenz

Für λ/4 muss dieser Wert noch einmal durch 4 geteilt werden.

Da das Lötloch auch schon als Antenne fungiert und ein Verkürzungsfaktor berücksichtigt werden muss, sind 8,2 cm ausreichend.

„ECO Power“-Board: Pin- und Interrupt-Belegung

SMA- oder U.FL-Antennenanschluss

Die SMA-Buchse kann einfach aufgelötet werden. Danach ist die Antennen-Lötbrücke rechts zur Drahtantenne zu trennen und eine Lötbrücke nach oben zur SMA-Leitung zu löten.

Eine U.FL-Buchse ist bereits aufgelötet. Für die Funktion ist die Antennen-Lötbrücke rechts zur Drahtantenne zu trennen und eine Lötbrücke nach unten zur SMA-Leitung zu löten. Bitte beachten Sie, dass die U.FL-Buchse nur für wenige Steckvorgänge ausgelegt ist, daher empfehlen wir einen SMA-Anschluss, welcher beliebig oft verschraubt werden kann.

Die Lötbrücken der Antenne müssen dünn und schlank gelötet sein, um die Funktionalität nicht zu beeinflussen. Es darf jeweils nur eine Lötbrücke gesetzt sein, entweder Drahtantenne, oder SMA oder U.FL.

Spannung „VDD-SW“ für externe Verbraucher einschalten/ausschalten

Ein interner Spannungsschalter erlaubt es, externe Stromverbraucher ein- bzw. auszuschalten, damit diese nicht permanent Strom verbrauchen. Der IO-Pin „EXT_POWER_SW“ ist in der Datei „xPinMap.h“ der RadioShuttle-Software zum Schalten definiert. Er kann entweder auf „EXT_POWER_ON“oder „EXT_POWER_OFF“ geschaltet werden. An der „VDD-SW“-Leitung hängt die Messung der Batteriespannung, welche über den „BAT_POWER_ADC“ ADC-Pins gemessen wird. Auch erweiterte Funktionen der RTC-Uhr werden bereits an der „VDD-SW“-Leitung genutzt. Damit das Board möglichst wenig Strom benötigt, ist die „VDD-SW“ im Regelfall abgeschaltet.

„ECO Power“-Board: Reset ausführen

Das „ECO Power“-Board besitzt keine Möglichkeit, um per USB einen Reset zum Programmieren durchzuführen. Die bei anderen Modulen genutzte serielle Steuerleitung ist im Programmieradapter nicht vorhanden. Daher ist zum Programmieren eine spezielle Tastenkombination erforderlich, alle Details sind im Kapitel Inbetriebnahme beschrieben.

5-V-Pin am Erweiterungssteckplatz

Der USB 5-V-Pin am Erweiterungssteckplatz ist direkt mit dem 5-V-Pin vom Programmieradapter bzw. mit der externen Micro-USB-Stromversorgung verbunden. Zur externen Micro-USB-Stromversorgung gibt es eine selbsrückstellende Sicherung (500 mA). Bei der Stromversorgung über den USB-Programmieradapter gibt es hingegen keine Sicherung. Bei Batteriebetrieb ohne USB-Stromversorgung liegt am 5-V-Pin keine Spannung an.

Wenn über den Programmieradapter eine externe Stromversorgung anliegt, dann kann diese auch mehr als 5 V betragen (max. 9 Volt). Daher ist die Verwendung der direkten USB 5-V-Leitung mit Vorsicht zu handhaben; ein Kurzschluss kann, wie bei anderen USB-Verbrauchern auch, den USB-Port des Rechners zerstören.

Temperatur- und Feuchtigkeitssensor

Der Sensor bietet die Möglichkeit, die genaue Temperatur sowie die Luftfeuchtigkeit sehr stromsparend zu messen. Der weiße Filz auf dem Sensor darf nicht entfernt werden, da dieser eine Schutzfunktion hat, damit der Sensor einwandfrei funktioniert. Genutzt wird der „Si7021-A20-GM1“ der Firma Silicon Labs, der Treiber ist in der RadioShuttle-Software enthalten.

Anschließen des Sensors

Der Sensor wird per I2C-Bus angeschlossen und benötigt vier Leitungen (GND, VDD, SCL, SDA). Folgende einfache Möglichkeiten der Installation gibt es:

  • Sensor oben links mit der Platine verbinden
  • Sensor oben links von der Unterseite mit der Platine verbinden
  • Sensor kann per Verlängerungskabel (nicht enthalten) extern installiert werden, z.⁥ B. außerhalb des Gehäuses oder direkt an einer Heizung usw.

Hierbei muss auf die Reihenfolge der Pins geachtet werden („GND“ ist außen), da der Sensor zwei Anschlussseiten besitzt und je nach Installation (oben oder unten) gedreht werden kann.

Hinweis:
Auf dem Sensor sind zwei Bauteile (optionale Widerstände) mit Absicht nicht bestückt, es handelt sich um I2C Pull-up-Widerstände, welche als 10-kΩ-Widerstände bereits auf der Hauptplatine enthalten sind. Bei einem externen Sensor mit langen Leitungen kann es sinnvoll sein, zwei 1-kΩ-Widerstände aufzulöten (sind im Lieferumfang enthalten), um stabile Signale zu erhalten. Eine zusätzliche Option ist es, die I2C-Geschwindigkeit zu reduzieren. Wir werden unsere Erfahrungswerte später hier teilen.

Softwareverwendung des Sensors

Wenn angeschlossen, ist der Sensor permanent aktiv, benötigt aber nur ca. 1 μA Strom solange keine Sensorwerte gelesen werden. Beim Einschalten des „ECO Power“-Boards (Stromversorgung an, bzw. Reset durchgeführt) wird der Sensor nur einmalig initialisiert und die Temperatur mit den Startmeldungen ausgegeben. Wenn sich das Board im „deepsleep“ befindet („RadioShuttle RS_Node_Offline“) werden beim periodischen Aufwachen (ca. alle 10 Sekunden) die Sensorwerte automatisch erneut gemessen und angezeigt. Der Code hierzu ist in der Datei „RTCUtil.cpp“ vom Beispiel „RadioTest“ zu finden.

  if (sensorSI7021->begin()) {
      hasSensor = true;
      dprintf("%s: Rev(%d)  %.2f°C  Humidity: %.2f%%", sensorSI7021->model, sensorSI7021->revision, sensorSI7021->readTemperature(), sensorSI7021->readHumidity());
  } else {
    delete sensorSI7021;
    sensorSI7021 = NULL;
  }

Hinweis:
Hierfür muss „FEATURE_SI7021“ in der Datei „xPinMap.h“ aktiviert sein.

Es empfiehlt sich, den Sensor nicht unnötigerweise permanent auszulesen, da jedes Auslesen der Werte Zeit in Anspruch nimmt und während dieser Zeit Strom verbraucht. Das Auslesen der Temperatur benötigt ca. 13 ms, das der Luftfeuchtigkeit ca. 20 ms. Während dieser Zeit ist die ESP32 MCU aktiv.

Messen der Batteriespannung

Zum Messen der VDD-Versorgungspannung  (ca. 3,3 Volt bei Stromversorgung über USB, ca. 3,0 Volt bei Batteriebetrieb) ist eine Messeinrichtung auf der Platine vorgesehen. Die Batteriespannung wird auf etwa 100 mV genau angezeigt. Beim Booten bzw. Resetten wird die Spannung gemessen und angezeigt. Über die Funktion GetBatteryVoltage() in der Datei „RTCUtil.cpp“ wird die Spannung gemessen und zurückgeliefert.

Genauigkeit des ESP32 Analog-Digital-Wandlers (ADC)

Um die Genauigkeit der ADC-Messungen beim „ECO Power“-Board wesentlich zu erhöhen, wird in der Produktion der „ECO Power“-Boards die interne Spannungsreferenz des ESP32-Prozessors gemessen und intern im eFuse-Memory gespeichert. Über die Funktion prop.GetProperty(prop.ADC_VREF, 1100); kann der Wert in Millivolt abgerufen werden um eine genaue Berechnung der ADC-Messungen durchzuführen. Da fast jedes ESP32-Modul eine Abweichung der internen Referenzspannung (1,100 Volt) hat, ist die Kalibrierung der „ECO Power“-Boards für genauere ADC-Messungen von großem Vorteil.

Die ESP-interne Analog-Referenzspannung beträgt ca. 1,100 Volt (Einstellung „Attenuation ADC_0db“), andere Referenzspannungen (Beispiel 6 dB = ca. 2,2 V) sind lediglich von der internen Referenz 1,100 Volt (0 dB) abgeleitet. Daher empfiehlt es sich, bei ADC-Messungen gleich mit der 1,100-V-Referenzspannung („ADC_0db“) zu arbeiten, die beim „ECO Power“-Board vermessen wird und somit kalibriert ist.

Der ADC-Wandler bietet bis zu 12-bit Genauigkeit (12 bit = 4.096 Abstufungen) in einem Spannungsbereich von 0-1,100 V (Referenzspannung ca. 1,100 V). Leider sind diese 4.096 Abstufungen des ESP32-internen ADC-Wandlers nicht linear, wodurch die Genauigkeit der ADC-Messungen leidet. Für genauere ADC-Messungen ist es notwendig,  für beide internen Wandler, ADC0 und ADC1, eigene Lookup-Tabellen für die Linearisierung zu erstellen und zu verwenden.

Wie schon erwähnt, sind genaue ADC-Messungen mit dem ESP32 nur eingeschränkt bzw. mit erhöhtem Kalibrierungsaufwand möglich. Ein Thema, woran der Hersteller Espressif Systems weiter arbeiten muss.

ESP32 „deepsleep“ und Wakeup

Während des „deepsleeps“ (z.⁥ B. im „Node Offline“-Betrieb) wird die MCU abgestellt, um Strom zu sparen. Als einzige Einheit während des „deepsleeps“ läuft eine ESP32-interne Uhr (RTC, nicht zu verwechseln mit der externen RTC!), welche die MCU bei externen Ereignissen aufweckt. Diese externen Ereignisse können GPIO Pin-Änderungen sein oder eine regelmäßige Weckfunktion.

Folgende Pins werden im „deepsleep“ als Wakeup-Pins unterstützt:

IO 0
IO 2
IO 4
IO 12-15
IO 25-27
IO 32-39

Zusätzlich wird die MCU alle 10 Sekunden kurz aktiv und lässt die LED1 als Aktivitätsanzeige kurz blinken. Dies geschieht allerdings ohne die MCU komplett hochzufahren. Jede Minute (einstellbar) wird die MCU vollständig gestartet, damit Programme periodisch überprüfen können, ob etwas zu tun ist – das spart Strom. Folgende Funktionen ermöglichen die Schlafdauer und Anzahl der Durchläufe zu beeinflussen:

FunktionStandardMin … Max
ESP32SetDeepSleepDuration(int ms)10 000 ms200 … 1 200 000 ms
ESP32SetDeepSleepBlinkDuration(int µs)100 µsEmpfohlen bis max. 10 000, damit der Stromverbrauch nicht nennenswert ansteigt
ESP32SetDeepSleepWakeupInterval(int count)6 DurchläufeNach Ablauf der Durchläufe findet ein Wakeup statt (Gesamtdauer = Durchläufe x Dauer)

ESP32 „sleep“ und Wakeup

Die einfache sleep()-Funktion wird genutzt, wenn nichts mehr zu tun ist. Sie lässt die aktuelle CPU schlafen und wartet auf Ereignisse wie Interrupts oder Timer. Der komplette Speicher bleibt erhalten und die Peripherie läuft weiter. Im Regelfall gibt es 1 000 mal pro Sekunde einen System Interrupt, daher flimmert die LED1 (grün) leicht. Die „sleep“-Funktion spart auch Strom, sodass sich die CPU nicht erwärmt. Allerdings werden trotz „sleep“ immer noch ca. 55 mA Strom benötigt, beim „deepsleep“ sind es ca. 7 µA.

Die sleep()-Funktion wird in der loop()-Funktion ausgeführt sobald nichts mehr zu tun ist. Eine Endlosschleife in der Loop („Polling“) ist nicht zu empfehlen und sollte vermieden werden. Eine saubere Programmierung ist ereignisgesteuert und pollt nicht. Dies gilt nicht nur für den ESP32 sondern für alle Programme, auch unter Windows, Linux, Mac sowie insbesondere in Embbeded-Anwendungen.