Um den Heltec WiFi LoRa 32 V3 mit CircuitPython und LoRa zu nutzen, musst du zuerst die passende CircuitPython-Firmware flashen und anschließend eine Treiber-Bibliothek für den verbauten SX1262-Chip verwenden. [1, 2]
Das Heltec V3 Board basiert auf dem ESP32-S3. [1]
heltec_esp32s3_wifi_lora_v3 herunter.Da der Heltec V3 den SX1262 LoRa-Chip nutzt, benötigst du einen Treiber, der diesen unterstützt. Die Standard adafruit_circuitpython_rfm9x Bibliothek ist primär für ältere Chips (SX127x) gedacht. [5, 6]
Die interne Verschaltung des LoRa-Chips beim V3 ist fest vorgegeben. Du musst diese Pins in deinem Python-Skript definieren: [8, 9]
| Funktion [9] | GPIO Pin (V3) |
|---|---|
| SCK (SPI Clock) | 9 |
| MOSI | 10 |
| MISO | 11 |
| CS (NSS) | 8 |
| Reset | 12 |
| Busy | 13 |
| DIO1 (Interrupt) | 14 |
Hier ist ein grober Aufbau, wie die Initialisierung in CircuitPython aussieht:
1import board
2import busio
3import digitalio
4# Beispiel mit der micropySX126X oder ähnlichen Treibernfrom sx1262
5import SX1262
6
7# SPI Bus initialisieren
8spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
9
10# LoRa Modul initialisieren
11lora = SX1262(
12 spi,
13 cs=board.IO8,
14 irq=board.IO14,
15 rst=board.IO12,
16 gpio=board.IO13 # Busy Pin
17)
18
19lora.begin()
20lora.setFrequency(868.0) # Frequenz für Europa
Zusätzliche Tipps:
Möchtest du ein konkretes Sende- oder Empfangsskript für deine erste Verbindung sehen?
[1] https://circuitpython.org
[2] https://github.com
[3] https://icssw.org
[4] https://openelab.io
[5] https://heltec.org
[6] https://heltec.org
[7] https://polluxlabs.net
[8] https://community.heltec.cn
[9] https://eddyds-smarthome.de
[10] https://www.youtube.com
[11] https://gist.github.com
1import board
2import busio
3import digitalio
4# Beispiel mit der micropySX126X oder ähnlichen Treibern
5from sx1262 import SX1262
6
7# SPI Bus initialisieren
8spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
9
10# LoRa Modul initialisieren
11lora = SX1262(
12 spi,
13 cs=board.IO8,
14 irq=board.IO14,
15 rst=board.IO12,
16 gpio=board.IO13 # Busy Pin
17)
18
19lora.begin()
20lora.setFrequency(868.0) # Frequenz für Europa
Hier ist ein vollständiges Beispiel für ein einfaches Sende- und Empfangsskript. Wir nutzen dafür die Bibliothek micropySX126X, da sie speziell für den SX1262-Chip des Heltec V3 in CircuitPython und MicroPython entwickelt wurde. [1, 2]
Dieses Skript sendet alle zwei Sekunden eine Nachricht (“Hallo LoRa!”). [4]
1import board
2import busio
3import time
4import digitalio
5from sx1262 import SX1262
6
7# Vext aktivieren (Stromversorgung für Peripherie beim Heltec V3)
8vext = digitalio.DigitalInOut(board.IO18) # Vext Control Pin
9vext.direction = digitalio.Direction.OUTPUT
10vext.value = False # LOW aktiviert Vext beim V3
11
12# SPI-Bus mit V3-spezifischen Pins initialisieren
13spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
14
15# SX1262 Konfiguration für Heltec V3
16lora = SX1262(
17 spi,
18 cs=board.IO8,
19 irq=board.IO14,
20 rst=board.IO12,
21 gpio=board.IO13 # Busy Pin
22)
23
24lora.begin()
25lora.setFrequency(868.0) # Frequenz für Europa
26
27while True:
28 print("Sende Nachricht...")
29 lora.send(b"Hallo LoRa!")
30 time.sleep(2)
Dieses Skript wartet kontinuierlich auf eingehende Daten und gibt diese im seriellen Monitor aus. [4]
1import board
2import busio
3import digitalio
4from sx1262 import SX1262
5
6# Vext aktivieren (wie oben)
7vext = digitalio.DigitalInOut(board.IO18)
8vext.direction = digitalio.Direction.OUTPUT
9vext.value = False
10
11# SPI initialisieren
12spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
13
14# SX1262 initialisieren
15lora = SX1262(spi, cs=board.IO8, irq=board.IO14, rst=board.IO12, gpio=board.IO13)
16lora.begin()
17lora.setFrequency(868.0)
18
19print("Warte auf Daten...")
20
21while True:
22 payload, status = lora.recv() # Blockiert bis Daten kommen
23 if payload:
24 print("Empfangen:", payload.decode())
25 print("Status:", status)
Soll ich dir zeigen, wie du die empfangenen Nachrichten zusätzlich auf dem integrierten OLED-Display anzeigst?
[1] https://github.com
[2] https://github.com
[3] https://learn.adafruit.com
[4] https://www.slashcam.de
[5] https://community.heltec.cn
[6] https://github.com
[7] https://www.youtube.com
[8] https://community.heltec.cn
LoRa Sender:
1import board
2import busio
3import time
4import digitalio
5from sx1262 import SX1262
6
7# Vext aktivieren (Stromversorgung für Peripherie beim Heltec V3)
8vext = digitalio.DigitalInOut(board.IO18) # Vext Control Pin
9vext.direction = digitalio.Direction.OUTPUT
10vext.value = False # LOW aktiviert Vext beim V3
11
12# SPI-Bus mit V3-spezifischen Pins initialisieren
13spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
14
15# SX1262 Konfiguration für Heltec V3
16lora = SX1262(
17 spi,
18 cs=board.IO8,
19 irq=board.IO14,
20 rst=board.IO12,
21 gpio=board.IO13 # Busy Pin
22)
23
24lora.begin()
25lora.setFrequency(868.0) # Frequenz für Europa
26
27while True:
28 print("Sende Nachricht...")
29 lora.send(b"Hallo LoRa!")
30 time.sleep(2)
LoRa Receiver:
1import board
2import busio
3import digitalio
4from sx1262 import SX1262
5
6# Vext aktivieren (wie oben)
7vext = digitalio.DigitalInOut(board.IO18)
8vext.direction = digitalio.Direction.OUTPUT
9vext.value = False
10
11# SPI initialisieren
12spi = busio.SPI(board.IO9, MOSI=board.IO10, MISO=board.IO11)
13
14# SX1262 initialisieren
15lora = SX1262(spi, cs=board.IO8, irq=board.IO14, rst=board.IO12, gpio=board.IO13)
16lora.begin()
17lora.setFrequency(868.0)
18
19print("Warte auf Daten...")
20
21while True:
22 payload, status = lora.recv() # Blockiert bis Daten kommen
23 if payload:
24 print("Empfangen:", payload.decode())
25 print("Status:", status)
Das integrierte 0,96-Zoll-OLED-Display des Heltec V3 nutzt den SSD1306-Treiber und wird über eine interne I2C-Schnittstelle angesteuert. [1, 2]
Um das Display in CircuitPython zu nutzen, benötigst du zwei Bibliotheken von Adafruit:
Lade das Adafruit CircuitPython Bundle herunter und kopiere die entsprechenden Dateien in den lib-Ordner deines CIRCUITPY-Laufwerks.
Das Display beim V3 ist an festen Pins angeschlossen, die von den Standard-I2C-Pins abweichen: [5, 6]
Dieses Skript initialisiert das Display und zeigt zwei Zeilen Text an: [9]
1import board
2import busio
3import digitalio
4import adafruit_ssd1306
5
6# 1. Reset-Pin des Displays kurz triggern (wichtig für V3)
7oled_reset = digitalio.DigitalInOut(board.IO21)
8oled_reset.direction = digitalio.Direction.OUTPUT
9oled_reset.value = Falseimport time
10time.sleep(0.01)
11oled_reset.value = True
12
13# 2. I2C-Bus für das Display initialisieren
14# SDA = IO17, SCL = IO18
15i2c = busio.I2C(board.IO18, board.IO17)
16
17# 3. Display-Objekt erstellen (128x64 Pixel)
18display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
19
20# 4. Inhalt zeichnen
21display.fill(0) # Bildschirm leeren (schwarz)
22display.text("Heltec V3", 0, 0, 1) # Text an Position (x=0, y=0)
23display.text("LoRa aktiv!", 0, 20, 1) # Text an Position (x=0, y=20)
24
25# 5. Änderungen auf das Display übertragen
26display.show()
Möchtest du wissen, wie du Grafiken oder Sensordaten in Echtzeit auf dem Display visualisierst?
[1] https://wiki.heltec.org
[2] https://www.amazon.com
[3] https://www.sabulo.com
[4] https://docs.circuitpython.org
[5] https://www.youtube.com
[6] https://www.hackerspace-ffm.de
[7] https://community.heltec.cn
[8] https://community.heltec.cn
[9] https://www.youtube.com
[10] https://docs.micropython.org
[11] https://heltec.org
1import board
2import busio
3import digitalio
4import adafruit_ssd1306
5
6# 1. Reset-Pin des Displays kurz triggern (wichtig für V3)
7oled_reset = digitalio.DigitalInOut(board.IO21)
8oled_reset.direction = digitalio.Direction.OUTPUT
9oled_reset.value = False
10import time
11time.sleep(0.01)
12oled_reset.value = True
13
14# 2. I2C-Bus für das Display initialisieren
15# SDA = IO17, SCL = IO18
16i2c = busio.I2C(board.IO18, board.IO17)
17
18# 3. Display-Objekt erstellen (128x64 Pixel)
19display = adafruit_ssd1306.SSD1306_I2C(128, 64, i2c)
20
21# 4. Inhalt zeichnen
22display.fill(0) # Bildschirm leeren (schwarz)
23display.text("Heltec V3", 0, 0, 1) # Text an Position (x=0, y=0)
24display.text("LoRa aktiv!", 0, 20, 1) # Text an Position (x=0, y=20)
25
26# 5. Änderungen auf das Display übertragen
27display.show()
Für CircuitPython gibt es mehrere etablierte LoRa-Bibliotheken, die je nach verwendetem Funkmodul und Protokoll (einfaches Paket-Radio oder LoRaWAN) ausgewählt werden sollten.
Diese Bibliotheken sind am besten dokumentiert und direkt im Adafruit CircuitPython Library Bundle enthalten. [1]
Für Module, die nicht direkt von Adafruit stammen, gibt es spezialisierte Treiber in der Community: [11]
Einige Entwicklungsboards sind so vorkonfiguriert, dass die Bibliotheken bereits im CircuitPython-Image enthalten sind oder direkt unterstützt werden:
Welches LoRa-Modul oder Entwicklungsboard planst du für dein Projekt zu verwenden?
[1] https://www.phippselectronics.com
[2] https://docs.circuitpython.org
[3] https://github.com
[4] https://www.youtube.com
[5] https://docs.circuitpython.org
[6] https://docs.circuitpython.org
[7] https://docs.circuitpython.org
[8] https://pypi.org
[9] https://github.com
[10] https://lowpowerlab.com
[11] https://www.phippselectronics.com
[12] https://github.com
[13] https://github.com
[14] https://github.com
[15] https://github.com
[16] https://github.com
[17] https://ilabs.se
[18] https://learn.adafruit.com
[19] https://circuitpython.org