Technische Dokumentation

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.

Eagle-Board: Pin- und Interrupt-Belegung

U.FL-Antennenanschluss

A Eine U.FL-Buchse ist bereits aufgelötet. Bitte beachten Sie, dass die U.FL-Buchse nur für wenige Steckvorgänge ausgelegt ist.

Genauigkeit des ESP32 Analog-Digital-Wandlers (ADC)

Um die Genauigkeit der ADC-Messungen beim Eagle-Board wesentlich zu erhöhen, wird in der Produktion der Eagle-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 Eagle-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 Eagle-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

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

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

Zusätzlich wird die MCU alle 10 Sekunden kurz aktiv und lässt die weiße LED 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äufe
Nach 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. 800 µ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.