Skip to Content

Umweltdaten mit LoRa senden

Umweltdaten mit LoRa senden

In diesem Tutorial lernst du, wie man Umweltdaten mit LoRa sendet. LoRa ermöglicht die Übertragung von Sensordaten über große Entfernungen (mehrere Kilometer) bei sehr geringem Stromverbrauch. Wir nutzen dies, um Temperatur-, Feuchtigkeits- und Luftdruckdaten, die von einem BME280 gemessen werden, zwischen zwei ESP32s mit SX1276 LoRa-Modulen zu übertragen.

Wenn du mit LoRa noch nicht vertraut bist, empfehle ich dir, zuerst unser Long range communication with LoRa SX1276 and ESP32 Tutorial zu lesen, da es die Hintergrundinformationen liefert, die du für dieses Tutorial benötigst.

Benötigte Teile

Im Folgenden findest du die benötigten Komponenten. Ich habe ein älteres ESP32-Board verwendet, das zwar veraltet ist, aber noch sehr günstig erhältlich ist. Allerdings funktioniert auch jedes andere ESP32 einwandfrei. Denk nur daran, dass du zwei davon und zwei SX1276-Module brauchst – eines zum Senden und eines zum Empfangen.

Achte bei den SX1276 LoRa-Transceiver-Modulen darauf, welche Version du kaufst! Je nach Land sind unterschiedliche Frequenzen erlaubt (link). In Europa sind es 868 MHz, in Nordamerika 915 MHz und in Asien 433 MHz.

Die Modulbeschreibung gibt entweder die Frequenz an oder enthält eine Zahl wie 868 oder 915 im Namen. Ich habe ein Modul mit 868 MHz verwendet, da ich in Europa bin. Du kannst dieses Modul aber auch für das 915-MHz-Band bekommen.

Als Umweltsensor habe ich den BME280 gewählt, da er klein ist, einen Schlafmodus hat und Temperatur, Feuchtigkeit, Luftdruck sowie Höhe messen kann. Beachte, dass es 5V- und 3,3V-Versionen des BME280-Breakout-Boards gibt. Achte darauf, die 3,3V-Version zu kaufen! Wenn du nur Temperatur und Feuchtigkeit brauchst, ist der Si7021 eine gute Alternative.

2 x Lora 868/915M Modul SX1276

ESP32 lite Lolin32

2 x ESP32 lite

BME280

BME280 Sensor

USB data cable

USB-Datenkabel

Dupont wire set

Dupont-Kabelsatz

Half_breadboard56a

2x Breadboard

Makerguides is a participant in affiliate advertising programs designed to provide a means for sites to earn advertising fees by linking to Amazon, AliExpress, Elecrow, and other sites. As an Affiliate we may earn from qualifying purchases.

SX1276 LoRa Modul

Das SX1276 ist ein LoRa-Transceiver von Semtech. Die meisten Module (Breakout-Boards) basieren auf diesem IC und sind je nach Region für 433 MHz (Asien), 868 MHz (Europa) oder 915 MHz (Nordamerika) konfiguriert. Auf der Rückseite des Moduls findest du meist eine kleine Tabelle, in der die Betriebsfrequenz des jeweiligen Moduls markiert ist. Das Bild unten zeigt ein Modul, das im 915-MHz-Band arbeitet und daher in Nordamerika verwendet werden kann:

Back of SX1276 LoRa Module
Rückseite des SX1276 LoRa Moduls

Achte darauf, ein Modul mit der für dein Land passenden Übertragungsfrequenz zu verwenden! Das Modul kann je nach Antennenqualität, Gelände und Einstellungen Entfernungen von 2 bis über 15 Kilometern überbrücken. Das SX1276 unterstützt Datenraten von 0,018 kbps bis 37,5 kbps. Für weitere technische Details siehe das unten verlinkte Datenblatt:

Das Modul hat 16 Pins. Einen für die Antenne (ANT), einen für die Stromversorgung (VCC), mehrere Massepins (GND), die Pins für SPI (RST, NSS, SCK, MOSI, MISO) und sechs konfigurierbare Digital IO Pins (DIO).

Beachte, dass das SX1276 mit 3,3V-Logik arbeitet und daher nicht direkt an ein Arduino UNO angeschlossen werden kann, das mit 5V-Logik arbeitet. Wenn du statt eines ESP32 ein Arduino verwenden möchtest, musst du entweder einen logic level shifter oder ein Arduino-Board mit 3.3V logic verwenden.

