Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // Claude DUFOURMONT Le 21/12/2021
- // Réalisation d'une boîte à musique avec animation lumineuse
- // Correction logarithmique du volume par code
- // Rajout de tempo pour coupure d'alimentation : MosfetGate passe à LOW dés que le temps écoulé est supérieur à interval
- // La tempo fonctionne avec une animation lumineuse, mais avec une durée supplémentaire imputable au déroulement del'animation
- // MosfetGate vient agir sur un BD232 (BJT NPN Puissance)via un optocoupleur pour couper le VCC des matrices => Ok (ne marche pas par coupure 0V),ce n'est pas l'isolement
- // galvanique qui est recherché, c'est une astuce de circuiterie
- // MosfetGate vient agir sur Mosfet canal N directement pour couper le 0V du DFPlayermini ==> Ok
- // Ajout de plusieurs scenariis d'animation lumineuse, bien sur le temps augmente
- // Rajout Mosfet et BP sur +Vcc XIAO pour pouvoir le faire redémarrer ==> Ok ++++++++++++ ANNULE +++++++++++
- // Rajout d'un BP d'interruption pour mettre la sortie MosfetGate à zéro
- // Rajout d'un BP d'interruption pour mettre la musique sur pause
- // Rajout d'un BP d'interruption pour mettre la musique sur start
- // Mise en place de 4 condensateurs (20nF) et résistances PullUp (12K) pour éviter les rebonds
- // <<<<<<<<<<<<<<<<Il existe encore des bugs : les interruptions bloquent parfois le programme et parfois on ne sait pas redémarrer le programme, il faut razzr>>>>>>>>>>>>>>>
- // Rajout d'un fil par soudure sur le Pad RESET : Attention fil souple uniquement, si c'est un PINHEADER, le Pad sera arraché en cas de flexion
- // Seeeduino XIAO et DFPlayer mini
- // Remise au propre des breadboard faite, avec réaffectation des ports.
- // Schéma utilisé : en cours de mise à jour.
- // Le potar son estpris en compte à chaque redémarrage
- //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
- // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!EN DEVELOPPEMENT!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
- // ***********************************************************ATTENTION LE POTAR DE SON N'EST PLUS PRIS EN COMPTE **????*****************************************************
- #include <SoftwareSerial.h>
- #include "DFRobotDFPlayerMini.h"
- #include <Adafruit_NeoPixel.h>
- #include <math.h>
- float ratio; // Pour log
- float ratio1024; // Pour log
- SoftwareSerial mySoftwareSerial(1,2); // RX, TX
- #define TX 1
- #define potPinSound A3
- #define potPinInterval A4
- #define MosfetGate 5
- #define BPMosfetGate 7 // 1 (vert) fil blanc
- int etatBPMosfetGate = LOW;
- #define BPPause 8 // 2 (jaune) fil jaune
- int etatBPPause = LOW;
- #define BPStart 9 // 3 (jaune) fil noir
- int etatBPStart = LOW;
- #define BPAux 10 // 4 (jaune) fil vert
- int etatBPAux = LOW;
- #define LED_PIN1 6
- #define NUM_LEDS1 100
- Adafruit_NeoPixel strip1(NUM_LEDS1, LED_PIN1, NEO_GRB + NEO_KHZ800);
- DFRobotDFPlayerMini myDFPlayer;
- byte volumeLevel; //variable for holding volume level;
- float a;
- byte colors[3][3] = { {0xff, 0,0},
- {0xff, 0xff, 0xff},
- {0 , 0 , 0xff} };
- // RunningLights(0xff,0,0, 50); // red
- // RunningLights(0xff,0xff,0xff, 50); // white
- //RunningLights(0,0,0xff, 50); // blue
- void setup()
- {
- pinMode (MosfetGate, OUTPUT);
- digitalWrite (MosfetGate, HIGH);
- delay(300); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Attention tempo très importante sinon le DFPlayer mini ne démarre pas <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
- attachInterrupt(BPMosfetGate, traite_int1, FALLING);
- attachInterrupt(BPPause, traite_int2, FALLING);
- attachInterrupt(BPStart, traite_int3, FALLING);
- //attachInterrupt(BPStart, traite_int4, FALLING);
- double y = 1025; // Pour log
- double LOG1025 = log10 (y); // Pour log
- a= analogRead(potPinSound); // Pour log
- double x = a; // Pour log
- double LOG10x = log10 (x);
- ratio = log10 (x) / log10 (y); // Pour log
- ratio1024 = ratio*1024; // Pour log
- //-------------------------------------------------------------------------------------------------------------------------------------------------------------
- //volumeLevel = map(analogRead(potPin), 0, 1023, 0, 30);
- //------------------------------------------------------- OU ----------------------------------------------------
- volumeLevel = map(ratio1024, 0, 1023, 0, 30);
- //-------------------------------------------------------------------------------------------------------------------------------------------------------------
- mySoftwareSerial.begin(9600);
- myDFPlayer.begin (mySoftwareSerial);
- myDFPlayer.volume(volumeLevel);
- myDFPlayer.loop(6);
- //delay (1000);
- strip1.begin();
- strip1.show();
- strip1.setBrightness(1);
- }
- void loop()
- {
- const long interval = 50000000;
- unsigned long previousMillis = 0;
- unsigned long currentMillis = millis();
- if (currentMillis - previousMillis >= interval)
- {
- digitalWrite (MosfetGate, LOW);
- delay (10);
- strip1.clear();
- strip1.show();
- delay (10);
- previousMillis = currentMillis;
- }
- volumeLevel= 0;
- delay(10);
- strip1.clear();
- byte colors[3][3] = { {0xff, 0,0},
- {0xff, 0xff, 0xff},
- {0 , 0 , 0xff} };
- //BouncingColoredBalls(3, colors);
- rainbow(.0001);
- theaterChaseRainbow(50);
- meteorRain(0xff,0xff,0xff,20, 5, false, 0);
- RGBLoop();
- TwinkleRandom(20, 5, false);
- rainbowCycle(20);
- meteorRain(0xff,0xff,0xff,5, 60, false, 0);
- FadeInOut(0x00, 0x00, 0xff); // blue
- RunningLights(0,0,0xff, 50); // blue
- Strobe(0xff, 0xff, 0xff, 10, 50, 1000);
- NewKITT(0xff, 0, 0, 8, 10, 50);SnowSparkle(0x10, 0x10, 0x10, 20, 200);
- CylonBounce(0xff, 0, 0, 4, 10, 50);
- }
- //*****************************************************************************************************************************************
- void showStrip() {
- #ifdef ADAFRUIT_NEOPIXEL_H
- strip1.show();
- #endif
- #ifndef ADAFRUIT_NEOPIXEL_H
- #endif
- }
- void setPixel(int Pixel, byte red, byte green, byte blue) {
- #ifdef ADAFRUIT_NEOPIXEL_H
- strip1.setPixelColor(Pixel, strip1.Color(red, green, blue));
- #endif
- #ifndef ADAFRUIT_NEOPIXEL_H
- #endif
- }
- void setAll(byte red, byte green, byte blue) {
- for(int i = 0; i < NUM_LEDS1; i++ ) {
- setPixel(i, red, green, blue);
- }
- showStrip();
- }
- //*****************************************************************************************************************************************
- void meteorRain(byte red, byte green, byte blue, byte meteorSize, byte meteorTrailDecay, boolean meteorRandomDecay, int SpeedDelay) {
- setAll(0,0,0);
- for(int i = 0; i < NUM_LEDS1+NUM_LEDS1; i++) {
- for(int j=0; j<NUM_LEDS1; j++) {
- if( (!meteorRandomDecay) || (random(10)>5) ) {
- fadeToBlack(j, meteorTrailDecay );
- }
- }
- for(int j = 0; j < meteorSize; j++) {
- if( ( i-j <NUM_LEDS1) && (i-j>=0) ) {
- setPixel(i-j, red, green, blue);
- }
- }
- showStrip();
- delay(SpeedDelay);
- }
- }
- void theaterChaseRainbow(int SpeedDelay)
- {
- byte *c;
- for (int j=0; j < 256; j++)
- { // cycle all 256 colors in the wheel
- for (int q=0; q < 3; q++)
- {
- for (int i=0; i < NUM_LEDS1; i=i+3)
- {
- c = Wheel( (i+j) % 255);
- setPixel(i+q, *c, *(c+1), *(c+2)); //turn every third pixel on
- }
- showStrip();
- delay(SpeedDelay);
- for (int i=0; i < NUM_LEDS1; i=i+3)
- {
- setPixel(i+q, 0,0,0); //turn every third pixel off
- }
- }
- }
- }
- void fadeToBlack(int ledNo, byte fadeValue) {
- #ifdef ADAFRUIT_NEOPIXEL_H
- uint32_t oldColor;
- uint8_t r, g, b;
- int value;
- oldColor = strip1.getPixelColor(ledNo);
- r = (oldColor & 0x00ff0000UL) >> 16;
- g = (oldColor & 0x0000ff00UL) >> 8;
- b = (oldColor & 0x000000ffUL);
- r=(r<=10)? 0 : (int) r-(r*fadeValue/256);
- g=(g<=10)? 0 : (int) g-(g*fadeValue/256);
- b=(b<=10)? 0 : (int) b-(b*fadeValue/256);
- strip1.setPixelColor(ledNo, r,g,b);
- #endif
- #ifndef ADAFRUIT_NEOPIXEL_H
- #endif
- }
- void RunningLights(byte red, byte green, byte blue, int WaveDelay) {
- int Position=0;
- for(int j=0; j<NUM_LEDS1*2; j++)
- {
- Position++; // = 0; //Position + Rate;
- for(int i=0; i<NUM_LEDS1; i++) {
- // sine wave, 3 offset waves make a rainbow!
- //float level = sin(i+Position) * 127 + 128;
- //setPixel(i,level,0,0);
- //float level = sin(i+Position) * 127 + 128;
- setPixel(i,((sin(i+Position) * 127 + 128)/255)*red,
- ((sin(i+Position) * 127 + 128)/255)*green,
- ((sin(i+Position) * 127 + 128)/255)*blue);
- }
- showStrip();
- delay(WaveDelay);
- }
- }
- void SnowSparkle(byte red, byte green, byte blue, int SparkleDelay, int SpeedDelay) {
- setAll(red,green,blue);
- int Pixel = random(NUM_LEDS1);
- setPixel(Pixel,0xff,0xff,0xff);
- showStrip();
- delay(SparkleDelay);
- setPixel(Pixel,red,green,blue);
- showStrip();
- delay(SpeedDelay);
- }
- void CylonBounce(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){
- for(int i = 0; i < NUM_LEDS1-EyeSize-2; i++) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- for(int i = NUM_LEDS1-EyeSize-2; i > 0; i--) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- }
- void NewKITT(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay){
- RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- LeftToRight(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- RightToLeft(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- OutsideToCenter(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- CenterToOutside(red, green, blue, EyeSize, SpeedDelay, ReturnDelay);
- }
- void CenterToOutside(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
- for(int i =((NUM_LEDS1-EyeSize)/2); i>=0; i--) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- setPixel(NUM_LEDS1-i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(NUM_LEDS1-i-j, red, green, blue);
- }
- setPixel(NUM_LEDS1-i-EyeSize-1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- }
- void OutsideToCenter(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
- for(int i = 0; i<=((NUM_LEDS1-EyeSize)/2); i++) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- setPixel(NUM_LEDS1-i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(NUM_LEDS1-i-j, red, green, blue);
- }
- setPixel(NUM_LEDS1-i-EyeSize-1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- }
- void LeftToRight(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
- for(int i = 0; i < NUM_LEDS1-EyeSize-2; i++) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- }
- void RightToLeft(byte red, byte green, byte blue, int EyeSize, int SpeedDelay, int ReturnDelay) {
- for(int i = NUM_LEDS1-EyeSize-2; i > 0; i--) {
- setAll(0,0,0);
- setPixel(i, red/10, green/10, blue/10);
- for(int j = 1; j <= EyeSize; j++) {
- setPixel(i+j, red, green, blue);
- }
- setPixel(i+EyeSize+1, red/10, green/10, blue/10);
- showStrip();
- delay(SpeedDelay);
- }
- delay(ReturnDelay);
- }
- void Strobe(byte red, byte green, byte blue, int StrobeCount, int FlashDelay, int EndPause){
- for(int j = 0; j < StrobeCount; j++) {
- setAll(red,green,blue);
- showStrip();
- delay(FlashDelay);
- setAll(0,0,0);
- showStrip();
- delay(FlashDelay);
- }
- delay(EndPause);
- }
- void FadeInOut(byte red, byte green, byte blue){
- float r, g, b;
- for(int k = 0; k < 256; k=k+1) {
- r = (k/256.0)*red;
- g = (k/256.0)*green;
- b = (k/256.0)*blue;
- setAll(r,g,b);
- showStrip();
- }
- for(int k = 255; k >= 0; k=k-2) {
- r = (k/256.0)*red;
- g = (k/256.0)*green;
- b = (k/256.0)*blue;
- setAll(r,g,b);
- showStrip();
- }
- }
- void colorWipe(byte red, byte green, byte blue, int SpeedDelay) {
- for(uint16_t i=0; i<NUM_LEDS1; i++) {
- setPixel(i, red, green, blue);
- showStrip();
- delay(SpeedDelay);
- }
- }
- void TwinkleRandom(int Count, int SpeedDelay, boolean OnlyOne) {
- setAll(0,0,0);
- for (int i=0; i<Count; i++) {
- setPixel(random(NUM_LEDS1),random(0,255),random(0,255),random(0,255));
- showStrip();
- delay(SpeedDelay);
- if(OnlyOne) {
- setAll(0,0,0);
- }
- }
- delay(SpeedDelay);
- }
- void RGBLoop(){
- for(int j = 0; j < 3; j++ ) {
- // Fade IN
- for(int k = 0; k < 256; k++) {
- switch(j) {
- case 0: setAll(k,0,0); break;
- case 1: setAll(0,k,0); break;
- case 2: setAll(0,0,k); break;
- }
- showStrip();
- delay(3);
- }
- // Fade OUT
- for(int k = 255; k >= 0; k--) {
- switch(j) {
- case 0: setAll(k,0,0); break;
- case 1: setAll(0,k,0); break;
- case 2: setAll(0,0,k); break;
- }
- showStrip();
- delay(3);
- }
- }
- }
- void BouncingColoredBalls(int BallCount, byte colors[][3]) {
- float Gravity = -9.81;
- int StartHeight = 1;
- float Height[BallCount];
- float ImpactVelocityStart = sqrt( -2 * Gravity * StartHeight );
- float ImpactVelocity[BallCount];
- float TimeSinceLastBounce[BallCount];
- int Position[BallCount];
- long ClockTimeSinceLastBounce[BallCount];
- float Dampening[BallCount];
- for (int i = 0 ; i < BallCount ; i++) {
- ClockTimeSinceLastBounce[i] = millis();
- Height[i] = StartHeight;
- Position[i] = 0;
- ImpactVelocity[i] = ImpactVelocityStart;
- TimeSinceLastBounce[i] = 0;
- Dampening[i] = 0.90 - float(i)/pow(BallCount,2);
- }
- while (true) {
- for (int i = 0 ; i < BallCount ; i++) {
- TimeSinceLastBounce[i] = millis() - ClockTimeSinceLastBounce[i];
- Height[i] = 0.5 * Gravity * pow( TimeSinceLastBounce[i]/1000 , 2.0 ) + ImpactVelocity[i] * TimeSinceLastBounce[i]/1000;
- if ( Height[i] < 0 ) {
- Height[i] = 0;
- ImpactVelocity[i] = Dampening[i] * ImpactVelocity[i];
- ClockTimeSinceLastBounce[i] = millis();
- if ( ImpactVelocity[i] < 0.01 ) {
- ImpactVelocity[i] = ImpactVelocityStart;
- }
- }
- Position[i] = round( Height[i] * (NUM_LEDS1 - 1) / StartHeight);
- }
- for (int i = 0 ; i < BallCount ; i++) {
- setPixel(Position[i],colors[i][0],colors[i][1],colors[i][2]);
- }
- showStrip();
- setAll(0,0,0);
- }
- }
- void rainbow(int wait)
- {
- for(long firstPixelHue = 0; firstPixelHue < 5*65536; firstPixelHue += 256)
- {
- for(int i=0; i<strip1.numPixels(); i++)
- {
- int pixelHue = firstPixelHue + (i * 65536L / strip1.numPixels());
- strip1.setPixelColor(i, strip1.gamma32(strip1.ColorHSV(pixelHue)));
- }
- strip1.show();
- delay(wait);
- }
- }
- void traite_int1()
- {
- // fonction exécutée si interruption détectée
- etatBPMosfetGate = !etatBPMosfetGate;
- volumeLevel= 0;
- //digitalWrite(pinled, etat);
- //delay(10);
- digitalWrite (MosfetGate, LOW);
- }
- void traite_int2()
- {
- //pinMode(pinled, OUTPUT);
- //delay(10);
- //digitalWrite(pinled, HIGH);
- myDFPlayer.pause();
- //delay(10);
- }
- void traite_int3()
- {
- //delay(10);
- digitalWrite (MosfetGate, HIGH);
- myDFPlayer.start();
- //delay(10);
- }
- /*void traite_int4()
- {
- delay(10);
- digitalWrite (MosfetGate, HIGH);
- myDFPlayer.start();
- delay(10);
- }*/
- void rainbowCycle(int SpeedDelay) {
- byte *c;
- uint16_t i, j;
- for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
- for(i=0; i< NUM_LEDS1; i++) {
- c=Wheel(((i * 256 / NUM_LEDS1) + j) & 255);
- setPixel(i, *c, *(c+1), *(c+2));
- }
- showStrip();
- delay(SpeedDelay);
- }
- }
- byte * Wheel(byte WheelPos) {
- static byte c[3];
- if(WheelPos < 85) {
- c[0]=WheelPos * 3;
- c[1]=255 - WheelPos * 3;
- c[2]=0;
- } else if(WheelPos < 170) {
- WheelPos -= 85;
- c[0]=255 - WheelPos * 3;
- c[1]=0;
- c[2]=WheelPos * 3;
- } else {
- WheelPos -= 170;
- c[0]=0;
- c[1]=WheelPos * 3;
- c[2]=255 - WheelPos * 3;
- }
- return c;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement