ruban-neopixel.ino
Una tira NeoPixel animada localmente cuyo motivo cambia a distancia con un simple Particle.subscribe. Ilustra el modelo de eventos de Particle: la placa actúa sola pero sigue controlable desde cualquier otro aparato de la cuenta.
Hardware
Un módulo Particle Photon (Wi-Fi 2,4 GHz, microcontrolador STM32, blindaje metálico) alimentado por USB o VIN. 1 tira de 12 LED NeoPixel + alimentación externa de 5 V.
Cableado
Data a A0 (resistencia de 330 Ω), VCC a 5 V externo, GND común con la placa.
Funcionamiento
La librería neopixel del core genera la trama WS2812; subscribe() llama a changerMotif() en cuanto aparece un evento "motif", y loop() adapta la animación sin bloquear nunca.
Ejecución
Con el CLI de Particle: particle flash --serial (modo DFU, doble reset) o flash OTA cuando la placa esté en línea. El Safe Mode (reset + WiFi) sirve para depurar.
Variantes
Añadir motivos controlados por parámetro (color, velocidad), o sincronizar varias placas en el mismo evento.
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);