Arduino in VS Code programmieren – Mit PlatformIO klappt’s

  • Lesedauer:15 min Lesezeit

Hier zeige ich euch, wie ihr für euren Arduino in VS Code (Visual Studio Code) programmiert. Wer anfängt einen Arduino zu programmieren, der macht das in der Regel in der Arduino IDE. Da spricht am Anfang auch nichts gegen. Wenn die Projekte aber größer werden, oder man etwas Refactoring betreiben möchte, dann stößt die IDE schnell an ihre Grenzen.

Aber zum Glück gibt es Abhilfe! Mit platformio können wir auch in VS Code für den Arduino programmieren. Wie das funktioniert und was man damit so machen kann zeige ich euch hier.

VS Code einrichten

Um in VS Code zu starten braucht es nicht viel. Ihr installiert einfach die Extension PlatformIO IDE.

PlatformIO Extension in VS Code

Wenn ihr die Extension installiert habt erscheint unten in VS Code ein kleines Häuschen für die platformio Home Seite.

Home Icon für PlaformIO in VS Code

Drückt ihr auf das Häuschen kommt ihr zur PlatformIO Home Seite, auf der ihr alles Nötige tun könnt. Ihr könnt hier z. B. ein neues Projekt starten, oder Bibliotheken installieren. Zur Navigation sind an der linken Seite alle Punkte aufgelistet.

PlatformIO Home Seite in VS Code

Platformio Arduino in VS Code nutzen

Jetzt zeige ich euch ein paar grundlegende Funktionen, mit denen ihr schon vollständig in VS Code arbeiten könnt.

Ein Projekt erstellen

Zuerst erstellen wir ein Projekt. Dazu klicken wir im PlatformIO Home im Quick Access auf „New Project“, oder navigieren zum Reiter „Projects“ und klicken da auf „Create New Project“.

Neues PlatformIO Projekt in VS Code erstellen

Nach dem Klick öffnet sich der „Project Wizard“. In dem geben wir dem Projekt einen Namen und wählen ein Board und Framework aus.

Platformio Project Wizard beim Erstellen eines neuen Projekts in VS Code

Ich habe hier einen ESP8266 gewählt und als Framework nutze ich Arduino. Wenn ihr den Haken bei Location entfernt, könnt ihr noch einen eigenen Speicherort auswählen. Nach dem Klick auf „Finish“ dauert es ein paar Sekunden und danach wird das Projekt im Explorer angezeigt:

PlatformIO Projekt nach dem Erstellen

Wie ihr seht hat PlatformIO für uns eine Ordnerstruktur angelegt und auch gleich eine .gitignore erstellt. Zusätzlich gibt es die Datei platformio.ini in der wir später noch Einstellungen für das Projekt vornehmen.

Projekt Struktur

PlatformIO strukturiert euch das Projekt in vier sinnvolle Ordner. Im Ordner src liegt der Source Code. In die main.cpp kann direkt der Code aus der Arduino IDE kopiert werden und das Projekt sollte lauffähig sein.

Im lib Ordner könnt ihr eure Bibliotheken hinterlegen, die ihr für dieses Projekt erstellt. PlatformIO findet diese anschließend automatisch, sodass ihr sie durch einen einfachen #include <myLib.h> Befehl verwenden könnt.

Der Ordner include ist für Header Files gedacht. Hier lege ich z. B. ein File mit Konstanten, die ich im Projekt benötige ab. Die header Files könnt ihr im Code dann einfach durch #include "myHeader.h" einbinden.

Dann gibt es noch den test Ordner. Hier ist Platz für die Tests zu eurem Code. Und wie wir heutzutage wissen, sollten wir Code immer testen! Weitere Infos zu den Tests mit PlatformIO findet ihr direkt bei PlatformIO.

Zuletzt gibt es noch die Ordner .pio und .vscode. In diesen verstecken sich z.B. Build Files, Dependencies und Einstellungen. In der Regel braucht ihr in diesen Ordnern nichts tun.

Den Arduino Code in VS Code Hochladen

Jetzt kommen wir zum Wesentlichen. Code einfach schreiben können wir in VS Code auch ohne PlatformIO. Aber wir wollen den Code ja auch noch kompilieren und auf die Hardware bringen.

Das geht entweder über die Kommandozeile, oder durch die Buttons, die PlatformIO mitbringt:

PlatformIO Buttons in VS Code

Das Häuschen kennen wir nun schon.

Das Häkchen kompiliert den Code. Es entspricht dem Befehl platformio run.

Der Pfeil kompiliert und läd anschließend hoch (auf die Hardware). Alternativ könnt ihr in der Konsole platformio run --target upload ausführen.

Mit der Mülltonne könnt ihr alte build Files löschen, das Projekt „cleanen“. Sie führt den Befehl platformio run --target clean aus.

Daneben kommt noch der Stecker. Er öffnet den Seriellen Monitor. Entsprechender Befehl: platformio device monitor.

