Bonjour axelmaux
Ce programme a été développé pour gérer des feux tricolores réalisés avec des LED adressables.
On part d’un réseau de x nombre de LED sur un seul bus connecté sur la pin 12 (ledBusPin).
Quelque part, sur le bus, il y a 1 feu tricolore dont la première LED est la 12, un bout plus loin il y a une maison dont l’éclairage débute LED 16 et une rue avec 6 candélabres dont le premier est en position 20.
L'allumage des LED se fait par des commandes comme :
LED016w allume la LED 16 en blanc
SEQ012xOx Au feu tricolore on allume la LED du milieu en orange clignotant.
SEQ012rO. On ajoute la LED rouge en fixe.
SEQ020wwwwwW On allume les 6 candélabres en fixe.
SEQ020wwwxww On éteint le 4ème.
SEQ020.....b On passe le dernier en bleu sans changer les autres
Ces commandes peuvent être introduites depuis la ligne de commande du moniteur (115200) ou comme montré dans le programme.
Dans le programme il y a des exemples avec 2 boutons (bibliothèque JC_Button.h).
Le premier bouton allume une partie du feu tricolore, le deuxième, allume la rue et une longue pression sur le premier, éteint tout.
La syntaxe des ordres se trouve expliquée dans le sketch, au-dessus de void cmdExecute.
Les lettre des couleurs reconnues sont dans la variable ledColInitial.
Je te laisse essayer, à ta disposition pour toutes questions.
Le programme:
/*
Name: LEDneopixerLangage.ino
Created: 01.05.2025
Author: jpbbricole
Remarque: Pseudo langage pour commander une bande de LED adressables
Commandes reconnues, voir au-dessus de void cmdExecute(String cmdRx)
*/
#include <Adafruit_NeoPixel.h> // Gestion des LED RGB Neopixel https://github.com/adafruit/Adafruit_NeoPixel
#include <JC_Button.h> // https://github.com/JChristensen/JC_Button
//------------------------------------- LED
const int ledNombre = 100; // Nombre de LED
const int ledBusPin = 12; // Connexion du bus
const int ledBrightMax = 70; // LED Luminosité maximum
int feuxLedNum = 0; // Numéro de la LED
Adafruit_NeoPixel leds = Adafruit_NeoPixel(ledNombre, ledBusPin, NEO_GRB + NEO_KHZ800); // Création de l'objet Neopixel signLed
const String ledColInitial = "RVBJOPWX"; // Initiale des couleurs X = tout éteindre
enum ledColorsIndex {ledColRed, ledColGreen, ledColBlue, ledColYellow, ledColOrange, ledColPurple, ledColWithe, ledColOff, ledColNombre};
uint32_t ledColors[ledColNombre]; // Valeurs RGB pour les couleurs (Tableau)
struct ledClignDef // Pour le clignotement des LE
{
boolean etatOn; // Si LED on ou off
int couleur; // Couleur de la LED, si ledColOff, pas de clignotement
};
ledClignDef ledsClign[ledNombre];
unsigned long ledsClignTempo = 250; // Tempo en millisecondes
unsigned long ledsClignMillis = millis(); // Tempo en millisecondes, chrono
//------------------------------------- Boutons (btn)
const int btnPin[] = {6, 7}; // Connexion des boutons
Button btn[] = {Button (btnPin[0]), Button (btnPin[1])}; // Définition des boutons
const int btnNombre = sizeof(btn) / sizeof(btn[0]); // Nombre de boutons
void setup()
{
Serial.begin(115200);
for (int b = 0; b < btnNombre; b ++)
{
btn[b].begin(); // Démarrage des boutons
}
//-------------------------------- LED des feux
ledInitialisation();
ledsClignAllOff(); // Arrêter tout les clignotement
Serial.println("\nSysteme de feux avec " + String(ledNombre) + " LED");
}
void loop()
{
for (int b = 0; b < btnNombre; b ++) // Lecture des boutons
{
btn[b].read() ;
}
if (btn[0].pressedFor(1000))
{
cmdExecute("LEDOFF"); // Tout éteindre
}
else
{
if (btn[0].wasPressed()) // Si le bouton 0 a été pressé
{
cmdExecute("SEQ012rO"); // Allumer ^feux tricolore
}
else if (btn[1].wasPressed()) // Si le bouton 1 a été pressé
{
cmdExecute("SEQ020wwwwww"); // Allumer la rue
}
}
//--------------------------------- Clignotement
if (millis() - ledsClignMillis >= ledsClignTempo) // Si moment de clignoter
{
for (int l = 0; l < ledNombre; l ++)
{
if (ledsClign[l].couleur != ledColOff)
{
if (ledsClign[l].etatOn) // Si allumée
{
leds.setPixelColor(l, ledColors[ledColOff]);
}
else
{
leds.setPixelColor(l, ledColors[ledsClign[l].couleur]);
}
leds.show();
ledsClign[l].etatOn = !ledsClign[l].etatOn; // Inverser l'état
}
}
ledsClignMillis = millis(); // Redémarrer le chrono
}
//--------------------------------- Commandes moniteur
if (Serial.available()) // Si commande reçue
{
cmdExecute(Serial.readStringUntil('\n')); // Lire jusqu'à nouvelle ligne
}
}
/*
Commandes depuis le moniteur, les commandes sont sensibles à la casse.
Commandes reconnues:
LEDnnnc allume la LED nnn à la couleur c (ledColInitial)
si c en majuscule la couleur clignote. Si c = . on ne fait rien sur cette LED
si c = X, on éteind cette LED.
SEQnnncCc... Allumage d'une séquence de LED,
nnn est le numéro (de 0 à ..) de la première LED et cCc... couleur de la ou les LED suivantes
LEDOFF Tout éteindre
*/
void cmdExecute(String cmdRx)
{
int cmdParInt = 0; // Paramètre integer
cmdRx.trim(); // Nettoyage
cmdRx.replace(" ", ""); // Sans espaces
cmdRx.replace(",", "."); // Pour les décimales
Serial.println("Commande recue: " + cmdRx);
if (cmdRx == (F("LEDOFF")))
{
ledsClignAllOff();
leds.clear();
leds.show();
}
else if (cmdRx.startsWith(F("LED")))
{
cmdRx.replace(F("LED"), ""); // Ne garder que le paramètre
ledAllumer(cmdRx.substring(0, 3).toInt(), cmdRx.substring(3, 4));
}
else if (cmdRx.startsWith(F("SEQ")))
{
cmdRx.replace(F("SEQ"), ""); // Ne garder que le paramètre
ledAllumerSeq(cmdRx.substring(0, 3).toInt(), cmdRx.substring(3));
}
else if (cmdRx == (F("TEST")))
{
}
else if (cmdRx == (F("TESTOFF")))
{
}
else
{
Serial.println("Commande inconnue: " + cmdRx);
}
}
void ledsClignAllOff()
{
for (int l = 0; l < ledNombre; l ++)
{
ledsClign[l].couleur = ledColOff; // Arrêter clignotement
}
}
//------------------------------------ LED
void ledAllumerSeq(int ledFirst, String ledColors) // Envoi d'une séquence de couleur sur une suite de LED
{
for (int ls = 0; ls < ledColors.length(); ls ++)
{
ledAllumer(ledFirst + ls, ledColors.substring(ls, ls+1));
}
}
void ledAllumer(int ledIndex, String ledColor) // Si ledColor est en majuscule = LED clignotante
{
if (ledColor == ".") // Ne riuen faire
{
return;
}
String colorUper = ledColor;
colorUper.toUpperCase();
boolean ledClign = (ledColor == colorUper) ? true : false;
int colorIndex = ledCouleurIndex(ledColor);
if (colorIndex == -1) // Si couleur inconnue
{
Serial.println("Couleur inconnue " + ledColor);
}
else
{
leds.setPixelColor(ledIndex, ledColors[colorIndex]);
leds.show();
if (colorIndex == ledColOff) // Si extnction de la LED
{
ledsClign[ledIndex].couleur = ledColOff; // Arrêter le clignotement
}
else
{
if (ledClign)
{
Serial.println("Couleur clignotante " + ledColor);
ledsClign[ledIndex].couleur = colorIndex;
}
else
{
Serial.println("Couleur fixe " + ledColor);
ledsClign[ledIndex].couleur = ledColOff; // Arrêter le clignotement
}
}
}
}
int ledCouleurIndex(String ledColor) // Retourne l'index de la couléeur
{
ledColor.toUpperCase();
for (int c = 0; c < ledColNombre; c ++)
{
if (ledColInitial.charAt(c) == ledColor.charAt(0))
{
return c; // Couleur trouvée dans la liste
}
}
return -1; // Pas trouvée
}
void ledInitialisation()
{
ledColors[ledColRed] = leds.Color(255, 0, 0); // Définition des couleurs
ledColors[ledColGreen] = leds.Color(0, 255, 0);
ledColors[ledColBlue] = leds.Color(0, 0, 255);
ledColors[ledColYellow] = leds.Color(255, 255, 0);
ledColors[ledColOrange] = leds.Color(255, 165, 0);
ledColors[ledColPurple] = leds.Color(128, 0, 128);
ledColors[ledColWithe] = leds.Color(255, 255, 255);
ledColors[ledColOff] = leds.Color(0, 0, 0);
leds.begin();
leds.setBrightness(ledBrightMax);
leds.clear();
leds.show();
}
Bonne après-midi.
jpbbricole