BME280 Sensor

Zur Messung von Umweltdaten wie Temperatur, Feuchtigkeit und Luftdruck verwenden wir den BME280 sensor.

Ein Grund ist, dass er einen stromsparenden Schlafmodus hat, in dem er nur 0,1 µA verbraucht (3,6 µA im Normalmodus). In Kombination mit einem LoRa-Modul und dem ESP32-lite mit einem Deep-Sleep-Strom von 5,65 mA (bei 5V) ergibt das ein sehr energiesparendes Setup, das lange mit Batteriestrom laufen kann.

Der BME280-Sensor selbst ist winzig und wird typischerweise auf einem Breakout-Board mit I2C-Schnittstelle geliefert; siehe das Bild unten.

BME280 breakout board
BME280 Breakout-Board

Der Sensor misst Druck von 300 hPa bis 1100 hPa, Temperatur von -40 °C bis +85 °C und Feuchtigkeit von 0 % bis 100 %. Für mehr Informationen zum BME280 lies unser Tutorial zu How To Use BME280 Pressure Sensor With Arduino oder das Weather Station on e-Paper Display Tutorial.

Anschluss des SX1276 an ESP32

Das SX1276 wird über eine SPI-Schnittstelle gesteuert. Beim Anschluss an einen ESP32 müssen folgende Verbindungen hergestellt werden:

SX1276ESP32
MOSI23
MSIO19
SCK18
RST17
NSS5
DIO04
GNDGND
VCC3,3V

Achte darauf, VCC an den 3,3V-Ausgangspin deines ESP32 anzuschließen. DIO0 wird von uns eigentlich nicht verwendet, du kannst diese Verbindung also weglassen. DIO0 wird benötigt, wenn du einen Interrupt-Handler hinzufügen möchtest, der aufgerufen wird, wenn eine Messung abgeschlossen ist. Das Bild unten zeigt das vollständige Schaltbild (inklusive DIO0):

Connecting SX1276 to ESP32
Anschluss des SX1276 an ESP32

Wenn du ein anderes ESP32-Board verwendest, können die Pins für die Hardware-SPI, auf die sich die obige Verkabelung stützt, abweichen. Wenn du dir unsicher bist, welche Pins du verwenden sollst, schau dir das Find I2C and SPI default pins Tutorial an.

Das Foto unten zeigt die Verkabelung des SX1276 LoRa-Empfängers mit dem ESP32 auf einem Breadboard:

SX1276 LoRa Receiver with the ESP32 on a breadboard
SX1276 LoRa-Empfänger mit ESP32 auf Breadboard

Beachte, dass das SX1276-Modul einen Pin-Abstand von 2 mm hat und nicht direkt auf ein Breadboard passt. Siehe das Long range communication with LoRa SX1276 and ESP32 Tutorial, wie man eine breadboardfreundliche Version des Moduls baut.

Anschluss des BME280 an ESP32

Wir wollen Umgebungstemperatur, Feuchtigkeit und Luftdruck mit dem BME280 messen. Da die Hardware-I2C/SPI-Pins des ESP32 bereits für das SX1276 belegt sind, verwenden wir Software-I2C mit den freien Pins 33 für SDA und 25 für SCL, wie unten gezeigt.

Connecting BME280 to ESP32
Anschluss des BME280 an ESP32

Unten ist die Verbindungstabelle für den BME280 und den ESP32. Du kannst andere Pins für I2C verwenden, aber wenn du das tust, vergiss nicht, den Code im nächsten Abschnitt entsprechend anzupassen.

BME280 ESP32
SDA33
SCL25
GNDGND
VCC3,3V

Beachte, dass es 5V- und 3,3V-Versionen des BME280-Breakout-Boards gibt. Ich verwende die 3,3V-Version und schließe daher VCC an den 3,3V-Pin des ESP32 an.

Da der WEMOS LOLIN32 Lite einen eingebauten Batterieanschluss und Ladegerät hat, kannst du das gesamte System mit einer LiPo-Batterie betreiben. Das Bild unten zeigt die komplette Verkabelung mit angeschlossener LiPo-Batterie:

SX1276 LoRa Sender with ESP32 and LiPo on breadboard
SX1276 LoRa Sender mit ESP32 und LiPo auf Breadboard

