ruban-neopixel.ino

Particle Photon · Fichier : ruban-neopixel.ino · Langage : Arduino · Usage : Piloter un ruban NeoPixel et changer le motif par événement cloud

Un ruban NeoPixel animé localement, dont le motif se change à distance par un simple Particle.subscribe. Illustre le modèle événementiel Particle : la carte agit seule mais reste pilotable depuis n'importe quel autre appareil du compte.

Matériel requis

Un module Particle Photon (Wi-Fi 2,4 GHz, microcontrôleur STM32, blindage métallique) alimenté par USB ou VIN. 1 ruban 12 LED NeoPixel + alimentation 5 V externe.

Câblage

Data sur A0 (résistance 330 Ω), VCC sur 5 V externe, GND commun avec la carte.

Fonctionnement

La bibliothèque neopixel du core génère la trame WS2812 ; subscribe() appelle changerMotif() dès qu'un événement "motif" paraît, et loop() adapte l'animation sans jamais bloquer.

Exécution

Avec le CLI Particle : particle flash --serial (mode DFU, double reset) ou flash OTA une fois la carte en ligne. Le mode Safe Mode (reset + WiFi) sert au dépannage.

Variantes

Ajouter des motifs pilotés par paramètre (couleur, vitesse), ou synchroniser plusieurs cartes sur le même événement.

ruban-neopixel.ino

// Ruban NeoPixel 12 LED sur A0, motif changeable a distance.
#include "neopixel/neopixel.h"   // bibliotheque integree Particle

#define PIN_NEO A0
#define NB 12
#define TYPE NEO_GRB

Adafruit_NeoPixel ruban(NB, PIN_NEO, TYPE);
int motif = 0;

void changerMotif(String args) {
  motif = args.toInt() % 3;   // 0 = vague, 1 = plein, 2 = stroboscope
}

void setup() {
  ruban.begin();
  ruban.setBrightness(60);
  Particle.subscribe("motif", changerMotif, MY_DEVICES);
}

void loop() {
  static unsigned long t0 = 0;
  if (millis() - t0 < 60) return;
  t0 = millis();

  static int tete = 0;
  ruban.clear();
  if (motif == 0) {
    ruban.setPixelColor(tete, ruban.Color(0, 120, 255));
    ruban.setPixelColor((tete + 1) % NB, ruban.Color(0, 40, 90));
  } else if (motif == 1) {
    for (int i = 0; i < NB; i++) ruban.setPixelColor(i, ruban.Color(255, 60, 0));
  } else {
    if ((millis() / 250) % 2)
      for (int i = 0; i < NB; i++) ruban.setPixelColor(i, ruban.Color(255, 255, 255));
  }
  ruban.show();
  tete = (tete + 1) % NB;
}

// Declencher : Particle.publish("motif", "1", 60, PRIVATE);

← Retour à la fiche