PlatformIO transforme VS Code en un IDE très robuste pour les microcontrôleurs comme l’ESP32. Il offre une meilleure gestion des librairies, une auto-complétion du code plus intelligente, des outils de débogage avancés, et une intégration facile avec Git. Il est plus adapté aux projets de plus grande envergure que l’IDE Arduino classique.

 

 

Comment ? Installez VS Code, puis installez l’extension PlatformIO IDE depuis le marketplace de VS Code. 

1. Créer un nouveau projet PlatformIO

 

Contrairement à l’IDE Arduino où vous ouvrez directement un fichier .ino, PlatformIO fonctionne avec des projets.

  • Ouvrez VS Code.

  • Cliquez sur l’icône PlatformIO dans la barre d’activités (généralement sur le côté gauche, c’est une icône en forme de tête d’alien ou d’un insecte).

  • Dans la vue PlatformIO Home (Accueil), cliquez sur “New Project” (Nouveau projet).

  • Dans la fenêtre de dialogue :

    • Name (Nom) : Donnez un nom à votre projet (par exemple, PLK-MAPS-HID).

    • Board (Carte) : Commencez à taper ESP32 DevKitC et sélectionnez le modèle exact de votre carte (par exemple, “ESP32 Dev Module” ou “ESP32 DevKitC”).

    • Framework : Choisissez Arduino.

    • Cliquez sur “Finish” (Terminer).

PlatformIO va créer un nouveau dossier de projet avec une structure de base.

 

1b. Ajoutez git a votre dossier de projet

Installez Git et initalisez le pour votre dossier. Créez une interface pour celui-ci via


 

2. Comprendre la structure du projet PlatformIO

 

Une fois le projet créé, vous verrez une structure de dossiers différente de l’IDE Arduino :

