Vor wenigen Tagen hat Microsoft eine Erweiterung für seinen Editor Visual Studio Code veröffentlicht, mit dem man für das Arduino entwicklen kann.

Die Erweiterung ist Open Source (MIT-Lizenz) und kann im Marketplace gefunden werden.

Grund genug also, sich das mal genauer anzuschauen.

Warum?

Nun, ich fand Microsoft Visual Studio schon immer eine sehr schicke IDE.

Da ist man nach der Installation direkt startklar, hat einen Debugger an Board und durch die Autovervollständigung kommt man schnell ans Ziel und findet die gesuchte Methode.

Sowas für Arduino? Her damit!

Installation

Nachdem man Microsoft Visual Studio Code installiert hat, kann die Arduino Erweiterung einfach mit einem Klick über den Marketplace gesucht und installiert werden. Arduino Extension in Visual Studio Code installieren

Wichtig: Ihr benötigt mindestens die Arduino IDE in der Version 1.6.x auf eurem PC, welche NICHT über den Windows Store installiert wurde. Da gibt es dann wohl Probleme mit der Sandbox...

Des Weiteren habe ich das Ganze nur unter Windows 10 getestet.

Das erste Projekt

Ich habe noch nie was mit Visual Studio Code gemacht, also eventuell ist das total falsch, aber so bin ich ans Ziel gekommen...

  1. Datei => Order öffnen...
  2. Erstellt euch jetzt einen neuen Order, zum Beispiel "VSC_Test" und klick auf "Order auswählen"

Neues Arduino Projekt in Visual Studio Code erstellen Auf der linken Seite ist nun der Order geöffnet worden. Erstellt über das Icon "Neue Datei", eine Datei mit dem Namen "VSC_Test.ino"

In dieser neuen Datei könnt ihr nun die zwei standard Funktionen setup() und loop() erstellen

void setup(){

}

void loop(){

}

Das geht bestimmt auch irgendwie automatisch, ich weis nur (noch) nicht wie.

Wie auch immer. In der blauen Leiste am untern Bildschirmrand, könnt Ihr nun euer Arduino Board und den COM Port auswählen. Arduino Board und COM Port auswählen

Bei mir: Arduino Board und COM Port ausgewählt

Der erste Code

Über die Taste F1, könnt Ihr Befehle ausführen. Das kennt man ja bereits von anderen Editoren.

Wenn ihr einmal nach "Arduino" sucht, bekommt Ihr alle Befehle angezeigt und könnt zum Beispiel den "Board Manager" öffnen, euren Sketch Überprüfen (Verify) oder Flashen (Upload) Arduino Befehle in Visual Studio Code

Hat man sich an F1 gewöhnt, geht das alles sehr leicht von der Hand.

Autovervollständigung aktivieren/konfigurieren

Hier kommen wir zu dem Teil, der mich interessiert. Autovervollständigung, wir sind doch alle faul!

Natürlich muss Visual Studio Code dafür wissen, wo eure Arduino Dateien liegen.

In eurem Projekt sollte es einen Ordner .vscode, geben mit der Datei c_cpp_properties.json.

Wenn es dies bei euch nicht gibt: F1 => Verify, dabei werden die Dateien erstellt.

Arduino Autovervollständigung in Visual Studio Code konfigurieren

Ich habe nun einmal ganz stumpf das JSON bearbeitet, und den Order libraries meiner Arduino IDE hinzugefügt. Das geht bestimmt auch über die Oberfläche, aber ich hatte keine Lust zu suchen :)

Autovervollständigung ausprobiert

Wenn ich in meinem Quelltext jetzt einen include auf eine Header-Datei setzen möchte, wird diese automatisch vervollständigt: Arduino Autovervollständigung in Visual Studio Code für includes

Das Gleiche gilt natürlich auf für Methoden von Objekten: Arduino Autovervollständigung in Visual Studio Code von methoden