Ich habe einen Deep-Sleep-Strom von 0,2 mA und einen Strom von 140 mA beim Senden gemessen. Wenn du eine 18650 battery mit einer Kapazität von etwa 3300 mAh (je nach Marke) verwendest, kannst du den Sensor wahrscheinlich etwa ein Jahr lang betreiben, wenn du alle Minute misst und sendest.

Code für LoRa-Empfänger

In diesem Abschnitt schreiben wir zuerst den Code für die Empfängerseite, da dieser einfacher ist. Der folgende Code empfängt Temperatur, Feuchtigkeit und Druck vom BME280-Sensor, die über das SX1276 LoRa-Modul gesendet werden, und zeigt die Messwerte im Serial Monitor an:

#include <SPI.h>
#include <LoRa.h>

// WEMOS LOLIN32 Lite
// MOSI ->  23
// MISO ->  19
// SCK  ->  18
#define SS 5
#define RST 17
#define DIO0 4


void initLoRa() {
  LoRa.setPins(SS, RST, DIO0);
  // 433E6: Asia, 868E6: Europe, 915E6: North America
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xF3);          // 0-0xFF sync word to match the receiver
  LoRa.setSpreadingFactor(12);     // (6-12) higher value increases range but decreases data rate
  LoRa.setSignalBandwidth(125E3);  // lower value increases range but decreases data rate
  LoRa.setCodingRate4(8);          // higher value increases range but decreases data rate
  LoRa.enableCrc();
}

void readLoRaData() {
  static char data[128];
  int i = 0;
  while ((i < 128) && LoRa.available()) {
    data[i++] = LoRa.read();
  }
  data[i] = '\0';
  //Serial.println(data);

  float temp, hum, pres;
  sscanf(data, "%f|%f|%f", &temp, &hum, &pres);

  Serial.printf("%.1fC  %.0f%%  %.0fhPa  (%d)\n",
                temp, hum, pres, LoRa.packetRssi());
}

void setup() {
  Serial.begin(115200);
  initLoRa();
}

void loop() {
  if (LoRa.parsePacket()) {
    readLoRaData();
  }
}

Bibliotheken

Zu Beginn bindet der Code die notwendigen Bibliotheken ein. Die SPI.h Bibliothek übernimmt die Kommunikation zwischen ESP32 und LoRa-Modul, während LoRa.h uns eine einfache Schnittstelle zum SX1276-Modul bietet.

#include <SPI.h>
#include <LoRa.h>

Du kannst die LoRa library von Sandeep Mistry über den Library Manager in der Arduino IDE installieren. Das Bild unten zeigt eine erfolgreiche Installation der Bibliothek:

LoRa library in LIBRARY MANAGER
LoRa-Bibliothek im LIBRARY MANAGER

Konstanten

Als nächstes definiert der Code die SPI-Pins, die speziell für den WEMOS LOLIN32 Lite, ein kompaktes ESP32-Entwicklungsboard, gelten. Die SS, RST und DIO0 Pins sind für die LoRa-Kommunikation entscheidend und müssen korrekt gesetzt werden, um mit deiner Verkabelung übereinzustimmen.

#define SS 5
#define RST 17
#define DIO0 4

initLoRa

Jetzt folgt die initLoRa() Funktion. Diese initialisiert das LoRa-Radio und konfiguriert es für deine Region und Leistungsanforderungen. Zuerst werden die Steuerpins mit LoRa.setPins() gesetzt.

LoRa.setPins(SS, RST, DIO0);

Danach versucht der Code, das LoRa-Radio bei einer Frequenz von 868 MHz zu starten, die in Europa verwendet wird. Wenn die Initialisierung fehlschlägt, wird alle 500 Millisekunden ein neuer Versuch gestartet, während Punkte im Serial Monitor ausgegeben werden.

while (!LoRa.begin(868E6)) {
  Serial.println(".");
  delay(500);
}

Sobald das LoRa-Modul gestartet ist, werden mehrere Parameter konfiguriert, um die Reichweite zu maximieren. Das Sync-Wort wird auf 0xF3 gesetzt, was hilft, Pakete zu filtern, die nicht aus deinem eigenen Netzwerk stammen. Der Spreading-Faktor wird auf 12 erhöht für größere Reichweite, und die Signalbandbreite wird auf 125 kHz verengt, um die Reichweite weiter zu steigern. Die Codierungsrate wird auf 4/8 gesetzt, was erneut Reichweite über Geschwindigkeit priorisiert. Schließlich wird die CRC-Prüfung aktiviert, um die Datenintegrität sicherzustellen.

