Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <Adafruit_NeoPixel.h>
- // ------------------------------------------------------
- // CONFIG BANDEAUX
- // ------------------------------------------------------
- #define PIN_TOP 4
- #define LED_TOP 68
- #define PIN_BOTTOM 5
- #define LED_BOTTOM 70
- // ------------------------------------------------------
- // BOUTON
- // ------------------------------------------------------
- #define BUTTON_PIN 2
- // ------------------------------------------------------
- // MICRO
- // ------------------------------------------------------
- #define MIC_PIN A0
- Adafruit_NeoPixel stripTop(LED_TOP, PIN_TOP, NEO_GRB + NEO_KHZ800);
- Adafruit_NeoPixel stripBottom(LED_BOTTOM, PIN_BOTTOM, NEO_GRB + NEO_KHZ800);
- // ------------------------------------------------------
- // VARIABLES MODES
- // ------------------------------------------------------
- int modeActuel = 0;
- const int totalModes = 6;
- bool lastButtonState = HIGH;
- unsigned long lastDebounce = 0;
- unsigned long debounceDelay = 50;
- // ------------------------------------------------------
- // VARIABLES VARIABLES
- // ------------------------------------------------------
- unsigned long debutCycle = 0;
- unsigned long prochainEvent = 0;
- bool flash = false;
- unsigned long finFlash = 0;
- // Variables pour le Scanner (Mode 5)
- int scannerPos = 0;
- int scannerDir = 1;
- unsigned long lastScannerUpdate = 0;
- // ------------------------------------------------------
- // SETUP
- // ------------------------------------------------------
- void setup() {
- stripTop.begin();
- stripBottom.begin();
- stripTop.show();
- stripBottom.show();
- pinMode(BUTTON_PIN, INPUT_PULLUP);
- pinMode(MIC_PIN, INPUT); // Le micro
- randomSeed(analogRead(1)); // Changé à 1 pour ne pas interférer avec le micro sur A0
- debutCycle = millis();
- }
- // ------------------------------------------------------
- // LOOP PRINCIPAL
- // ------------------------------------------------------
- void loop() {
- handleButton();
- updateTopEffects();
- updateBottomAudioReactive(); // Réactivé pour le son
- }
- // ======================================================
- // GESTION DU BOUTON
- // ======================================================
- void handleButton() {
- bool reading = digitalRead(BUTTON_PIN);
- if (reading != lastButtonState) {
- lastDebounce = millis();
- }
- if ((millis() - lastDebounce) > debounceDelay) {
- if (reading == LOW) {
- modeActuel++;
- if (modeActuel >= totalModes) {
- modeActuel = 0;
- }
- stripTop.clear();
- stripTop.show();
- delay(200);
- }
- }
- lastButtonState = reading;
- }
- // ======================================================
- // GESTION DES MODES (BANDEAU HAUT)
- // ======================================================
- void updateTopEffects() {
- switch (modeActuel) {
- case 0: effetOrage(); break;
- case 1: effetBattement(); break;
- case 2: effetFixeCalme(); break;
- case 3: effetEtincelles(); break;
- case 4: effetFeu(); break;
- case 5: effetScanner(); break;
- }
- }
- // ======================================================
- // MODE 0 — ORAGE
- // ======================================================
- void effetOrage() {
- unsigned long t = millis();
- unsigned long elapsed = t - debutCycle;
- if (elapsed >= 7000) {
- debutCycle = t;
- elapsed = 0;
- }
- if (elapsed < 3000) {
- if (flash && t >= finFlash) {
- flash = false;
- setRougeNormal();
- setBlancFixe();
- stripTop.show();
- prochainEvent = t + random(80, 200);
- }
- if (!flash && t >= prochainEvent) {
- flash = true;
- finFlash = t + random(40, 120);
- setRougeFlash();
- setBlancFixe();
- stripTop.show();
- if (random(0, 10) < 4) prochainEvent = t + random(40, 120);
- else prochainEvent = finFlash + random(200, 500);
- }
- return;
- }
- flash = false;
- setRougeNormal();
- setBlancFixe();
- stripTop.show();
- }
- // ======================================================
- // MODE 1 — BATTEMENT
- // ======================================================
- void effetBattement() {
- float brightness = (exp(sin(millis() / 2000.0 * PI)) - 0.36787944) * 108.0;
- for (int i = 0; i < LED_TOP; i++) {
- if (i < 12 || i >= 44) {
- stripTop.setPixelColor(i, stripTop.Color(brightness, 0, 0));
- } else {
- stripTop.setPixelColor(i, stripTop.Color(brightness, brightness, brightness));
- }
- }
- stripTop.show();
- }
- // ======================================================
- // MODE 2 — FIXE CALME
- // ======================================================
- void effetFixeCalme() {
- setRougeNormal();
- setBlancFixe();
- stripTop.show();
- }
- // ======================================================
- // MODE 3 — ÉTINCELLES
- // ======================================================
- void effetEtincelles() {
- for (int i = 0; i < LED_TOP; i++) {
- uint32_t c = stripTop.getPixelColor(i);
- uint8_t r = (c >> 16) & 0xFF;
- uint8_t g = (c >> 8) & 0xFF;
- uint8_t b = c & 0xFF;
- r = (r * 180) / 255;
- g = (g * 180) / 255;
- b = (b * 180) / 255;
- stripTop.setPixelColor(i, r, g, b);
- }
- int index = random(0, LED_TOP);
- if (random(0, 2) == 0) stripTop.setPixelColor(index, stripTop.Color(255, 255, 255));
- else stripTop.setPixelColor(index, stripTop.Color(255, 0, 0));
- stripTop.show();
- delay(20);
- }
- // ======================================================
- // MODE 4 — FEU
- // ======================================================
- void effetFeu() {
- for (int i = 0; i < LED_TOP; i++) {
- int flicker = random(0, 120);
- if (i < 12 || i >= 44) {
- int r = 180 - flicker;
- if (r < 20) r = 20;
- stripTop.setPixelColor(i, r, 0, 0);
- }
- else {
- int w = 80 - (flicker / 2);
- if (w < 10) w = 10;
- stripTop.setPixelColor(i, w, w, w);
- }
- }
- stripTop.show();
- delay(random(30, 80));
- }
- // ======================================================
- // MODE 5 — SCANNER K2000
- // ======================================================
- void effetScanner() {
- if (millis() - lastScannerUpdate > 30) {
- lastScannerUpdate = millis();
- for(int i = 0; i < LED_TOP; i++) {
- uint32_t c = stripTop.getPixelColor(i);
- uint8_t r = (c >> 16) & 0xFF;
- uint8_t g = (c >> 8) & 0xFF;
- uint8_t b = c & 0xFF;
- r = (r * 200) / 255;
- g = (g * 200) / 255;
- b = (b * 200) / 255;
- stripTop.setPixelColor(i, r, g, b);
- }
- scannerPos += scannerDir;
- if (scannerPos >= LED_TOP) {
- scannerPos = LED_TOP - 2;
- scannerDir = -1;
- } else if (scannerPos < 0) {
- scannerPos = 1;
- scannerDir = 1;
- }
- if (scannerPos < 12 || scannerPos >= 44) {
- stripTop.setPixelColor(scannerPos, stripTop.Color(255, 0, 0));
- } else {
- stripTop.setPixelColor(scannerPos, stripTop.Color(255, 255, 255));
- }
- stripTop.show();
- }
- }
- // ======================================================
- // BANDEAU BAS — RÉACTIF AU SON (Luminosité Rouge Réduite Globalement)
- // ======================================================
- void updateBottomAudioReactive() {
- int sensorValue = analogRead(MIC_PIN);
- // Recentrage sur 0 (le silence est au milieu à 512 sur Arduino)
- int amplitude = abs(sensorValue - 512);
- // Filtre anti-bruit (si c'est < 30, on considère que c'est du silence)
- if (amplitude < 30) amplitude = 0;
- // --- ROUGE (Base + Son) ---
- // Mapper l'amplitude à la luminosité rouge.
- // La plage de sortie est ajustée pour avoir une très faible luminosité au repos.
- int rawBrightness = map(amplitude, 0, 512, 5, 255);
- // Appliquer une réduction de 15% à la luminosité calculée.
- // Pour réduire de 15%, on multiplie par (100 - 15) / 100 = 0.85
- int redBrightness = rawBrightness * 0.85;
- // On s'assure que la luminosité ne dépasse pas 255 et ne descend pas trop bas.
- if (redBrightness > 255) redBrightness = 255;
- if (redBrightness < 5) redBrightness = 5; // Garder un minimum visible
- // Pour le moment, on ne modifie que la composante rouge.
- // Les composantes verte et bleue restent à 0 pour un rouge pur.
- uint32_t color = stripBottom.Color(redBrightness, 0, 0);
- for (int i = 0; i < LED_BOTTOM; i++) {
- stripBottom.setPixelColor(i, color);
- }
- stripBottom.show();
- }
- // ======================================================
- // FONCTIONS LED — UTILITAIRES
- // ======================================================
- void setRougeFlash() {
- for (int i = 0; i < 12; i++) stripTop.setPixelColor(i, stripTop.Color(255, 0, 0));
- for (int i = 44; i < 68; i++) stripTop.setPixelColor(i, stripTop.Color(255, 0, 0));
- }
- void setRougeNormal() {
- for (int i = 0; i < 12; i++) stripTop.setPixelColor(i, stripTop.Color(40, 0, 0));
- for (int i = 44; i < 68; i++) stripTop.setPixelColor(i, stripTop.Color(40, 0, 0));
- }
- void setBlancFixe() {
- for (int i = 12; i < 44; i++) stripTop.setPixelColor(i, stripTop.Color(60, 60, 60));
- }
Advertisement
Add Comment
Please, Sign In to add comment