Soweit so gut. Wie sieht es mit eigenen Methoden, Objekten und Structs aus?

Im folgenden Beispiel habe ich einfach einen Counter gebaut, welcher jede Sekunde um eins erhöht wird und die Ausgabe auf den seriellen Monitor und ein LCD Display schreibt.

Ich habe hierfür nun ein struct overkill definiert, indem der Wert gespeichert wird, und die Methode counter gebaut, welche den Wert erhöht.

Das ist natürlich alles ziemlicher Blödsinn für ein einfaches i++, aber ich möchte ja wissen, wie gut ich dabei unterstützt werden. Und siehe da, es werden alle Parameter rightig angezeigt und vervollständigt: Arduino Autovervollständigung in Visual Studio Code von eigenen Methoden und Structs

Serieller Monitor

Für Debugging und Co benötigt man bei einem Arduino auf jeden Fall den Seriellen Monitor.

In Visual Studio Code erreicht man diesen über die blaue Leiste (Stecker Symbol) Arduino seriellern Monitor öffnen

Der serielle Monitor öffnet sich nicht in einem eigenen Fenster, sondern, ähnlich wie die Developer Tools im Browser, einfach als eine Leiste, was ich sehr praktisch finde. Arduino Serieller Monitor in Visual Studio Code Das automatisch Scrollen kann man über das Schloss oben Rechts deaktivieren.

Über F1 => Send Text to Serial Port kann man einen String an das Arduino schicken Seriellen Text an das Arduino schicken in Visual Studio Code

Code Upload

Der Upload erfolgt wieder über F1 => Upload. Dabei bekommt man die bekannten Ausgaben, bei mir mit kaputten Umlauten?! Arduino Upload Code via Visual Studio Code

Fehler finden

Leider finde ich die Ausgabe, wenn man eine Methode aufruft, die es nicht gibt, nicht so gelungen.

In der Arduino IDE wird dann die ganze Zeile rot unterlegt, dass man den Fehler schnell sieht.

In Visual Studio Code dageben, wird lediglich eine Info in der Konsole angezeigt. Unbekannte Methode in Arduino IDE und Visual Studio Code Eventuell kann man das aber irgendwo umstellen, wie gesagt habe Visual Studio Code noch nicht benutzt.

Fazit

Alles in allem bin ich mit Visual Studio Code zufrieden. Ich stehe auf die Autovervollständigung und im Gegensatz zur Arduino IDE werden if-Blöcke, Schleifen und Methoden nicht so creepy eingerückt, was ich dann immer manuell reparieren muss. Hier mal ein Beispiel: Arduino IDE code indent vs Visual Studio Code

Ich werde VS-Code auf jeden Fall weiter testen!

Zum Testen

Für alle die es interessiert. Diesen Code hatte ich zum Testen gebaut:

#include <LiquidCrystal.h>
#include <TimerOne.h>

int triggerTimer = 0;
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

struct overkill {
    unsigned int value;
};

struct overkill counterValue;

void setup(){
    Serial.begin(9600);
    lcd.begin(16, 2);
    lcd.setCursor(0, 0);
    lcd.print("Aktueller Wert: ");
    Timer1.initialize(5*1000000);
    Timer1.attachInterrupt(handleTimer);
    overkill counterValue;
}

void loop(){
    counter(&counterValue);
    Serial.println(counterValue.value);
    lcd.setCursor(0, 1);
    lcd.print(counterValue.value);

    if(triggerTimer == 1){
        lcd.setCursor(0, 1);
        lcd.print("Timer wurde aufgerufen!");
        triggerTimer = 0;
    }

    if(Serial.available() > 0){
        Serial.print("Serielle Eingabe: ");
        Serial.println(Serial.readString());
    }

    delay(1000);
}

overkill getCounter(){
    struct overkill counter;
    counter.value = 0;
    return counter;
}

void counter(overkill* counter){
    counter->value++;
}

void handleTimer(){
    triggerTimer = 1;
}