BUT Mesures Physiques · IUT Aix-Marseille · 2026-2027

Exemples : programmer les deux LEDs du NebuleAir

Deux projets. Le premier fait clignoter les LEDs au démarrage, puis change leur couleur chaque seconde. Le second colore la LED 0 en vert, orange ou rouge selon une valeur de PM2.5, pendant que la LED 1 clignote. Il suffit de la carte, sans capteur.

Code de l'exemple du guide IUT-AMU-07 « Programmer les deux LEDs de couleur du NebuleAir », v1.2 du 2026-11-04. Les explications sont dans le PDF.

Mise en route

  1. Téléchargez le projet (bouton vert), décompressez-le. Dans VS Code, onglet PlatformIO, Open Project, choisissez le dossier décompressé.
    Ou créez un projet PlatformIO (carte Espressif ESP32 Dev Module, framework Arduino) et remplacez ses fichiers par ceux ci-dessous, avec le bouton Copier.
  2. Au démarrage de l'exemple 1, les LEDs clignotent 3 fois, puis la LED 0 reste seule allumée en blanc 2 secondes : repérez laquelle c'est sur votre carte.
  3. Téléversez (Upload), puis ouvrez le moniteur série (Monitor, 115200 bauds).

Rouge affiché en vert ? Gardez NEO_GRB dans la déclaration de leds. Rien ne s'allume ? Chaque changement de couleur doit être suivi de leds.show().

Exemple 1 : clignoter, puis changer de couleur

Les LEDs clignotent 3 fois au démarrage, puis changent de couleur chaque seconde. Il suffit de la carte.

Télécharger le projet IUT-AMU-07-exemple-v1.2.zip
platformio.ini
[env:nebuleair]
platform = espressif32 @ 7.1.3
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
    adafruit/Adafruit NeoPixel @ 1.12.3
src/main.cpp
// Exemple 1 : les LEDs clignotent au démarrage, puis changent de couleur chaque seconde.
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>

// Les 2 LEDs WS2812 de la carte NebuleAir, chaînées sur la GPIO 33
#define LED_PIN   33
#define LED_COUNT 2

Adafruit_NeoPixel leds(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// Les couleurs du défilé (rouge, vert, bleu : de 0 à 255)
const uint32_t COULEURS[] = {
  Adafruit_NeoPixel::Color(255, 0, 0),    // rouge
  Adafruit_NeoPixel::Color(0, 255, 0),    // vert
  Adafruit_NeoPixel::Color(0, 0, 255),    // bleu
  Adafruit_NeoPixel::Color(255, 180, 0),  // jaune
  Adafruit_NeoPixel::Color(160, 0, 255),  // violet
};
const int NB_COULEURS = 5;
const uint32_t BLANC = Adafruit_NeoPixel::Color(255, 255, 255);

void setup() {
  Serial.begin(115200);
  leds.begin();             // prépare la broche
  leds.setBrightness(60);   // luminosité globale, de 0 à 255 : une fois ici
  leds.clear();             // les deux LEDs éteintes...
  leds.show();              // ... et rien ne change tant qu'on n'appelle pas show()

  // Au démarrage : 3 clignotements blancs des deux LEDs
  for (int i = 0; i < 3; i++) {
    leds.setPixelColor(0, BLANC);
    leds.setPixelColor(1, BLANC);
    leds.show();
    delay(200);
    leds.clear();
    leds.show();
    delay(200);
  }

  // Puis la LED 0 seule, 2 secondes, pour savoir laquelle c'est
  leds.setPixelColor(0, BLANC);
  leds.show();
  Serial.println("LED 0 en blanc");
  delay(2000);
}

int n = 0;  // numéro de la couleur affichée sur la LED 0

void loop() {
  // La LED 0 prend la couleur n, la LED 1 la suivante
  leds.setPixelColor(0, COULEURS[n]);
  leds.setPixelColor(1, COULEURS[(n + 1) % NB_COULEURS]);
  leds.show();
  Serial.printf("LED 0 : couleur %d\n", n);

  n = (n + 1) % NB_COULEURS;  // couleur suivante ; après la dernière, retour à 0
  delay(1000);
}

Exemple 2 : la couleur suit le PM2.5

La LED 0 passe au vert, à l'orange ou au rouge selon une valeur de PM2.5 (au hasard ici, à remplacer par la mesure du NextPM du guide IUT-AMU-04) ; la LED 1 clignote en bleu.

Télécharger le projet IUT-AMU-07-exemple-pm-v1.2.zip
platformio.ini
[env:nebuleair]
platform = espressif32 @ 7.1.3
board = esp32dev
framework = arduino
monitor_speed = 115200
lib_deps =
    adafruit/Adafruit NeoPixel @ 1.12.3
src/main.cpp
// Exemple 2 : la LED 0 prend la couleur du niveau de PM2.5,
// la LED 1 clignote pour montrer que le programme tourne.
#include <Arduino.h>
#include <Adafruit_NeoPixel.h>

// Les 2 LEDs WS2812 de la carte NebuleAir, chaînées sur la GPIO 33
#define LED_PIN   33
#define LED_COUNT 2
Adafruit_NeoPixel leds(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

const uint32_t VERT   = Adafruit_NeoPixel::Color(0, 255, 0);
const uint32_t ORANGE = Adafruit_NeoPixel::Color(255, 80, 0);
const uint32_t ROUGE  = Adafruit_NeoPixel::Color(255, 0, 0);
const uint32_t BLEU   = Adafruit_NeoPixel::Color(0, 0, 255);
const uint32_t NOIR   = 0;  // éteinte

// La mesure de PM2.5, en µg/m³. Ici une valeur au hasard (0,0 à 40,0) :
// à remplacer par la lecture du NextPM de votre programme (guide IUT-AMU-04).
float lirePM25() {
  return random(0, 401) / 10.0;
}

// Couleur selon le niveau de PM2.5 (µg/m³) : seuils à adapter
uint32_t couleurPM25(float pm25) {
  if (pm25 < 10) return VERT;
  if (pm25 < 25) return ORANGE;
  return ROUGE;
}

void setup() {
  Serial.begin(115200);
  leds.begin();
  leds.setBrightness(60);
  leds.clear();
  leds.show();
}

unsigned long derniereMesure = 0;  // dernière mesure (ms)
unsigned long dernierClignot = 0;  // dernier changement de la LED 1 (ms)
bool led1Allumee = false;

void loop() {
  unsigned long maintenant = millis();

  // Toutes les 10 s : une mesure, et la LED 0 prend sa couleur
  if (maintenant - derniereMesure >= 10000) {
    derniereMesure = maintenant;
    float pm25 = lirePM25();
    leds.setPixelColor(0, couleurPM25(pm25));
    leds.show();
    Serial.printf("PM2.5 = %.1f ug/m3\n", pm25);
  }

  // Toutes les 500 ms : la LED 1 s'allume ou s'éteint
  if (maintenant - dernierClignot >= 500) {
    dernierClignot = maintenant;
    led1Allumee = !led1Allumee;
    leds.setPixelColor(1, led1Allumee ? BLEU : NOIR);
    leds.show();
  }
}