Hier kommt ein zeitabhängiges Ausführen des Codes zum Einsatz, um das Prellen der Taster so weit wie möglich zu eliminieren, eine unangenehme Eigenschaft aller mechanischen Schaltelemente. Sie besitzen keinen sauberen Übergang von Aus zu An und umgekehrt, sondern schwingen während des Schaltens schnell zwischen den beiden Zuständen hin und her. Das führt in Programmen manchmal zu Problemen. Daher lässt der Code hier nur alle 200 Millisekunden eine Änderung zu (Zeile 39).
Nach interruptHandlerButton() folgen drei Zeilen, die die Hardwareereignisse mit dem Programmcode verbinden; die Interrupt-Handler werden registriert (Zeile 50 bis 52). Dabei geben Sie an, auf welches Ereignis das Programm reagieren soll. In unserem Fall handelt es sich um eine steigende Signalflanke am Pin. Infrage käme aber auch eine fallende Flanke oder einer der beiden Zustände HIGH und LOW.
Nach dem Registrieren der Interrupts beginnt das eigentliche Hauptprogramm mit einer Endlosschleife (ab Zeile 54). Sie löscht das Display und schreibt es mit den Werten der Variable button und den Messwerten des Temperatursensors neu. Das Kommando oled.show() bringt die Werte endgültig zur Anzeige (Zeile 59). Damit die Abfrage des Temperatursensor nicht zu oft stattfindet, pausiert die Schleife für eine kleine Wartezeit (Zeile 60). Anderenfalls würde sich der Sensor mit jeder Abfrage ein wenig aufheizen und so die Messwerte verfälschen.
Listing 3
Testprogramm
from machine import Pin, SoftI2C
import ssd1306, time, onewire, ds18x20, _thread
pins=[2,0,4,16,17,5,18,19]
pin=[]
for i in range(0,8):
pin.append(Pin(pins[i],Pin.OUT))
button1 = Pin(25, Pin.IN,Pin.PULL_DOWN)
button2 = Pin(26, Pin.IN,Pin.PULL_DOWN)
button3 = Pin(27, Pin.IN,Pin.PULL_DOWN)
dsPin = Pin(12,Pin.IN, Pin.PULL_UP)
last_ms=0
button=""
i2c = SoftI2C(sda=Pin(21), scl=Pin(22))
oled = ssd1306.SSD1306_I2C(128, 64, i2c)
ds = ds18x20.DS18X20(onewire.OneWire(dsPin))
roms=ds.scan()
for rom in roms:
r=rom
def runningLight():
while True:
for i in range(0,8):
pin[i].on()
time.sleep_ms(100)
for i in range(0,8):
pin[i].off()
time.sleep_ms(100)
_thread.start_new_thread(runningLight, ())
def interruptHandlerButton(pin):
global last_ms
global button
time_ms = time.ticks_ms()
if(last_ms+200<time_ms):
if(str(pin)=="Pin(25)"):
button="Button 1"
if(str(pin)=="Pin(26)"):
button="Button 2"
if(str(pin)=="Pin(27)"):
button="Button 3"
last_ms=time_ms
else:
return
button1.irq(trigger=Pin.IRQ_RISING, handler=interruptHandlerButton)
button2.irq(trigger=Pin.IRQ_RISING, handler=interruptHandlerButton)
button3.irq(trigger=Pin.IRQ_RISING, handler=interruptHandlerButton)
while True:
oled.fill(0)
ds.convert_temp()
oled.text(button, 0, 0)
oled.text(str(ds.read_temp(r)),0,20)
oled.show()
time.sleep_ms(200)
Tipps zum Schluss
Bevor Sie eine Hardware an das NodeMCU-Board anschließen, werfen Sie am besten einen Blick auf das Pinout [9] des Boards. Nicht auf alle Pins lassen sich beliebige Funktionen legen. So eigenen sich beispielsweise die Pins 34 und 35 nur für Inputs. Auch Hardwareschnittstellen wie SPI, I2C und UART stehen nur an bestimmten Pins zur Verfügung.
Sollte sich ein Programm einmal richtig verheddern und sich nicht mehr über die IDE beenden lassen, hilft immer ein Hardware-Reset direkt am Controller. Der entsprechende Button trägt die etwas verwirrende Bezeichnung EN.
Bisher starteten wir die Testprogramme immer nur über Thonny, nach einem Neustart des Controllers laufen sie nicht mehr. Das ist während der Entwicklung durchaus eine sinnvolle Sache, aber für den Betrieb eher suboptimal. Micropython bietet hier eine einfache Möglichkeit, Programme automatisch zu starten: Wenn ein Programm den Namen main.py trägt, startet es direkt beim Einschalten des Controllers. Vergewissern Sie sich, dass der Quellcode fehlerfrei ist, anderenfalls stürzt der Controller sofort ab.
Wenn Sie mit dem print()-Kommando Werte auf der Konsole ausgeben, gelangen diese per USB zu Thonny. Über dieselbe Verbindung tauschen Controller und IDE aber auch die Steuerkommandos aus. Überlasten Sie die Leitung mit zu vielen Ausgaben, führt das unter Umständen zum Absturz sowohl von Thonny als auch des Controllers. Achten Sie daher immer darauf, dass Ihr Programm nur wenig Informationen über diesen Weg ausgibt.
Der nächste Tipp klingt erst einmal banal, hilft aber viel. Während des Entwickelns speichert lediglich der Controller die Programme. Sie sollten sich deshalb angewöhnen, hin und wieder eine Kopie auf den Rechner abzulegen. Sonst könnte es passieren, dass Sie mehrere Tage Arbeit verlieren, wenn der Controller nicht mehr funktioniert.
Unter dem Menüpunkt Ansicht | Dateien | Filemanager aktivieren Sie in Thonny einen einfachen Dateimanager, der gute Dienste beim Erstellen von Sicherheitskopien leistet. Der Dateimanager kennt kein Drag & Drop, alle Funktionen liegen hinter der rechten Maustaste.
Fazit
Zwar mag der Autor Python nicht besonders, muss aber zugeben, dass es wirklich Spaß macht, den ESP32 in Micropython zu programmieren. Der Testaufbau zeigt, dass sich in Programmen Funktionen wie Interrupts und Threads recht problemlos verwenden lassen. Der Code bleibt gut leserlich, obwohl zahlreiche Funktionen zum Einsatz kommen. Micropython erlaubt zudem das einfache Erweitern um zusätzliche Module. Alles in allen bietet Micropython auf dem NodeMCU-Board einen guten und einfachen Einstieg in die Welt der Mikrocontroller. (tle/jlu)
Der Autor
Martin Mohr hat die komplette Entwicklung der modernen Computertechnik live miterlebt. Nach dem Studium entwickelte er überwiegend Java-Applikationen. Mit dem Raspberry Pi erwachte seine alte Liebe zur Elektronik wieder.
Infos
- NodeMCU-Board: https://www.az-delivery.de/products/esp-32-dev-kit-c-v4
- ESP32-Basics: Martin Mohr, “Schneller Einstieg”, RPG 01-02/2022, S. 56, https://www.raspi-geek.de/47058
- OLED-Display: https://www.az-delivery.de/products/0-96zolldisplay
- Temperatursensor DS18b20: https://www.az-delivery.de/products/5ersetds18b20
- Thonny: https://thonny.org
- Micropython herunterladen: https://micropython.org/download/esp32/
- Micropython-Dokumentation: https://docs.micropython.org/en/latest/esp32/quickref.html#installing-micropython
- Zusätzliche Micropython-Module: https://github.com/micropython/micropython/
- Pinout des ESP32-Dev-Boards: https://cdn.shopify.com/s/files/1/1509/1638/files/ESP-32_NodeMCU_Developmentboard_Pinout.pdf





