Nachdem ich dir gezeigt habe, wie du den ESP32 für MicroPython flasht und wie die Programmiersprache aufgebaut ist, wollen wir LEDs und Taster via GPIO-Pins steuern.
Für diese Beitragsreihe verwende ich den ESP32 D1 R32 sowie das Rich Shield Two von Open Smart. Wenn du dieses nicht hast, so gebe ich dir trotzdem jeweils die Hinweise wie du die Schaltung auf einem Breadboard aufbauen kannst.
Sollten trotzdem Fragen offen bleiben, so kannst du mir gerne eine Mail an info@draeger-it.blog senden oder hier einen Kommentar hinterlassen.
Inhaltsverzeichnis
LEDs am Rich Shield von Open Smart
Die LEDs am Rich Shield von Open Smart sind an nachfolgende Pins angeschlossen:
LED | ESP32 D1 R32 | Arduino UNO R3 |
---|---|---|
LED1 (rot) | IO17 | D4 |
LED2 (grün) | IO16 | D5 |
LED3 (blau) | IO27 | D6 |
LED4 (gelb) | IO14 | D7 |
Schaltung ohne Rich Shield
Hier nun die Schaltung, wenn du das Rich Shield von Open Smart nicht hast, aber trotzdem dieses Tutorial nachprogrammieren möchtest.
Steuern der GPIO-Pins der LEDs
Ein GPIO Pin kann als Eingang und Ausgang dienen. Eine LED dient zur Ausgabe (in diesem Fall Licht) und daher wird der Pin als Pin.OUT definiert. Hätten wir einen Taster, wäre dieses dann Pin.IN.
Damit wir im Code eine kleine Pause einlegen können, müssen wir das Modul time implementieren. Dieses Modul bietet viele Funktionen, eine davon ist time.sleep(<Sekunden>) wobei als Parameter hier die Sekunden eingegeben werden. (Anders als wie bei der Arduino IDE mit dem Befehl delay welcher Millisekunden erwartet.)
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #anlegen einer Variable, #GPIO17, als Ausgang led1 = machine.Pin(17, machine.Pin.OUT) led1.value(1) #aktivieren des Pins time.sleep(1) #eine Pause von 1 Sekunde led1.value(0) #deaktivieren des Pins
Wenn wir den Code ausführen, dann wird die LED1 (rot) für 1 Sekunde aktiviert und danach wieder deaktiviert. Anschließen beendet sich das Programm von selber.
LED blinken lassen
Im Beitrag MicroPython mit ESP32: Grundlagen der Programmierung habe ich dir die Schleifen vorgestellt. Mit einer Schleife können wir jetzt die LED blinken lassen. Dabei können wir entweder diese für eine Anzahl x, Zeit x oder dauerhaft blinken lassen.
LED eine bestimmte Anzahl blinken lassen
Um eine LED eine bestimmte Anzahl blinken zu lassen, müssen wir mit einer For-Schleife lediglich von / bis Zählen. Im unten stehenden Code zähle ich von 1 bis 5, wobei ich hier die Laufvariable i nicht verwende.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #Wert für die Pause in der Schleife pause = 0.250 #anlegen einer Variable, #GPIO17, als Ausgang led1 = machine.Pin(17, machine.Pin.OUT) #eine Schleife von 1 bis 5 for i in range(1,6): led1.value(1) #aktivieren des Pins time.sleep(pause) #eine Pause led1.value(0) #deaktivieren des Pins time.sleep(pause) #eine Pause
In dem Video siehst du das die kleine rote 5 mm LED insgesamt 5-mal aufblinkt. Wenn wir die Range in der For-Schleife auf range(1,11) anpassen würden, dann würde diese 10-mal blinken.
LED eine bestimmte Zeit blinken lassen
Wenn wir die LEDs eine bestimmte Zeit blinken lassen wollen, dann benötigen zum einen den aktuellen Zeitstempel und die Dauer. Hier hilft uns einfache Mathematik und eine While-Schleife weiter.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #Wert für die Pause in der Schleife pause = 0.250 #anlegen einer Variable, #GPIO17, als Ausgang led1 = machine.Pin(17, machine.Pin.OUT) #aktuelle Millisekunden, seitdem das Programm #gestartet wurde currentTimestamp = time.ticks_ms() #die Dauer, wielange die LED blinken soll duration = 5000 #LED eine Zeit blinken lassen #Funktion ticks_ms() liefert bei jedem Aufruf, #die aktuellen Millisekunden, seitdem das Programm #gestartet wurde. while (time.ticks_ms() < (currentTimestamp + duration)): led1.value(1) #aktivieren des Pins time.sleep(pause) #eine Pause led1.value(0) #deaktivieren des Pins time.sleep(pause) #eine Pause
In dem Video lasse ich die LED 2 Sekunden lang blinken, bei einer Pause von jeweils 0,25 Sekunden sind das dann 4x.
LED dauerhaft blinken lassen
Um die LED dauerhaft blinken zu lassen, müssen wir unsere While-Schleife lediglich in eine Endlosschleife umstellen und als Prüfung ein True übergeben.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #Wert für die Pause in der Schleife pause = 0.250 #anlegen einer Variable, #GPIO17, als Ausgang led1 = machine.Pin(17, machine.Pin.OUT) #aktuelle Millisekunden, seitdem das Programm #gestartet wurde currentTimestamp = time.ticks_ms() #die Dauer, wielange die LED blinken soll duration = 5000 #starten der Endlosschleife while True: led1.value(1) #aktivieren des Pins time.sleep(pause) #eine Pause led1.value(0) #deaktivieren des Pins time.sleep(pause) #eine Pause
Lauflicht programmieren
Wenn wir nun die LEDs nacheinander aktivieren und wieder deaktivieren, dann können wir uns ein kleines Lauflicht erstellen.
Damit wir etwas weniger Schreibarbeit haben und auch der Code nicht zu lang wird, erzeuge ich mir zum setzen eines Status der LED eine zusätzliche Funktion.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #Wert für die Pause in der Schleife pause = 0.130 #anlegen einer Variable, #GPIO17, als Ausgang led1 = machine.Pin(17, machine.Pin.OUT) led2 = machine.Pin(16, machine.Pin.OUT) led3 = machine.Pin(27, machine.Pin.OUT) led4 = machine.Pin(14, machine.Pin.OUT) #Funktion zum setzen eines Status der LEDs def ledLightUp(led1Status, led2Status, led3Status, led4Status): led1.value(led1Status) led2.value(led2Status) led3.value(led3Status) led4.value(led4Status) time.sleep(pause) #einlegen einer Pause #starten der Endlosschleife while True: #aufrufen der Funktion ledLightUp #als Parameter wird der neue Status der LED übergben ledLightUp(1,0,0,0) #rote LED an ledLightUp(0,0,0,0) #alle LEDs aus ledLightUp(0,1,0,0) #grüne LED an ledLightUp(0,0,0,0) #alle LEDs aus ledLightUp(0,0,1,0) #blaue LED an ledLightUp(0,0,0,0) #alle LEDs aus ledLightUp(0,0,0,1) #gelbe LED an ledLightUp(0,0,0,0) #alle LEDs aus
Taster auslesen
Auf dem kleinen Shield finden wir noch zwei zusätzliche Taster, welche wir im Nachfolgenden nutzen möchten, um die LEDs zu aktivieren und auch verschiedene Programme starten möchten.
Taster | ESP32 D1 R32 | Arduino UNO R3 |
---|---|---|
K1 | IO12 | D8 |
K2 | IO13 | D9 |
Schaltung ohne Rich Shield
Hier die kleine Schaltung auf dem 400 Pin Breadboard.
Auslesen des Status der Taster
Für das Auslesen der Taster benötigen wir nun eine Endlosschleife, denn wenn wir unser Programm ohne starten würden, hätten wir keine Chance eine Tastaktion auszulesen / auszuwerten.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #anlegen der Variablen für die Taster #Taster K1 am GPIO12 k1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) #Taster K2 am GPIO13 k2 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) #Starten der Endlosschleife while True: #Wenn der Wert von Value gleich 0 / False ist, dann.. if not k1.value(): #Ausgeben der Textzeile auf der Kommandozeile print("Taster K1 gedrückt!") #eine kleine Pause einlegen damit der Taster entprellt wird time.sleep(0.25) if not k2.value(): print("Taster K2 gedrückt!") time.sleep(0.25)
Wenn wir einen der Taster betätigen, dann wird auf der Kommandozeile der Text “Taster Kn gedrückt!” ausgegeben. Zusätzlich legen wir danach eine kleine Pause von 0,25 Sekunden ein, diese Pause wird benötigt, um den Taster zu entprellen.
Aktivieren einer LED mit einem Taster
Jetzt können wir mit dem Wissen aus dem Abschnitt der LED und dem kleinen Beispiel zum Taster nun die LEDs steuern.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #anlegen der Variablen für die Taster #Taster K1 am GPIO12 k1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) #Taster K2 am GPIO13 k2 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) #LED1 (rot) led1 = machine.Pin(17, machine.Pin.OUT) #Starten der Endlosschleife while True: #Wenn der Taster K1 betätigt wird, dann #soll die rote LED1 aktiviert werden. if not k1.value(): led1.value(1) time.sleep(0.25) #Wenn der Taster K1 betätigt wird, dann #soll die rote LED1 deaktiviert werden. if not k2.value(): led1.value(0) time.sleep(0.25)
Wenn wir jetzt den Taster K1 betätigen, dann wird die LED1 (rot) aktiviert und beim Betätigen des Tasters K2 wieder deaktiviert.
Aktivieren und Deaktivieren einer LED mit nur einem Taster (Toggeln)
Wir können aber auch recht einfach mit nur einem Taster die LED aktivieren und auch deaktivieren, dazu prüfen wir den Status des Pins und wenn dieser aktiviert ist, dann deaktivieren wir diesen und umgekehrt.
#Modul für den Zugriff auf die GPIO Pins import machine #Modul für den Zugriff auf Funktionen #wie zum einlegen einer Pause im Code import time #anlegen der Variablen für die Taster #Taster K1 am GPIO12 k1 = machine.Pin(12, machine.Pin.IN, machine.Pin.PULL_UP) #Taster K2 am GPIO13 k2 = machine.Pin(13, machine.Pin.IN, machine.Pin.PULL_UP) #LED1 (rot) led1 = machine.Pin(17, machine.Pin.OUT) #LED2 (grün) led2 = machine.Pin(16, machine.Pin.OUT) #Starten der Endlosschleife while True: #Wenn der Taster K1 betätigt wird, dann #soll die rote LED1 aktiviert werden. if not k1.value(): #Wenn der aktuelle Status des Pins LOW / 0 ist, dann... if not led1.value(): #Pin auf HIGH / 1 setzen led1.value(1) else: #Wenn der Pin jedoch auf HIGH / 1 ist, dann... #Pin auf LOW / 0 setzen led1.value(0) time.sleep(0.25) #eine kleine Pause von 250 Millisekunden #Taster K2 kann nun eine weitere LED steuern if not k2.value(): #Wenn der aktuelle Status des Pins LOW / 0 ist, dann... if not led2.value(): #Pin auf HIGH / 1 setzen led2.value(1) else: #Wenn der Pin jedoch auf HIGH / 1 ist, dann... #Pin auf LOW / 0 setzen led2.value(0) time.sleep(0.25) #eine kleine Pause von 250 Millisekunden
Wir können nun mit den beiden Tastern die beiden roten und grünen LEDs steuern.
Fazit & Ausblick
Damit möchte ich diesen kleinen Beitrag schließen, im nächsten Beitrag möchte ich zeigen wie du den analogen Drehpotentiometer auslesen und die Werte auf die LEDs mappen kannst.