// Created by RadBench: youtube.com/radbenchyt // Made for A flux Capacitor with a 10 light NanoLed strip // DFPlayer Stuff #include "Arduino.h" #include "SoftwareSerial.h" #include "DFRobotDFPlayerMini.h" SoftwareSerial mySoftwareSerial(10, 11); // RX, TX DFRobotDFPlayerMini myDFPlayer; void printDetail(uint8_t type, int value); /////////////////////////////////////////////////////////////////////////////////////////// //IR uint32_t Previous; #include int receiver = 3; // initialize pin 3 as the receiver pin IRrecv irrecv(receiver); //Create new instance of receiver decode_results results; //Remote #define button_1 0xFE01EF00 #define button_2 0xFB04EF00 #define button_3 0xFA05EF00 #define button_4 0xF906EF00 #define button_5 0xF807EF00 #define button_6 0xF708EF00 #define button_7 0xF609EF00 #define button_8 0xF50AEF00 #define button_9 0xF30CEF00 #define buttonStop 0xF30CEF00f #define volUp 0xF20DEF00 #define volDwn 0xF720DF #define btnUp 0xF00FEF00 #define btnDown 0xEF10EF00 #define powerButton 0xEE11EF00 bool isPlaying = false; // Indique si la musique est en cours int lastTrack = 1; // Dernier morceau joué (par exemple 1 par défaut) /////////////////////////////////////////////////////////////////////////////////////////// // LEDS uint8_t hue = 0; #include #define NUM_LEDS 22 #define DATA_PIN 5 #define CLOCK_PIN 13 #define ledColor Yellow int delaySpeed = 80; const unsigned long eventInterval = 1000; unsigned long previousTime = 0; int timeTravel; int smoothChase; int movieChase; int movieSpeed = 34.45; int movieChaseSimple; int thirtyChase; int radChase; int radChase2; int rainbowChase; // This is an array of leds. One item for each led in your strip. CRGB leds[NUM_LEDS]; /////////////////////////////////////////////////////////////////////////////////////////// void setup() { // Single LED pinMode(12, OUTPUT); // DFPlayer Setup mySoftwareSerial.begin(9600); Serial.begin(115200); Serial.println(); Serial.println(F("DFRobot DFPlayer Mini Demo")); Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)")); if (!myDFPlayer.begin(mySoftwareSerial)) { //Use softwareSerial to communicate with mp3. Serial.println(F("Unable to begin:")); Serial.println(F("1.Please recheck the connection!")); Serial.println(F("2.Please insert the SD card!")); while (true); } Serial.println(F("DFPlayer Mini online.")); myDFPlayer.volume(29); //Set volume value. From 0 to 30 // STARTUP SOUND AND CHASE myDFPlayer.playMp3Folder(2); //Play mp3 delay(600); radChase2 = 1; // End DFPLayer Setup // IR setup irrecv.enableIRIn(); //Start the receiver // LED Setup /////////////////////////////////////////////////////// FastLED.addLeds(leds, NUM_LEDS); // GRB ordering is typical FastLED.setMaxPowerInVoltsAndMilliamps(5, 500); FastLED.clear(); } void loop() { while (!irrecv.isIdle()); // if not idle, wait till complete if (irrecv.decode(&results)) { // if we have received an IR Signal Serial.println (results.value, HEX); // display HEX results if (results.value == 0xFFFFFFFF) { results.value = Previous; } switch (results.value) { case button_1: // time travel timeTravel = 1; smoothChase = 0; movieChase = 0; thirtyChase = 0; movieChaseSimple = 0; radChase = 0; radChase2 = 0; rainbowChase = 0; // set delay speed for time travel delaySpeed = 113; // play audio track 1 myDFPlayer.playMp3Folder(1); //play specific mp3 in SD:/MP3/0004.mp3; File Name(0~65535) lastTrack = 1; // numéro de la piste lancée isPlaying = true; break; case powerButton: smoothChase = 0; timeTravel = 0; myDFPlayer.stop(); timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 0; radChase = 0; radChase2 = 0; rainbowChase = 0; FastLED.clear(); FastLED.show(); break; case button_9: // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(6); lastTrack = 6; // numéro de la piste lancée isPlaying = true; break; case button_2: // smooth chase // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(3); lastTrack = 3; // numéro de la piste lancée isPlaying = true; timeTravel = 0; smoothChase = 1; movieChase = 0; movieChaseSimple = 0; thirtyChase = 0; radChase = 0; radChase2 = 0; rainbowChase = 0; delaySpeed = 80; Serial.println("button_2 Pressed. smoothChase:"); break; case button_3: // thirty fps // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(4); lastTrack = 4; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 33.33; timeTravel = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 0; thirtyChase = 1; radChase = 0; radChase2 = 0; rainbowChase = 0; Serial.println("button_3 Pressed. 30fps"); break; case button_4: // 24 fps //imitating 6 leds from film // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(5); lastTrack = 5; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 22.97; // set loop timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 1; movieChaseSimple = 0; radChase = 0; radChase2 = 0; rainbowChase = 0; Serial.println("button_4 Pressed. Movie Chase 24fps"); break; case button_5: //24 fps simple // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(3); lastTrack = 3; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 34.45; // set loop timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 1; radChase = 0; radChase2 = 0; rainbowChase = 0; Serial.println("button_5 Pressed. 24FPS simple"); break; case button_6: //Rad Chase // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(4); lastTrack = 4; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 66.66; // set loop timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 0; radChase = 1; radChase2 = 0; rainbowChase = 0; break; case button_7: //Rad Chase // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(5); lastTrack = 5; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 66.66; // set loop timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 0; radChase = 0; radChase2 = 1; rainbowChase = 0; break; case button_8: //Rainbow Chase // stop current audio and play audio track myDFPlayer.stop(); myDFPlayer.playMp3Folder(5); lastTrack = 5; // numéro de la piste lancée isPlaying = true; //set movie speed movieSpeed = 66.66; // set loop timeTravel = 0; thirtyChase = 0; smoothChase = 0; movieChase = 0; movieChaseSimple = 0; radChase = 0; radChase2 = 0; rainbowChase = 1; break; case buttonStop: // ou un autre bouton si tu préfères if (isPlaying) { myDFPlayer.stop(); isPlaying = false; //Serial.println("Music stopped"); } else { myDFPlayer.playMp3Folder(lastTrack); isPlaying = true; //Serial.print("Music resumed: Track "); //Serial.println(lastTrack); } break; case volUp: { static int currentVolume = 29; currentVolume += 3; // augmente de 10% if (currentVolume > 30) currentVolume = 30; // limite max DFPlayer myDFPlayer.volume(currentVolume); //Serial.print("Volume up -> "); // Serial.println(currentVolume); } break; case volDwn: { static int currentVolume = 29; // volume de départ (ou récupère ton volume réel) currentVolume -= 3; // baisse de 10% if (currentVolume < 0) currentVolume = 0; // Empêche de descendre en dessous de 0 myDFPlayer.volume(currentVolume); // applique le volume //Serial.print("Volume down -> "); //Serial.println(currentVolume); } break; // button up pressed, decrease delay timers - go faster case btnUp: if (movieSpeed > 24) { movieSpeed = movieSpeed - 10; } if (delaySpeed > 20) { delaySpeed = delaySpeed - 20; } // Smaller increments for delay speeds under 20 if (delaySpeed <= 20 && delaySpeed > 4) { delaySpeed = delaySpeed - 4; } //Serial.println("BtnUp pressed"); //Serial.println(movieSpeed); break; // button down pressed increase delays - go slower case btnDown: if (movieSpeed < 200) { movieSpeed = movieSpeed + 10; } if (delaySpeed < 160) { delaySpeed = delaySpeed + 20; } //Serial.println("BtnDown pressed"); //Serial.println(movieSpeed); break; } while (!irrecv.isIdle()); // if not idle, wait till complete irrecv.resume(); // next value } // ----------------- SMOOTH CHASE ------------------------ if (smoothChase == 1) { timeTravel = 0; // delaySpeed = 80; delay(100); // Move LEDS for (int i = 0; i < 16; i = i + 1) { if(i - 6 >= 0) { leds[i - 6] = CHSV(32, 128, 20); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } if(i - 5 >= 0) { leds[i - 5] = CHSV(32, 128, 40); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } if(i - 4 >= 0) { leds[i - 4] = CHSV(32, 128, 70); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } if(i - 3 >= 0) { leds[i - 3] = CHSV(32, 128, 180); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } if(i - 2 >= 0) { leds[i - 2] = CHSV(32, 128, 70); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } if(i - 1 >= 0) { leds[i - 1] = CHSV(32, 128, 40); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; } leds[i] = CHSV(32, 128, 20); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; // Show the leds FastLED.show(); delay(delaySpeed); FastLED.clear(); FastLED.show(); smoothChase = 1; timeTravel = 0; } } // ----------------- MOVIE CHASE - imitates 6 LEDs - matches 24fps speed from the movie------------------------ if (movieChase == 1) { timeTravel = 0; smoothChase = 0; // Move LEDS for (int i = 0; i < 5; i = i + 1) { // LED 1 if(i = 0) { leds[0] = CHSV(22, 200, 100); leds[1] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } // LED 2 if(i = 1) { leds[1] = CHSV(22, 200, 100); leds[2] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } // LED 3 if(i = 2) { leds[2] = CHSV(22, 200, 100); leds[3] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } // LED 4 if(i = 3) { leds[4] = CHSV(22, 200, 15); leds[5] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } // LED 5 if(i = 4) { leds[6] = CHSV(22, 200, 100); leds[7] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } // LED 6 if(i = 5) { leds[8] = CHSV(22, 200, 100); leds[9] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } movieChase = 1; smoothChase = 0; timeTravel = 0; } } // ----------------- RAD CHASE ------------------------ if (radChase == 1) { // Move LEDS for (int i = 0; i < 6; i = i + 1) { if(i = 1) { leds[0] = CHSV(28, 120, 100); leds[1] = CHSV(28, 120, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 2) { leds[2] = CHSV(28, 120, 100); leds[3] = CHSV(28, 120, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 3) { leds[4] = CHSV(28, 120, 100); leds[5] = CHSV(28, 120, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 4) { leds[6] = CHSV(28, 120, 100); leds[7] = CHSV(28, 120, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 5) { leds[8] = CHSV(28, 120, 100); leds[9] = CHSV(28, 120, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } radChase = 1; } } // ----------------- RAD CHASE 2------------------------ if (radChase2 == 1) { // Move LEDS for (int i = 0; i < 10; i = i + 1) { if(i < 10) { leds[i] = CHSV(28, 200, 120); leds[i - 1] = CHSV(28, 200, 30); leds[i + 1] = CHSV(28, 200, 30); FastLED.show(); delay(movieSpeed); FastLED.clear(); } radChase2 = 1; } } // ----------------- MOVIE CHASE SIMPLE ------------------------ if (movieChaseSimple == 1) { // Move LEDS for (int i = 0; i < 5; i = i + 1) { if(i = 1) { leds[2] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 2) { leds[4] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 3) { leds[6] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 4) { leds[8] = CHSV(22, 200, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } movieChaseSimple = 1; } } // ----------------- THIRTY FPS CHASE - For shooting at 30fps------------------------ if (thirtyChase == 1) { // Move LEDS for (int i = 0; i < 5; i = i + 1) { if(i = 1) { leds[0] = CHSV(32, 128, 100); leds[1] = CHSV(32, 128, 100); leds[2] = CHSV(32, 128, 15); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 2) { leds[2] = CHSV(32, 128, 15); leds[3] = CHSV(32, 128, 100); leds[4] = CHSV(32, 128, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 3) { leds[5] = CHSV(32, 128, 100); leds[6] = CHSV(32, 128, 100); leds[7] = CHSV(32, 128, 15); FastLED.show(); delay(movieSpeed); FastLED.clear(); } if(i = 4) { leds[7] = CHSV(32, 128, 15); leds[8] = CHSV(32, 128, 100); leds[9] = CHSV(32, 128, 100); FastLED.show(); delay(movieSpeed); FastLED.clear(); } thirtyChase = 1; } } // ----------------- TimeTravel ------------------------ if (timeTravel == 1) { unsigned long currentTime = millis(); // Move LEDS for (int i = 0; i < 20; i = i + 1) { if (i - 6 >= 0) { leds[i - 6] = CHSV(28, 150, 60); } if (i - 5 >= 0) { leds[i - 5] = CHSV(28, 150, 100); } if (i - 4 >= 0) { leds[i - 4] = CHSV(28, 150, 160); } if (i - 3 >= 0) { leds[i - 3] = CHSV(28, 150, 220); } if (i - 2 >= 0) { leds[i - 2] = CHSV(28, 150, 160); } if (i - 1 >= 0) { leds[i - 1] = CHSV(28, 150, 100); } leds[i] = CHSV(28, 200, 60); leds[10] = CRGB::Black; leds[11] = CRGB::Black; leds[12] = CRGB::Black; leds[13] = CRGB::Black; leds[14] = CRGB::Black; leds[15] = CRGB::Black; leds[16] = CRGB::Black; leds[17] = CRGB::Black; leds[18] = CRGB::Black; leds[19] = CRGB::Black; leds[20] = CRGB::Black; // Show the leds FastLED.show(); FastLED.clear(); timeTravel = 1; // Wait a little bit delay(delaySpeed); } // Reduce delay time so each sequence is faster than the last delaySpeed = delaySpeed * .837; if (delaySpeed < 1) { // leds[5] = CRGB::Black; previousTime = millis(); if (millis() < previousTime + 4000) { // ZIIIP! Moment of time travel digitalWrite(12, HIGH); for(int y = 0; y < 22; y++) { leds[y] = CRGB::Blue; FastLED.show(); } delay(3300); FastLED.clear(); FastLED.show(); // for(int x = 0; x < 9; x++) { // leds[x] = CRGB::Black; // FastLED.show(); // } // Single LED digitalWrite(12, LOW); // Delay after blue light delay(850); // First Burst for (int i = 0; i < 10; i++) { leds[i] = CHSV(28, 110, 120); leds[10] = CRGB::Blue; leds[11] = CRGB::Blue; leds[12] = CRGB::Blue; leds[13] = CRGB::Blue; leds[14] = CRGB::Blue; leds[15] = CRGB::Blue; leds[16] = CRGB::Blue; leds[17] = CRGB::Blue; leds[18] = CRGB::Blue; leds[19] = CRGB::Blue; leds[20] = CRGB::Blue; leds[21] = CRGB::Blue; FastLED.show(); } // Single LED digitalWrite(12, HIGH); delay(300); FastLED.clear(); FastLED.show(); // Single LED digitalWrite(12, LOW); delay(400); // Second Burst for (int i = 0; i < 21; i++) { leds[i] = CHSV(28, 110, 120); leds[10] = CRGB::Blue; leds[11] = CRGB::Blue; leds[12] = CRGB::Blue; leds[13] = CRGB::Blue; leds[14] = CRGB::Blue; leds[15] = CRGB::Blue; leds[16] = CRGB::Blue; leds[17] = CRGB::Blue; leds[18] = CRGB::Blue; leds[19] = CRGB::Blue; leds[20] = CRGB::Blue; leds[21] = CRGB::Blue; FastLED.show(); } // Single LED digitalWrite(12, HIGH); delay(1000); delaySpeed = 80; timeTravel = 0; smoothChase = 1; FastLED.clear(); FastLED.show(); // Single LED digitalWrite(12, LOW); // chase(); // exit(0); // reset(); } } } // ------------ END timeTravel -------------------- // ----------------- RAINBOW CHASE ------------------------ if (rainbowChase == 1) { for (int i = 0; i < 10; i++) { leds[i] = CHSV(hue + (i * 10), 255, 150); } for (int y = 10; y > 9 && y < 22; ++y) { leds[y] = CHSV(hue + (y * 10), 255, 250); } //You can change the pattern speed here EVERY_N_MILLISECONDS(1){ hue++; } FastLED.show(); rainbowChase = 1; } }