Das letzte Icon öffnet eine PlatformIO Konsole. In der könnt ihr die vorher genannten Befehle ausführen.

Um also den Code auf den Arduino zu laden drücken wir einfach den Pfeil. Ist nur ein Arduino angeschlossen findet PlatformIO den Port und läd den kompilierten Code hoch.

Habt ihr mehrere Arduinos angeschlossen, kann die automatische Auswahl schon mal schief gehen. Das lässt sich aber leicht lösen, indem ihr in der platformio.ini definiert, welcher Port verwendet werden soll. Dazu einfach eine Zeile mit dem Port hinzufügen, z. B. für den Port COM6:

upload_port = COM6

OTA Upload

PlatformIO bietet auch die Möglichkeit den Code Over the Air hochzuladen. Das geht wie üblich über das CLI, aber auch über die GUI in Kombination mit der platformio.ini. In der könnt ihr nämlich so einiges einstellen. Um z. B. beim ESP8266 ein OTA-Update durchzuführen fügt ihr folgende Zeilen in die Datei ein:

upload_protocol = espota
upload_port = 192.168.4.102

In diesem Fall wird über das espota Protokoll an den Arduino gesendet, der im gleichen WLAN hängt und die IP 192.168.4.102 hat.

Bibliotheken installieren

Üblicherweise nutzen wir die ein oder andere externe Bibliothek in unseren Projekten. Hier bietet PlatformIO einige Möglichkeiten, um diese einzubinden.

Aus PIO Home

Am einfachsten ist es ein offizielles Release einer Bibliothek im Libraries Reiter im PIO Home Home Icon für PlaformIO in VS Code zu installieren. Einfach bei Registry nach der gewünschten Lib suchen und sie in der Liste der Ergebnisse auswählen.

PlatformIO Library Suche in VS Code

Nach dem Auswählen seht ihr die Details zur gewählten Bibliothek. Hier wählt ihr die gewünschte Version aus und dann klickt ihr auf „Add to Project“.

PlatformIO Bibliothek zum Projekt hinzufügen

Dann erscheint ein Wizard in dem ihr auswählt für welches Projekt ihr die Bibliothek installieren wollt. Die Bibliothek ist danach nicht global verfügbar, sondern in dem Projekt, für das ihr sie hinzugefügt habt.

PlatformIO add Dependency Wizard

Nachdem ihr auf „Add“ gedrückt habt wird die Bibliothek heruntergeladen und eurem Projekt hinzugefügt. Das seht ihr daran, dass in der platformio.ini eine neue Zeile für die Dependency auftaucht: lib_deps = me-no-dev/ESPAsyncTCP@^1.2.2.

Damit ist die Library für eurer Projekt installiert und ihr könnt sie innerhalb des Projektes verwenden.

Eine globale Installation über die GUI scheint nicht mehr möglich zu sein, es geht aber weiterhin über das CLI, falls ihr denn tatsächlich global installieren wollt. Das würde für die gewählte Lib dann so aussehen:

platformio lib -g install ESPAsyncTCP

Aus lokaler Datei

Die Bibliotheken könnt ihr auch aus lokalen Dateien installieren. Dafür verwendet ihr das CLI. Bei der Angabe des Pfades müsst ihr file:// voran stellen, dann funktioniert auch alles.

platformio lib install file:///local/path/to/the/libfolder

Es gibt noch jede Menge weitere Optionen. Ihr könnt zum Beispiel bestimmen, wo die Lib hin installiert werden soll. Dazu wird einfach das storage-dir definiert:

platformio lib --storage-dir /my/storage/dir install ESPAsyncTCP

Von Github

Sehr cool ist, dass ihr die Libs auch direkt von Github installieren könnt. Der Befehl sieht wie folgt aus und lässt sich natürlich wieder mit allen Optionen kombinieren. Die einfachste Möglichkeit sieht so aus:

platformio lib -g install https://github.com/LowPowerLab/RFM69.git

Ihr könnt aber auch angeben, welchen Commit ihr installieren wollt, welche Branch gewählt werden soll und vieles mehr. Alle Optionen dazu findet ihr in der offiziellen Dokumentation.

Weitere Shared Code Möglichkeiten

Eine weitere Möglichkeit möchte ich noch ansprechen. In meinem Shot Clock Projekt habe ich mehrere Komponenten, die sich Code teilen. Der Code ist aber spezifisch für dieses Projekt. Daher soll er mit im git Repo liegen. Damit der Code auf jedem Rechner, auf dem ich das Repo lade gefunden wird brauche ich einen relativen Pfad. Auch dafür bietet PlatformIO eine Möglichkeit.

Die Struktur im Projekt sieht wie folgt aus:

Ordner Struktur des Shot Clock Projektes

Jeder Ordner ist ein eigenes PlatformIO Projekt. Der lib Ordner beinhaltet den geteilten Code. Um diesen in den Projekten einzubinden können wir in den platformio.ini’s der einzelnen Projekte weitere Ordner einbinden, in denen PlatformIO nach Libraries sucht:

lib_extra_dirs = ${PROJECT_DIR}\..\lib

Außerdem gibt es Variablen, wie in diesem Fall das PROJECT_DIR, sodass wir von da aus relativ in den lib ordner navigieren können. Und so einfach teilen wir Code zwischen mehreren Projekten in einem „großen“ Projekt.

Mit diesen Infos dürfte nun jeder in der Lage sein mit PlatformIO einen Arduino in VS Code zu programmieren.Als Beispiel könnt ihr euch mein HackMeLamp Projekt auf GitHub ansehen.

Dieser Beitrag hat 6 Kommentare

  1. Jürgen Beckamp

    Danke für den Blog,
    ich bin neu mit Platformio angefangen.
    Zwei Tage habe ich nun mit BME280 am ESP32 verbracht. (Unter Arduino läuft die Schaltung)
    #include bringt einen Fehler der auf einen Path-Fehler … C/C++(1696) hinweist.
    Im .pio/lipdeps ist es installiert.
    Den Path neu suchen lassen oder .vscode zu löschen, Zusatzprogramme zu löschen und mindestens fünf Versuche neue Projekte anzulegen Neuinstalltion usw. alles hat nicht geholfen.
    Dein Hinweis dass, das generelle installierten von Libs nicht mehr über eine Schaltfläche geht, war schon gut.
    Beim Versuch dann (paralell zu Deinem Text) noch einen Versuch zu wagen, bin ich (mehr zufällig) auf
    lib_deps = sparkfun/SparkFun BME280@^2.0.8
    gestoßen und ab hier ging alles.
    Ob es an der Lib von Adafruit (BME280) selber liegt, in der der ESP32 als Board auch nicht angegeben ist (unter Arduino am ESP32 aber läuft).
    Oder ich doch durch viele Fehlversuche meine Installation verwurschtelt habe, will ich heute mal nicht wissen 😉
    Nächster Versuch Adafruit NeoPixel, geht dann auf Anhieb… nur eben der Adafruit BME280 geht immer noch nicht, und mit dem habe ich angefangen zu üben.
    Also nehem ich jetzt Sparfunk und Adafruit und versuche weiter mein Glück.
    Dein Block, mit den Infos zur aktuellen platformio, hat mich auf den Weg der Lösung gebracht.
    Dafür Danke.
    Jürgen

    1. Hendrik

      Hallo Jürgen,
      freut mich sehr, dass der Artikel dir ein bisschen weiter helfen konnte
      Bei mir tritt auch gelegentlich der von dir beschriebene Fehler auf, obwohl alles korrekt eingebunden ist. Das ist dann aber immer eher ein Anzeigefehler der IDE, da ich trotzdem kompilieren kann. Nach dem Kompilieren ist der Fehler dann auch oft wieder weg.
      Viele Grüße
      Hendrik

  2. Michael Hallmann

    … „Im lib Ordner könnt ihr eure Bibliotheken hinterlegen, die ihr für dieses Projekt erstellt.“

    Diesen Satz verstehe ich nicht:
    Entweder erstellt das Projekt eine Bibliothek, also ich erzeuge mit meinem Quellcode diese Bibliothek oder
    ich möchte Bibliotheken nutzen, die ich aus anderen Quellen (Arduino-Framework) beziehe. Dann HINTERLEGE ich diese in lib.

    Beides gleichzeitig (hinterlegen und erzeugen) ist für mein Verständnis wiedersinnig.
    Also Frage ich mich: Muss ich unter „lib“ die benötigten Fremdbibliotheken hinterlegen?

    Meinen Dank für die Aufklärung und meinen Dank für diese Infoseite und die Mühe.

    1. Hendrik

      Hallo Michael,
      das habe ich wohl etwas unverständlich ausgedrückt.
      Um zuerst die Frage zu klären:
      In den lib Ordner kommen keine Fremdbibliotheken. Die Fremdbibliotheken werden in der platformio.ini definiert und landen dann im .pio Ordner.
      Die „Bibliotheken“, die ich hier meine sind tatsächlich eigener Quellcode. Ich Lege in dem Ordner alle Klassen des Projekts ab, die nicht mit in der main.cpp wohnen. Zum Teil nutze ich hier auch eigene Bibliotheken, die ich in anderen Projekten geschrieben habe, die aber noch nicht öffentlich zugänglich und damit nicht über die platformio.ini anziehbar sind.
      Ein Beispiel findest du hier in meinem Repo zur HackMeLamp: https://github.com/devdrik/hackmelamp/tree/main/code
      Die eigenen Libs vereinfachen den main code. Der WiFiHandler zum Beispiel kommt aus einem anderen Projekt und ich verwende ihn hier nur wieder.
      Ich hoffe das klärt einigermaßen, was ich damit gemeint habe.

Schreibe einen Kommentar