LoRa.setSyncWord(0xF3);
LoRa.setSpreadingFactor(12);
LoRa.setSignalBandwidth(125E3);
LoRa.setCodingRate4(8);
LoRa.enableCrc();

readLoRaData

Die readLoRaData() Funktion wird immer dann aufgerufen, wenn ein Paket ankommt. Sie liest die verfügbaren Bytes vom LoRa-Modul in einen Zeichenpuffer ein, wobei sie darauf achtet, 128 Zeichen nicht zu überschreiten. Danach wird die Zeichenkette mit einem Nullzeichen terminiert.

static char data[128];
int i = 0;
while ((i &lt; 128) &amp;&amp; LoRa.available()) {
  data[i++] = LoRa.read();
}
data[i] = '\0';

Anschließend werden mit sscanf() drei Fließkommawerte – Temperatur, Feuchtigkeit und Druck – extrahiert, wobei das Pipe-Symbol (|) als Trennzeichen dient. Diese Werte werden dann im Serial Monitor in lesbarer Form zusammen mit dem RSSI (Received Signal Strength Indicator) ausgegeben, der die Signalstärke anzeigt.

float temp, hum, pres;
sscanf(data, "%f|%f|%f", &amp;temp, &amp;hum, &amp;pres);

Serial.printf("%.1fC  %.0f%%  %.0fhPa  (%d)\n",
              temp, hum, pres, LoRa.packetRssi());

setup

Die setup() Funktion ist kurz und bündig. Sie initialisiert die serielle Schnittstelle mit 115200 Baud für Debugging und ruft initLoRa() auf, um das Radio vorzubereiten.

void setup() {
  Serial.begin(115200);
  initLoRa();
}

loop

Schließlich überprüft die loop() Funktion kontinuierlich auf eingehende LoRa-Pakete. Wenn ein Paket mit LoRa.parsePacket() erkannt wird, ruft sie readLoRaData() auf, um die Daten zu verarbeiten.

void loop() {
  if (LoRa.parsePacket()) {
    readLoRaData();
  }
}

Anstatt die Daten im Serial Monitor auszugeben, könntest du die Umweltdaten auch auf einem OLED- oder e-Paper-Display anzeigen, auf einer SD-Karte protokollieren oder in die Cloud hochladen.

Code für LoRa-Sender

Dieser Abschnitt enthält den Code für den Sender. Er ergänzt den oben beschriebenen Empfänger. Der Sender misst Umweltdaten wie Temperatur, Feuchtigkeit und Luftdruck, sendet die Daten jede Minute per LoRa und versetzt den ESP32 zwischen den Übertragungen in den Deep-Sleep-Modus, um Batteriestrom zu sparen:

#include <Wire.h>
#include <SPI.h>
#include <LoRa.h>
#include <Adafruit_BME280.h>

// WEMOS LOLIN32 Lite
// MOSI ->  23
// MISO ->  19
// SCK  ->  18
#define SS 5
#define RST 17
#define DIO0 4

Adafruit_BME280 bme;

void initBMESensor() {
  Wire.begin(33, 25);  // Software I2C for BME280
  bme.begin(0x76, &Wire);
  bme.setSampling(Adafruit_BME280::MODE_FORCED,
                  Adafruit_BME280::SAMPLING_X1,  // temperature
                  Adafruit_BME280::SAMPLING_X1,  // pressure
                  Adafruit_BME280::SAMPLING_X1,  // humidity
                  Adafruit_BME280::FILTER_OFF);
}

void initLoRa() {
  LoRa.setPins(SS, RST, DIO0);
  // 433E6: Asia, 868E6: Europe, 915E6: North America
  while (!LoRa.begin(868E6)) {
    Serial.println(".");
    delay(500);
  }
  LoRa.setSyncWord(0xF3);          // 0-0xFF sync word to match the receiver
  LoRa.setSpreadingFactor(12);     // (6-12) higher value increases range but decreases data rate
  LoRa.setSignalBandwidth(125E3);  // lower value increases range but decreases data rate
  LoRa.setCodingRate4(8);          // higher value increases range but decreases data rate
  LoRa.enableCrc();
}