PLK-MAPS-HID/
├── .pio/               (Dossier de PlatformIO - ignoré par Git)
├── .vscode/            (Dossier de configuration de VS Code - ignoré par Git)
├── include/            (Pour vos fichiers d'en-tête .h personnalisés)
├── lib/                (Pour les bibliothèques privées ou modifiées)
├── src/                (Votre code source principal va ici)
│   └── main.cpp        (C'est l'équivalent de votre .ino, renommez-le si vous voulez)
├── test/               (Pour les tests unitaires - ignoré par Git)
├── platformio.ini      (Fichier de configuration principal de PlatformIO)
└── .gitignore          (Fichier de Git pour ignorer certains éléments - à modifier !)

 

  • src/main.cpp : C’est ici que vous copierez le contenu de votre fichier .ino. Vous pouvez le renommer en PLK_MAPS_HID.cpp si vous préférez, mais main.cpp est la convention.

  • platformio.ini : Ce fichier est très important. Il contient toutes les configurations de votre projet (carte, framework, bibliothèques, etc.).


 

3. Configurer platformio.ini et les bibliothèques

 

Vous devrez ajouter les dépendances de vos bibliothèques (WiFi, WebServer, BLEMidi) dans ce fichier.

Ini, TOML

; platformio.ini
[env:esp32dev]
platform = espressif32
board = esp32dev ; Assurez-vous que c'est le bon nom de carte que vous avez sélectionné
framework = arduino
monitor_speed = 115200

; Ajoutez vos bibliothèques ici par leur nom ou leur ID PlatformIO
lib_deps =
    WiFi
    WebServer
    BLEMidi ; Assurez-vous que c'est le nom exact de la bibliothèque que vous utilisez
    LittleFS ; Si vous utilisez le système de fichiers pour le HTML

 

  • Remplacez esp32dev par le nom exact de votre carte si différent.

  • lib_deps : PlatformIO téléchargera et gérera ces bibliothèques pour vous. Plus besoin de “Gérer les bibliothèques” manuellement dans l’IDE Arduino.


 

4. Intégrer votre code et le dossier data/

 

  1. Copiez votre code actuel (celui qui fonctionne avec le Wi-Fi et le serveur web) dans src/main.cpp (ou votre nouveau nom de fichier).

  2. Créez le dossier data/ au même niveau que src/ (à la racine de votre projet PLK-MAPS-HID/).

  3. Placez vos fichiers HTML/CSS/JS (index.html, etc.) dans ce dossier data/.


 

5. Téléverser le code et les données

 

PlatformIO a des boutons dédiés pour la compilation et le téléversement (les icônes de coche et de flèche dans la barre d’état en bas, ou via la vue PlatformIO).

  • Build (Construire) : La coche (ou platformio run -t build dans le terminal).

  • Upload (Téléverser) : La flèche vers la droite (ou platformio run -t upload).

  • Upload Filesystem Image (Téléverser l’image du système de fichiers) : C’est très important pour votre dossier data/. Dans la vue PlatformIO > Project Tasks (Tâches du projet) > Votre carte (par exemple esp32dev) > “Upload Filesystem Image”.

C’est un peu un changement par rapport à l’IDE Arduino, mais la structure est beaucoup plus robuste pour un projet comme le vôtre. Prenez votre temps pour vous familiariser avec PlatformIO.

 

 

Le point 1 est lancé, c’est long.

A propos du point 2, est-ce que git est installé automatiquement dans mon dossier par platform IO?

 

 

Non, PlatformIO n’installe pas Git automatiquement dans votre dossier de projet. PlatformIO est un environnement de développement pour l’embarqué, et Git est un système de contrôle de version indépendant.

Vous devrez initialiser Git manuellement dans votre dossier de projet si ce n’est pas déjà fait.


 

Vérifier si Git est déjà initialisé

 

Si vous avez créé le projet via PlatformIO et que vous aviez déjà l’intention d’utiliser Git, il est possible que vous l’ayez déjà initialisé. Pour vérifier :

  1. Ouvrez votre terminal (ou l’invite de commandes) dans le dossier racine de votre projet PlatformIO (par exemple, PLK-MAPS-HID/).

  2. Tapez la commande : git status

  • Si Git est initialisé, vous verrez un message indiquant l’état actuel de votre dépôt Git.

  • Si Git n’est pas initialisé, vous verrez un message comme “fatal: not a git repository (or any of the parent directories): .git”.


 

Initialiser Git si nécessaire

 

Si Git n’est pas encore initialisé, suivez ces étapes (comme nous l’avons discuté précédemment) :

  1. Assurez-vous d’être dans le dossier racine de votre projet PlatformIO dans le terminal.

  2. Tapez : git init

Cela créera le dossier caché .git/ qui est le cœur de votre dépôt Git local.


 

Ajouter le .gitignore

 

C’est une étape cruciale avec PlatformIO car il génère beaucoup de fichiers de compilation.

  1. Créez un fichier nommé .gitignore à la racine de votre dossier de projet PlatformIO.

  2. Collez-y le contenu suivant :

# PlatformIO build artifacts
.pio/
.vscode/
.cache/
.DS_Store
*.pyc
*.o
*.elf
*.bin
*.hex
*.lst
*.map
*.d
*.e
*.s

# Local config files (if you create them for sensitive data)
# For example:
# src/credentials.h

 

Ce fichier dira à Git d’ignorer les fichiers générés par PlatformIO et VS Code, ainsi que tout fichier de configuration local sensible (comme les identifiants Wi-Fi si vous les mettez dans un fichier séparé).

 

 

ou se trouve mon workspace paltformIO?

 

 

Afficher le raisonnement

Votre espace de travail PlatformIO est simplement le dossier où vous avez créé votre projet PlatformIO. 📁 PlatformIO ne crée pas un “workspace” global au sens d’autres IDE ; chaque projet est un dossier de travail indépendant.

Voici comment le trouver :

 

1. Dans VS Code

 

Si vous avez toujours le projet ouvert dans VS Code :

  • Regardez dans la barre latérale “Explorateur” (l’icône des deux feuilles, généralement à gauche). Le nom du dossier racine de votre projet devrait être affiché en haut de cette barre.

  • Vous pouvez faire un clic droit sur le nom de votre projet dans cette barre latérale et choisir “Révéler dans l’Explorateur de fichiers” (sur Windows) ou “Révéler dans le Finder” (sur Mac) pour ouvrir directement le dossier.

 

2. Sur votre système de fichiers

 

Si vous avez fermé VS Code ou si vous ne savez pas où vous l’avez enregistré :

  • Lorsque vous avez créé le projet PlatformIO, VS Code vous a demandé de choisir un emplacement. Il est généralement stocké dans un dossier comme :

    • Windows : C:\Users\VotreNomUtilisateur\Documents\PlatformIO\Projects\ ou un dossier que vous avez spécifié.

    • macOS / Linux : ~/Documents/PlatformIO/Projects/ ou l’emplacement que vous avez choisi.

  • Recherchez le nom de votre projet (par exemple, PLK-MAPS-HID) sur votre disque dur.

 

 

 

Maintenant que votre projet PlatformIO est bien configuré avec Git, nous allons intégrer votre programme Arduino opérationnel. L’objectif est de transférer le code, en l’adaptant à la structure de PlatformIO, et de préparer l’utilisation de LittleFS pour l’interface web.


 

1. Mettre à jour platformio.ini pour les librairies

 

La première étape est de vous assurer que PlatformIO gérera les librairies nécessaires.

  1. Ouvrez le fichier platformio.ini à la racine de votre projet PlatformIO dans VS Code.

  2. Dans la section [env:esp32dev] (ou le nom de votre carte), assurez-vous que la ligne lib_deps = contient les librairies suivantes :

    Ini, TOML

    [env:esp32dev]
    ; ... (autres paramètres)
    lib_deps =
        https://github.com/lathoub/Arduino-BLE-MIDI.git ; Pour BLEMidi de lathoub
        WebServer
        WiFi
        LittleFS ; Pour la gestion des fichiers HTML
    

    • Nous spécifions l’URL directe pour Arduino-BLE-MIDI de lathoub pour être sûr d’avoir la bonne version.

    • WiFi et WebServer sont des librairies standards pour l’ESP32.

    • LittleFS est nécessaire pour charger votre index.html depuis le système de fichiers.


 

2. Préparer le fichier source src/main.cpp

 

Votre code Arduino (le fichier .ino) sera copié dans src/main.cpp. Dans PlatformIO, les fichiers .cpp (ou .ino) sont compilés comme du C++. Cela signifie que toutes vos fonctions auxiliaires doivent être déclarées avant d’être utilisées si elles sont définies après setup() et loop().

  1. Ouvrez le fichier src/main.cpp dans votre projet PlatformIO.

  2. Copiez tout le contenu de votre programme Arduino existant dans ce fichier src/main.cpp.


 

3. Déclarer les fonctions auxiliaires (Prototypes)

 

Puisque main.cpp est compilé comme du C++, vous devez déclarer les prototypes de vos fonctions auxiliaires (telles que playTimedDrumBeat(), manage_Signal_Data_Aquisition_And_Storage(), etc.) en haut du fichier, avant setup().

Ajoutez ces lignes juste après vos déclarations de variables globales et avant la fonction setup():

C++

// ---------------------------------------------------------------------------------------------------------------------
// DÉCLARATIONS DES FONCTIONS AUXILIAIRES (Prototypes)
// ---------------------------------------------------------------------------------------------------------------------
void playTimedDrumBeat();
void playDiv_Notes(int Div);
void manage_Signal_Data_Aquisition_And_Storage();
void manage_Signals_Mapping();
void manage_Serial_Out_Display();
void trigger_Mapping_Event(int i);
void setupBeats();
void Add_Note_To_Player(byte tune_id, byte Meas, byte Beat, byte SubBeat, byte Note, byte Vel, byte Chan, int Dur);
void onConnected();
void onDisconnected();

  • Cela indique au compilateur l’existence de ces fonctions avant qu’il ne les rencontre dans setup() ou loop().


 

4. Intégrer LittleFS pour le fichier HTML

 

Nous allons modifier votre code pour charger index.html depuis le système de fichiers LittleFS, plutôt que de le stocker en mémoire RAM (avec PROGMEM).

  1. Supprimez complètement la variable const char index_html[] PROGMEM = R"rawliteral(...)"; de votre code src/main.cpp. Elle ne sera plus nécessaire.

  2. Ajoutez l’inclusion de la librairie LittleFS en haut de src/main.cpp :

    C++

    #include <LittleFS.h>
    

  3. Modifiez la fonction setup() dans src/main.cpp pour initialiser LittleFS et servir le fichier HTML :

    C++

    void setup() {
      pinMode(LED_BUILTIN, OUTPUT);
      digitalWrite(LED_BUILTIN, LOW);
    
      Serial.begin(115200);
    
      // --- INITIALISATION LITTLEFS ---
      if (!LittleFS.begin()) {
        Serial.println("Erreur lors du montage de LittleFS. Le serveur web ne fonctionnera pas.");
        return; // Arrête si LittleFS ne peut pas être monté
      } else {
        Serial.println("LittleFS monté avec succès.");
        // Optionnel: Lister les fichiers pour vérifier
        // File root = LittleFS.open("/");
        // File file = root.openNextFile();
        // while(file){
        //   Serial.print("  FILE: ");
        //   Serial.println(file.name());
        //   file = root.openNextFile();
        // }
      }
      // --- FIN INITIALISATION LITTLEFS ---
    
      // Connect to Wi-Fi
      WiFi.mode(WIFI_STA);
      WiFi.disconnect(true);
      WiFi.begin(ssid, password);
      int attempts = 0;
      while (WiFi.status() != WL_CONNECTED && attempts < 30) {
        delay(500);
        Serial.print(".");
        attempts++;
      }
    
      if (WiFi.status() != WL_CONNECTED) {
        Serial.println("\nFailed to connect to WiFi.");
        Serial.print("Status code: ");
        Serial.println(WiFi.status());
      } else {
        Serial.println("\nWiFi connected!");
        Serial.print("IP address: ");
        Serial.println(WiFi.localIP());
      }
    
      // Set up web server routes
      server.on("/", HTTP_GET, [](){
        server.send(200, "text/html", LittleFS.open("/index.html", "r")); // Chargement depuis LittleFS
      });
      server.on("/velocity", HTTP_GET, [](){
        if (server.hasArg("value")) {
          masterVelocity = server.arg("value").toInt();
        }
        server.send(200, "text/plain", "OK");
      });
      server.begin();
    
      // Clear sensor value buffer
      for (int i = 0; i < nbcapteurs; i++) {
        for (int j = 0; j < BufferSize; j++) {
          sensorVal[i][j] = 0;
        }
      }
    
      // Set up BLE-MIDI callbacks
      BLEMidiServer.setOnConnectCallback(onConnected);
      BLEMidiServer.setOnDisconnectCallback(onDisconnected);
    
      Serial.println("Initializing Bluetooth...");
      BLEMidiServer.begin("ESP32 MIDI Instrument"); // Name your BLE device
      Serial.println("Waiting for connections...");
    
      setupBeats();
    }
    


 

5. Créer le dossier data/ et l’index.html

 

  1. À la racine de votre projet PlatformIO (le même niveau que src/ et platformio.ini), créez un nouveau dossier nommé data.

  2. À l’intérieur de ce dossier data, créez un fichier nommé index.html.

  3. Collez le contenu HTML (tout ce qui se trouvait entre R"rawliteral(...)rawliteral") dans ce nouveau fichier data/index.html.

    HTML

    <!DOCTYPE HTML><html>
    <head>
      <title>MIDI Controller</title>
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <style>
        body { font-family: Arial; text-align: center; margin:auto; padding-top: 20px;}
        .slider { width: 300px; }
        input[type=text] { width: 100px; }
      </style>
    </head>
    <body>
      <h1>MIDI Pads Control</h1>
      <h3>Master Velocity</h3>
      <input type="range" class="slider" min="0" max="127" id="velocitySlider" oninput="updateVelocity(this.value)">
      <p>Velocity: <span id="velocityValue">100</span></p>
      <script>
        function updateVelocity(val) {
          document.getElementById('velocityValue').innerHTML = val;
          var xhr = new XMLHttpRequest();
          xhr.open('GET', '/velocity?value=' + val, true);
          xhr.send();
        }
      </script>
    </body>
    </html>
    


 

6. Mettre les identifiants Wi-Fi dans un fichier séparé (bonne pratique)

 

Pour éviter de pousser vos identifiants Wi-Fi sur GitHub, nous allons les mettre dans un fichier séparé.

  1. Dans le dossier src/, créez un nouveau fichier nommé credentials.h.

  2. Copiez-y les lignes suivantes, en remplaçant par vos vrais identifiants :

    C++

    #ifndef WIFI_CREDENTIALS_H
    #define WIFI_CREDENTIALS_H
    
    const char* ssid = "ClubInternet24G"; // Votre SSID
    const char* password = "5148856187"; // Votre mot de passe
    
    #endif // WIFI_CREDENTIALS_H
    

  3. Dans votre src/main.cpp, supprimez les lignes const char* ssid = ... et const char* password = ....

  4. À la place, ajoutez cette ligne en haut de src/main.cpp, juste après les autres #include :

    C++

    #include "credentials.h"
    

  5. Mettez à jour votre .gitignore pour inclure cette ligne afin que credentials.h ne soit jamais poussé sur GitHub :

    Extrait de code

    # ... (autres lignes existantes)
    # Local config files
    src/credentials.h
    


 

7. Compiler et Téléverser dans PlatformIO

 

Maintenant, vous êtes prêt à tester !

  1. Dans VS Code, cliquez sur l’icône PlatformIO dans la barre d’activités.

  2. Dans la section “Project Tasks” (Tâches du projet) :

    • Sous votre environnement (par exemple, esp32dev), cliquez sur “Upload Filesystem Image”. Cela enverra votre data/index.html à l’ESP32.

    • Ensuite, cliquez sur “Upload”. Cela compilera et téléversera votre code C++ (src/main.cpp) sur l’ESP32.

  3. Ouvrez le “Serial Monitor” de PlatformIO (l’icône de prise électrique dans la barre d’état ou via la vue PlatformIO) pour voir les messages de connexion Wi-Fi et l’adresse IP.

Si tout se passe bien, votre ESP32 devrait se connecter au Wi-Fi, vous donner une adresse IP, et en accédant à cette IP depuis votre navigateur, vous devriez voir votre interface web.

Afficher le raisonnement

Non, ce n’est pas tout à fait correct. 🧐

Votre fichier platformio.ini contient actuellement deux sections d’environnement distinctes ([env:esp32doit-devkit-v1] et [env:esp32dev]). PlatformIO construira votre projet pour l’environnement actif, et avoir deux définitions complètes pour le même projet peut prêter à confusion ou entraîner des comportements inattendus si l’un n’est pas correctement défini.

 

Ce qu’il faut faire :

 

  1. Choisissez l’environnement qui correspond à votre carte ESP32. Il est très probable que esp32doit-devkit-v1 soit le nom exact de votre carte, alors utilisons-le.

  2. Consolidez toutes les dépendances de bibliothèques sous cet environnement unique.

  3. Supprimez l’autre section ([env:esp32dev]) pour éviter toute ambiguïté.


 

Votre fichier platformio.ini corrigé devrait ressembler à ceci :

 

Ini, TOML

; PlatformIO Project Configuration File
;
;   Build options: build flags, source filter
;   Upload options: custom upload port, speed and extra flags
;   Library options: dependencies, extra library storages
;   Advanced options: extra scripting
;
; Please visit documentation for the other options and examples
; https://docs.platformio.org/page/projectconf.html

[env:esp32doit-devkit-v1]
platform = espressif32
board = esp32doit-devkit-v1
framework = arduino
monitor_speed = 115200 ; Ajoutez cette ligne pour le moniteur série

lib_deps =
    https://github.com/lathoub/Arduino-BLE-MIDI.git ; Pour BLEMidi de lathoub
    WebServer
    WiFi
    LittleFS ; Pour la gestion des fichiers HTML

  • J’ai déplacé monitor_speed = 115200 sous [env:esp32doit-devkit-v1] car c’est une option utile.

  • Assurez-vous que le board = esp32doit-devkit-v1 correspond bien au type de carte que vous utilisez. Si vous avez sélectionné “ESP32 Dev Module” lors de la création du projet, le board pourrait être esp32dev. Si vous n’êtes pas sûr, vous pouvez vérifier dans les tâches PlatformIO de VS Code quel environnement est utilisé.

Après cette modification, sauvegardez le fichier et PlatformIO devrait pouvoir gérer correctement vos dépendances et compiler votre code.