In diesem Beitrag möchte ich dir die Grundlagen zur Programmierung in MicroPython anhand des ESP32 D1 R32 näher bringen. Du kannst dieses jedoch auch sehr einfach auf andere Mikrocontroller anwenden, welche ebenso mit MicroPython arbeiten.
Im letzten Beitrag MicroPython mit ESP32: Einführung in den ESP32 D1 R32 habe ich dir bereits den Mikrocontroller ESP32 D1 R32 vorgestellt und aufgezeigt wie dieser für MicroPython geflasht wird.
Inhaltsverzeichnis
- MicroPython vs. Python
- Aufbau des Quellcodes in MicroPython
- Kommentare
- Ausgaben auf der Kommandozeile
- Erzeugen von Variablen
- Schleifen
- If-Statements
- Ausblick
MicroPython vs. Python
MicroPython ist eine vollständige Implementierung der Programmiersprache Python 3, die direkt auf eingebetteter Hardware wie dem ESP32 D1 R32 oder dem Raspberry Pi Pico läuft. Während beide Sprachen auf der gleichen Grundlage basieren, gibt es einige wesentliche Unterschiede und Anpassungen, die MicroPython besonders für den Einsatz in Mikrocontrollern geeignet machen:
- Interaktive Eingabeaufforderung (REPL): MicroPython bietet eine interaktive Eingabeaufforderung (REPL – Read-Eval-Print Loop), die es ermöglicht, Befehle sofort über USB-Serial auszuführen. Dies ist besonders nützlich für schnelles Testen und Debuggen von Code auf der Hardware.
- Eingebautes Dateisystem: MicroPython beinhaltet ein eingebautes Dateisystem, das auf dem Flash-Speicher des Mikrocontrollers gespeichert wird. Dies ermöglicht das Speichern und Verwalten von Skripten und Daten direkt auf dem Gerät.
- Modulspezifischer Zugriff auf Hardware: Der ESP32-Port von MicroPython umfasst spezielle Module, die den Zugriff auf hardware-spezifische Funktionen des Chips ermöglichen. Dazu gehören beispielsweise GPIO-Steuerung, PWM, I2C, SPI und andere Peripheriegeräte.
- Ressourceneffizienz: MicroPython ist so konzipiert, dass es auf ressourcenbeschränkten Geräten läuft. Es verwendet weniger Speicher und Rechenleistung im Vergleich zu einer vollständigen Python-Implementierung auf einem Desktop-Computer.
- Bibliotheken und Module: MicroPython enthält eine Auswahl an Standardbibliotheken und modulspezifischen Bibliotheken, die für die Entwicklung von Embedded-Anwendungen nützlich sind. Während einige Bibliotheken aus der Standard-Python-Bibliothek fehlen, gibt es spezielle Bibliotheken, die für die Arbeit mit Mikrocontrollern optimiert sind.
Diese Unterschiede machen MicroPython zu einer idealen Wahl für die Programmierung von Mikrocontrollern wie dem ESP32 D1 R32, da es die Leistungsfähigkeit und Einfachheit von Python mit der Effizienz und Funktionalität für Embedded-Systeme kombiniert.
Aufbau des Quellcodes in MicroPython
In MicroPython gibt es keine Klammern für das Zusammenfassen von Codeblöcken, du musst hier mit Einrückungen arbeiten. Du kannst hier wählen zwischen Leerschritte und Tabulatoren. Jedoch wenn du dich einmal auf eine Art festgelegt hast, dann musst du diese weiterverwenden!
Solltest du also nachfolgende Fehlermeldung erhalten, so prüfe zuerst die Anzahl der Leerschritte / Tabs vor deinen Codeblöcken.
Traceback (most recent call last):
File "<stdin>", line 1
IndentationError: unexpected indent
Kommentare
Mit Kommentaren kannst du Text in deinen Quellcode einfügen, welcher keinen Einfluss auf das Verhalten des Codes hat. Kommentare werden meist verwendet, um komplizierten Code zu beschreiben oder für andere Entwickler einen leichteren Einstieg in den Quellcode zu schaffen.
Auch kannst du Code auskommentieren, um die Funktion / den Codeblock zu überspringen.
Du kannst einzelne Zeilen mit einem „#“ Symbol auskommentieren und wenn du einen mehrzeiligen Kommentar erstellen möchtest, dann leitest du diesen mit drei doppelte Anführungszeichen ein und beendest dieses auch damit.
# Hier steht ein einzeiliger Kommentar """ Hier können mehrere Zeilen gleichzeig auskommentiert werden """
Wenn du eine Entwicklungsumgebung verwendest, dann werden Kommentare immer speziell angezeigt, sodass diese sich vom eigentlichen Quellcode abheben.
Du kannst auch hinter dem Quellcode Kommentare setzen und so platzsparend Informationen hinterlassen.
Ausgaben auf der Kommandozeile
Zur Fehlersuche und für die Ausgabe von Sensordaten können wir den einfachen aber trotzdem mächtigen Befehl „print“ nutzen.
Diesem Befehl können wir einfach einen Text übergeben, welcher dann auf der Kommandozeile ausgegeben wird.
print("Hallo Welt!") print("Test")
In der Kommandozeile siehst du die Ausgabe der beiden Texte, welche jeweils durch einen Zeilenumbruch getrennt sind.
Du kannst diesem Befehl jedoch auch mehrere Werte übergeben, dazu trennst du diese mit einem Komma.
print("Hallo Welt!", "Test")
Die Werte werden mit einem Komma getrennt und auf der Kommandozeile hintereinander (getrennt durch ein Leerzeichen) ausgegeben.
Wenn du statt einem Leerzeichen ein anderes verwenden möchtest, dann kannst du diesen Separator mithilfe des optionalen Parameters „sep=“ benennen.
print("Hallo Welt!", "Test", sep="|")
In diesem Fall verwende ich zum Trennen der Werte einen geraden Strich. Du kannst auch beliebig andere Symbole, Buchstaben oder Zahlen verwenden.
Erzeugen von Variablen
In MicroPython bzw. Python gibt es keine Datentypen. Das heißt für uns, wir legen neue Variablen an, indem wir einfach einen Namen für unsere neue Variable schreiben, gefolgt von einem Wert.
Dabei kannst du diesen Wert auch jederzeit mit einem anderen Wert / Datentyp beliebig überschreiben.
Du kannst mit den bereits bekannten mathematischen Operatoren Zahlen Addieren, Subtrahieren usw. und natürlich mit dem Befehl print diesen Wert ausgeben.
Verketten von Texten
Wenn du Texte verketten / verbinden möchtest, dann verwendest du das + Symbol. Das funktioniert für Texte sehr einfach.
text1 = "Text1" text2 = "Text2" print(text1+text2)
Wenn wir jedoch einen Text und eine Zahl verbinden möchten, dann können wir dieses nicht so einfach machen.
text1 = "Text1" zahl1 = 2 print(text1+zahl1)
Der Code erzeugt die nebenstehende Fehlermeldung. Diese besagt, dass String & Int nicht mit der Funktion add zusammengefügt werden können.
Traceback (most recent call last):
File „“, line 3, in
TypeError: unsupported types for add: ’str‘, ‚int‘
Wir müssen also zunächst die Zahl in einen String umwandeln. Um die Zahl 1 umzuwandeln, können wir nun einfach jeweils ein doppeltes Anführungszeichen am Anfang und Ende hinzufügen, oder wir nutzen die Funktion „str“.
text1 = "Text1" zahl1 = 2 print(text1+str(zahl1))
Die Funktion str erwartet einen Zahlenwert (Ganzzahl oder Gleitkommazahl) und wandelt diese in einen Text um und gibt diesen zurück.
Das kannst du zum Beispiel verwenden, wenn du einen Sensorwert auf einem Display mit dem zugehörigen Symbol dahinter anzeigen möchtest.
Schleifen
Wenn du Codeblöcke in einer bestimmten Anzahl wiederholen möchtest, oder dauerhaft wiederholen möchtest, dann benötigst du eine Schleife.
For-Schleifen
Um einen Block 5-mal zu wiederholen, können wir eine For-Schleife verwenden.
for i in range(5): print("i ist:", i)
Du kannst den Index i innerhalb der For-Schleife verwenden und auf diesen reagieren.
Die Funktion range liefert dir eine Liste von Zahlen, von 0 bis 4 (insgesamt 5). Wenn du die Zahlenfolge 1 bis 6 möchtest, kannst du dieser Funktion wie folgt anpassen.
for i in range(1, 6): print("i ist:", i)
While-Schleife
Eine While-Schleife wird verwendet, um einen Ausdruck zu prüfen, um diese innerhalb der Schleife abzubrechen.
zahl = 5 while(zahl > 0): print(zahl) zahl -=1
Innerhalb der While-Schleife wird die Variable zahl um 1 verringert und im Kopf der Schleife wird geprüft, ob dieser Wert größer 0 ist. Sobald der Wert der Variable zahl den Wert 0 erreicht, wird die Schleife abgebrochen.
Endlosschleife
Mit der While-Schleife kannst du eine Endlosschleife starten, dazu übergibst du dieser lediglich ein True.
while True: print("Hallo Welt!")
Dieser kleine Code bewirkt nun, dass auf der Kommandozeile der Text „Hallo Welt!“ fortlaufend ausgegeben wird.
Abbrechen einer Schleife
Wenn du innerhalb der Schleife diese abbrechen möchtest, dann verwendest du den Befehl break. Mit diesem Aufruf wird dann sofort die Schleife verlassen und der nachfolgende Code ausgeführt (soweit vorhanden).
while True: print("Hallo Welt!") break
In diesem Beispiel startet die Endlosschleife, gibt den Text „Hallo Welt!“ aus und sofort danach wird diese abgebrochen.
Natürlich ergibt dieser Code wenig Sinn, jedoch mit einem später vorgestellten If-Statement wird etwas mehr Funktion geschaffen.
Überspringen einer Ausführung innerhalb einer Schleife
Wenn du die Schleife nicht abbrechen möchtest, sondern nur die Ausführung der Schleife überspringen möchtest, dann verwendest du den Befehl continue. Damit wird wieder zum Kopf gesprungen und von vorne gestartet.
for i in range(1,6): if i == 2: continue print(i)
In der Ausgabe siehst du das die Zahl 2 übersprungen wurde, das liegt daran das wir im Code prüfen ob der aktuelle Index gleich 2 ist und wenn dieses so ist, soll die Ausführung an dieser Stelle abgebrochen werden.
Anders als bei break wird die Schleife jedoch fortgeführt.
If-Statements
Mit If-Statements kannst du innerhalb deines Quellcodes bedingten Code erzeugen. Du prüfst innerhalb des Statements einen Ausdruck welcher einen Wahrheitswert hat True/False 1/0.
test = True if test: print("Der Wert von test ist Wahr!")
Man muss bei boolschen Werten nicht unbedingt mit einem doppelten Gleichheitszeichen prüfen, hier reicht es aus den Wert hineinzuschreiben.
if test == True: #oder if test:
Genaus kann man auch prüfen ob ein Wert Falsch ist.
if test == False: #oder if !test:
Zahlenwerte kannst du mit den nachfolgenden Symbolen prüfen:
- prüfen ob ein Wert größer ist >
- prüfen ob ein Wert größer gleich ist >=
- prüfen ob ein Wert kleiner ist <
- prüfen ob ein Wert kleiner gleich ist <=
- prüfen ob ein Wert ungleich ist !=
- prüfen ob ein Wert gleich ist ==
Abzweigungen mit Else
Mit dem zusätzlichen Befehl else und else if können wir für das geschriebene If-Statement eine weitere Prüfung hinzufügen. Im Fall wenn eine boolsche Variable geprüft wird, gibt es nur zwei fälle Wahr oder Falsch, jedoch bei Zahlenwerten können wir auch prüfen ob die Werte größer, kleiner und gleich und ungleich sind.
test = 1 if test > 0: print("Der Wert von test ist größer 0") else: print("Der Wert von test ist kleiner 1")
Im rechten Beispiel wird die Variable test geprüft ob die größer 0 ist. Wenn dieses nicht so ist (also der Wert ist kleiner 1) dann wird der Text „Der Wert von test ist kleiner 1“ ausgegeben.
weitere Prüfungen mit elif
Wenn du weitere Prüfungen hinzufügen möchtest dann kannst du dieses mit elif machen, jedoch musst du bedenken das wenn einmal ein Statement zu einer Ausführung geführt hat die anderen Prüfungen nicht ausgeführt / geprüft werden!
test = 17 if test > 0 and test < 10: print("Der Wert von test ist zwischen 1 und 9.") elif test >= 10 and test < 20: print("Der Wert von test ist zwischen 10 und 19.") elif test >= 20: print("Der Wert von test ist größer gleich 20.")
In diesem Beispiel wird geprüft ob sich der Wert der Variable test zwischen bestimmten Werten befindet oder größer gleich 20 ist.
Ausblick
Mit diesem Beitrag habe ich dir nun einen Überblick über die Programmiersprache MicroPython anhand von Beispielen gegeben. Jedoch ist dieses nur der „normale“ Funktionsumfang, bei Mikrocontroller wird es schon etwas spezieller denn hier können wir Schnittstellen, GPIO Pins etc. ansteuern und somit Sensoren / Aktoren bedienen.
Wie du die GPIOs ansteuern kannst zeige ich dir im nächsten Beitrag anhand von einfachen LEDs, Taster usw.
1 thought on “MicroPython mit ESP32: Grundlagen der Programmierung”