void sendLoRaData() {
  static char data[128];

  bme.takeForcedMeasurement();
  float temp = bme.readTemperature();
  float hum = bme.readHumidity();
  float pres = bme.readPressure() / 100.0;

  sprintf(data, "%.2f|%.2f|%.2f", temp, hum, pres);
  Serial.print(data);

  LoRa.beginPacket();
  LoRa.print(data);
  LoRa.endPacket();
}

void shutdownPeripherals() {
  LoRa.sleep();

  Wire.end();
  pinMode(33, INPUT);
  pinMode(25, INPUT);

  SPI.end();
  pinMode(23, INPUT); // MOSI
  pinMode(19, INPUT); // MISO
  pinMode(18, INPUT); // SCK
  pinMode(SS, INPUT);  // SS
  pinMode(RST, INPUT); // RST
  pinMode(DIO0, INPUT);  // DIO0
}

void setup() {
  Serial.begin(115200);
  initBMESensor();
  initLoRa();
  sendLoRaData();
  shutdownPeripherals();
  esp_sleep_enable_timer_wakeup(60 * 1000 * 1000);  // 1 min
  esp_deep_sleep_start();
}

void loop() {
}

Bibliotheken

Zuerst bindet der Code Bibliotheken für LoRa-Kommunikation und den Zugriff auf den BME280-Sensor ein. Während wir SPI.h und LoRa.h bereits besprochen haben, verwendet dieses Sketch auch Wire.h für die I2C-Kommunikation und Adafruit_BME280.h, das eine High-Level-Schnittstelle für den Sensor bereitstellt.

#include <Wire.h>
#include <SPI.h>
#include <LoRa.h>
#include <Adafruit_BME280.h>

Du kannst die Adafruit_BME280 Bibliothek über den Library Manager installieren. Nach erfolgreicher Installation sollte es so aussehen:

Adafruit_BME280 library in Library Manager
Adafruit_BME280 Bibliothek im Library Manager

Objekte

Der BME280-Sensor wird mit dem Treiber von Adafruit instanziiert. Dieses Objekt, bme, übernimmt alle Messungen.

Adafruit_BME280 bme;

initBMESensor

Die initBMESensor() Funktion initialisiert den BME280 über Software-I2C. Statt der Standard-I2C-Pins des ESP32 werden GPIO 33 für SDA und GPIO 25 für SCL verwendet, was nützlich ist, wenn der Standard-I2C-Bus anderweitig belegt ist.

Wire.begin(33, 25);  // Software I2C for BME280
bme.begin(0x76, &Wire);

Ich verwende die I2C-Adresse 0x76 bei der Konfiguration des Sensors mit bme.begin(0x76, &Wire). Dein Sensor kann eine andere I2C-Adresse haben. Zum Beispiel ist 0x77 ebenfalls häufig für den BME280.

Der Sensor wird im Forced-Modus betrieben, das heißt, er misst nur, wenn explizit dazu aufgefordert. Das spart Energie. Die Abtastung ist auf Minimum (1x) für Temperatur, Druck und Feuchtigkeit eingestellt, und der interne Filter ist deaktiviert.

bme.setSampling(Adafruit_BME280::MODE_FORCED,
                Adafruit_BME280::SAMPLING_X1,
                Adafruit_BME280::SAMPLING_X1,
                Adafruit_BME280::SAMPLING_X1,
                Adafruit_BME280::FILTER_OFF);

initLora

Die initLoRa() Funktion ist identisch zum Empfänger-Sketch und richtet das LoRa-Modul für Langstrecken- und Niedrigbitraten-Kommunikation ein. Wenn du eine Auffrischung brauchst, wie das funktioniert, siehe die vorherige Erklärung.

sendLoRaData

Jetzt zum Kern des Sketches: sendLoRaData(). Diese Funktion liest die aktuellen Umweltdaten vom BME280 aus und sendet sie per LoRa. Zuerst zwingt sie den Sensor zu einer neuen Messung.

bme.takeForcedMeasurement();

Dann liest sie Temperatur, Feuchtigkeit und Druckwerte aus. Der Druck wird durch 100 geteilt, um von Pascal auf hPa umzurechnen, was dem Format entspricht, das der Empfänger erwartet.

float temp = bme.readTemperature();
float hum = bme.readHumidity();
float pres = bme.readPressure() / 100.0;

