#include <Adafruit_NeoPixel.h>
// Définir le nombre de LED, la broche de données et la broche du bouton
#define NUM_LEDS 50
#define DATA_PIN 6
#define BUTTON_PIN 2 // Utiliser la broche D2 pour le bouton poussoir
Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, DATA_PIN, NEO_GRB + NEO_KHZ800);
int effect = 0; // Variable pour suivre l'effet actuel
bool buttonState = false;
bool lastButtonState = false;
unsigned long lastDebounceTime = 0; // Dernière fois que l'état du bouton a changé
unsigned long debounceDelay = 50; // Délai de déparasitage (50 ms)
unsigned long lastPrintTime = 0; // Dernière fois que l'état du bouton a été affiché
unsigned long printInterval = 500; // Intervalle d'affichage (500 ms)
void setup() {
strip.begin();
strip.show(); // Initialiser toutes les LEDs à 'off'
strip.setBrightness(50); // Ajuster la luminosité
// Configurer la broche du bouton comme entrée avec pull-up interne
pinMode(BUTTON_PIN, INPUT_PULLUP);
// Initialiser la communication série
Serial.begin(9600);
Serial.println("Mode initial: 0 - Balayage rouge");
}
void loop() {
// Lire l'état du bouton
bool reading = !digitalRead(BUTTON_PIN); // Inverser car INPUT_PULLUP
// Vérifier si l'état du bouton a changé
if (reading != lastButtonState) {
lastDebounceTime = millis(); // Réinitialiser le temps de déparasitage
}
// Si le délai de déparasitage est écoulé
if ((millis() - lastDebounceTime) > debounceDelay) {
// Si l'état du bouton a changé
if (reading != buttonState) {
buttonState = reading;
// Afficher l'état du bouton poussoir
Serial.print("État du bouton poussoir: ");
Serial.println(buttonState ? "HIGH" : "LOW");
// Si le bouton est pressé
if (buttonState) {
// Indicateur de changement de mode : toutes les LEDs passent au blanc
for (int i = 0; i < NUM_LEDS; i++) {
strip.setPixelColor(i, strip.Color(255, 255, 255));
}
strip.show();
delay(200); // Attendre 200 ms
effect = (effect + 1) % 6; // Passer à l'effet suivant
Serial.print("Mode actuel: ");
Serial.println(effect);
}
}
}
lastButtonState = reading;
// Afficher l'état du bouton toutes les 0.5 secondes
if (millis() - lastPrintTime >= printInterval) {
Serial.print("État du bouton poussoir (intervalle): ");
Serial.println(digitalRead(BUTTON_PIN) == LOW ? "LOW" : "HIGH");
lastPrintTime = millis();
}
// Appliquer l'effet en fonction de la variable effect
switch (effect) {
case 0:
Serial.println("Mode 0 - Balayage rouge");
colorWipe(strip.Color(255, 0, 0), 50); // Effet de balayage rouge
break;
case 1:
Serial.println("Mode 1 - Cycle arc-en-ciel");
rainbowCycle(20); // Effet de cycle arc-en-ciel
break;
case 2:
Serial.println("Mode 2 - Théâtre bleu");
theaterChase(strip.Color(0, 0, 255), 50); // Effet de théâtre bleu
break;
case 3:
Serial.println("Mode 3 - Balayage vert");
colorWipe(strip.Color(0, 255, 0), 50); // Effet de balayage vert
break;
case 4:
Serial.println("Mode 4 - Arc-en-ciel simple");
rainbow(10); // Effet arc-en-ciel simple
break;
case 5:
Serial.println("Mode 5 - Théâtre arc-en-ciel");
theaterChaseRainbow(50); // Effet de théâtre arc-en-ciel
break;
}
}
// Fonction pour l'effet de balayage de couleur
void colorWipe(uint32_t color, int wait) {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, color);
strip.show();
delay(wait);
}
}
// Fonction pour l'effet de cycle arc-en-ciel
void rainbowCycle(int wait) {
for (int j = 0; j < 256 * 5; j++) { // 5 cycles de toutes les couleurs
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
}
strip.show();
delay(wait);
}
}
// Fonction pour l'effet de théâtre
void theaterChase(uint32_t color, int wait) {
for (int j = 0; j < 10; j++) { // 10 cycles de clignotement
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i + q, color); // Allumer chaque troisième LED
}
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i + q, 0); // Éteindre chaque troisième LED
}
}
}
}
// Fonction pour l'effet arc-en-ciel simple
void rainbow(int wait) {
for (int j = 0; j < 256; j++) {
for (int i = 0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel((i + j) & 255));
}
strip.show();
delay(wait);
}
}
// Fonction pour l'effet de théâtre arc-en-ciel
void theaterChaseRainbow(int wait) {
for (int j = 0; j < 256; j++) {
for (int q = 0; q < 3; q++) {
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i + q, Wheel((i + j) % 255)); // Allumer chaque troisième LED avec une couleur arc-en-ciel
}
strip.show();
delay(wait);
for (int i = 0; i < strip.numPixels(); i += 3) {
strip.setPixelColor(i + q, 0); // Éteindre chaque troisième LED
}
}
}
}
// Fonction pour générer des couleurs arc-en-ciel
uint32_t Wheel(byte WheelPos) {
WheelPos = 255 - WheelPos;
if (WheelPos < 85) {
return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
}
if (WheelPos < 170) {
WheelPos -= 85;
return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
WheelPos -= 170;
return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}