Die Sensordaten werden dann zu einem einzigen String formatiert, wobei das | Zeichen als Trennzeichen verwendet wird. Das entspricht dem erwarteten Format auf der Empfängerseite:

sprintf(data, "%.2f|%.2f|%.2f", temp, hum, pres);
Serial.print(data);

Ein typischer String sieht so aus: 25.59|54.93|1001.23. Statt eines Strings könnten wir die Daten auch als Bytes senden. Jeder Float hat 4 Bytes, und das Senden von 3×4 = 12 Bytes würde die Datenmenge reduzieren. Andererseits wäre das Hinzufügen weiterer Daten und das Entpacken auf der Empfängerseite komplexer.

Anschließend beginnt der Code ein LoRa-Paket, schreibt die Daten hinein und schließt das Paket, um es zu senden.

LoRa.beginPacket();
LoRa.print(data);
LoRa.endPacket();

shutdownPeripherals

Nachdem die Daten gesendet wurden, schaltet die shutdownPeripherals() Funktion alles ab, was nicht benötigt wird. Sie versetzt das LoRa-Modul in den Schlafmodus, beendet die I2C- und SPI-Busse und konfiguriert alle zugehörigen GPIO-Pins als Eingänge, um unnötigen Stromverbrauch zu vermeiden.

LoRa.sleep();

Wire.end();
pinMode(33, INPUT);
pinMode(25, INPUT);

SPI.end();
pinMode(23, INPUT);
pinMode(19, INPUT);
pinMode(18, INPUT);
pinMode(SS, INPUT);
pinMode(RST, INPUT);
pinMode(DIO0, INPUT);

setup

Die setup() Funktion verbindet alles. Sie initialisiert die serielle Schnittstelle, den BME280-Sensor und das LoRa-Modul. Dann sendet sie die Daten und schaltet alles ab. Schließlich konfiguriert sie den ESP32 so, dass er nach 60 Sekunden mittels Timer-Weckfunktion aus dem Deep Sleep erwacht, und versetzt ihn sofort in den Deep-Sleep-Modus.

esp_sleep_enable_timer_wakeup(60 * 1000 * 1000);  // 1 min
esp_deep_sleep_start();

loop

Die loop() Funktion bleibt leer, da der ESP32 sie nie erreicht. Nach dem Senden der Daten schläft der Mikrocontroller, bis er zum nächsten Zyklus aufwacht.

void loop() {
}

Und das war’s. Mit dem Code für Sender und Empfänger hast du ein System, um Umweltdaten mit einem Sensor zu messen, der kilometerweit entfernt ist, und das lange mit Batteriestrom laufen kann.

Fazit

In diesem Tutorial hast du gelernt, wie man Umweltdaten wie Temperatur, Feuchtigkeit und Luftdruck mit einem BME280-Sensor misst und diese Daten über große Entfernungen mit LoRa und dem SX1276-Transceiver-Modul überträgt.

Im Gegensatz zu WiFi oder Bluetooth ermöglicht LoRa die Datenübertragung von Sensoren, die kilometerweit entfernt sind und lange mit Batteriestrom betrieben werden müssen. Ich habe nicht viel Zeit in die Minimierung des Batterieverbrauchs investiert, und das folgende BME280 Sleep Mode Video enthält möglicherweise weitere nützliche Informationen.

Wenn du Daten nur zwischen wenigen Sensoren überträgst, ist reines LoRa ausreichend. Wenn du jedoch viele Sensoren verwalten und Messwerte ins Internet senden möchtest, ist LoRaWAN die bessere Wahl. Siehe das LoRaWAN with Thinknode G1 Gateway Tutorial für mehr Informationen zu diesem Thema.

Wir haben die Messwerte im Serial Monitor ausgegeben, aber du könntest den Code leicht erweitern, um die Daten auf einem Display anzuzeigen. Schau dir die Weather Station on e-Paper Display und die How to configure TFT_eSPI Library for TFT display Tutorials an.

Wenn du auch Wetterdaten aus dem Internet oder die aktuelle Uhrzeit anzeigen möchtest, empfehle ich die Simple ESP32 Internet Weather Station und die Automatic Daylight Savings Time Clock Tutorials.

Wenn du Fragen hast, kannst du sie gerne im Kommentarbereich stellen.

Viel Spaß beim Tüfteln ; )