/* * | | | ____| __ \ | __ \ | | | |__ | | | | | |__) |__ _ ___ ___ è | | | __| | | | | | _ // _` |/ __/ _ \ | |____| |____| |__| | | | \ \ (_| | (_| __/ |______|______|_____/ |_| \_\__,_|\___\___| VERSION 4 joueurs FR Ce programme est libre et gratuit ; vous pouvez le distribuez ou le modifié selon les termes du creativesCommons http://creativecommons.org/licenses/by-nc-sa/3.0/ Inspiré du code de @gbarbarov https://www.hackster.io/gbarbarov/open-led-race-a0331a Modifications par Bidouillonant / Antoine ZABERN at Les Petits Débrouillards */ // Branchements #define MAXLED 400 // Nombre de leds (300 = 5m ) #define PIN_LED A0 // Guirlande _ R 500 ohms sur le branchement PIN WS2812 and WS2813 #define PIN_P1 2 // J1 Rouge #define PIN_P2 4 // J2 Vert #define PIN_P3 6 // J3 Bleu #define PIN_P4 8 // J4 Bleu #define PIN_AUDIO 10 // Pin pour haut parler, ajouter Condensateur 2UF // Paramètre de jeu byte loop_max=5; //Nombre de tours float ACEL=0.2; // Acceleration float kf=0.015; // Frottement float kg=0.003; // Gravité #include #define NUMPIXELS 16 // Popular NeoPixel ring size // When setting up the NeoPixel library, we tell it how many pixels, // and which pin to use to send signals. Note that for older NeoPixel // strips you might need to change the third parameter -- see the // strandtest example for more information on possible values. Adafruit_NeoPixel pixels(NUMPIXELS, PIN_LED, NEO_GRB + NEO_KHZ800); #define DELAYVAL 500 // Time (in milliseconds) to pause between pixels // FIN TEST // define frequencies for musical notes //const int c = 261; //const int d = 294; //const int e = 329; //const int f = 349; //const int g = 391; //const int gS = 415; //const int a = 440; //const int aS = 455; //const int b = 466; //const int cH = 523; //const int cSH = 554; //const int dH = 587; //const int dSH = 622; //const int eH = 659; //const int fH = 698; //const int fSH = 740; //const int gH = 784; //const int gSH = 830; //const int aH = 880; int NPIXELS=MAXLED; // leds on track // (Rouge, vert, bleu) #define COLOR1 track.Color(255,0,0) //Rouge #define COLOR2 track.Color(0,255,0) //vert #define COLOR3 track.Color(0,0,255) //bleu #define COLOR4 track.Color(100,255,0) //Jaune int win_music[] = { 698, 659, 698, 659, 523, 440, 587, 440, 50000, // 523, 698, 784, 880, 1046, 880, 587, 659, 587, // 50000, 587, 523, 587, 523, 494, 988, 880, 932, // 880, 784, 880, 698, 988, 880, 698, 988, 830, // 698, 988, 830, 698, 50000, 622, 523, 698 }; int noteDurations[] = { 1000, 250, 250, 500, 750, 250, 500, 1000, 1000, // 250, 1000, 250, 250, 500, 750, 250, 250, 1000, // 1250, 750, 500, 250, 750, 750, 750, 500, 250, // 750, 750, 750, 500, 250, 750, 500, 250, 750, // 500, 250, 750, 750, 500, 250, 250, 1500 }; //durees byte gravity_map[MAXLED]; int TBEEP=3; float speed1=0; float speed2=0; float speed3=0; float speed4=0; float dist1=0; float dist2=0; float dist3=0; float dist4=0; //byte p1joined=0; //byte p2joined=0; //byte p3joined=0; //byte p4joined=0; //byte entryCount=0; //float ramp_variance=127; byte loop1=0; byte loop2=0; byte loop3=0; byte loop4=0; byte leader=0; //byte raceStarted=0; int eyecatcher_pos=0; byte demoMode=1; byte flag_sw1=0; byte flag_sw2=0; byte flag_sw3=0; byte flag_sw4=0; byte draworder=0; unsigned long timestamp=0; unsigned long start_time = millis(); long rand_number; Adafruit_NeoPixel track = Adafruit_NeoPixel(MAXLED, PIN_LED, NEO_GRB + NEO_KHZ800); int tdelay = 3; void set_ramp(byte H,byte a,byte b,byte c) {for(int i=0;i<(b-a);i++){gravity_map[a+i]=127-i*((float)H/(b-a));}; gravity_map[b]=127; for(int i=0;i<(c-b);i++){gravity_map[b+i+1]=127+H-i*((float)H/(c-b));}; } void set_loop(byte H,byte a,byte b,byte c) {for(int i=0;i<(b-a);i++){gravity_map[a+i]=127-i*((float)H/(b-a));}; gravity_map[b]=255; for(int i=0;i<(c-b);i++){gravity_map[b+i+1]=127+H-i*((float)H/(c-b));}; } void setup() { // Serial.begin(9600); // randomSeed(analogRead(0)); // for(int i=0;i20000)) // { // demoMode=1; // } // else if (demoMode==1) // { // if demo mode is active, play random effects // eyecatcher_pos+=1; // if (eyecatcher_pos>5) eyecatcher_pos=1; // start_time=current_time; // switch (eyecatcher_pos) // { // case 1: // tone(PIN_AUDIO,g, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,cH, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,eH, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,gH, 125); // delay(230); // noTone(PIN_AUDIO); // delay(125); // tone(PIN_AUDIO,gH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,gH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,gH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,eH, 125); // delay(230); // noTone(PIN_AUDIO); // delay(125); // tone(PIN_AUDIO,eH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,eH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,eH, 75); // delay(75); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,cH, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,eH, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,cH, 250); // delay(230); // noTone(PIN_AUDIO); // tone(PIN_AUDIO,g, 500); // delay(500); // noTone(PIN_AUDIO); // colorWipe(track.Color(255, 0, 0), 15); // Red // colorWipe(track.Color(0, 255, 0), 15); // Green // colorWipe(track.Color(0, 0, 255), 15); // Blue // colorWipe(track.Color(100, 255, 0), 15); //Yellow // break; // case 2: // // Send a theater pixel chase in... // theaterChase(track.Color(127, 127, 127), 25); // White // theaterChase(track.Color(127, 0, 0), 25); // Red // theaterChase(track.Color( 0, 0, 127), 25); // Blue // break; // case 3: // rainbow(20); // break; // case 4: // rainbowCycle(20); // break; // case 5: // theaterChaseRainbow(50); // break; // } // for(int i=0;i1) && (raceStarted==0)) //push start switch to start race // { // set_ramp(20,47,53,60); // ramp centred in LED 100 with 10 led fordward and 10 backguard // set_ramp(30,200,210,221); // set_loop(16,145,166,190); // for(int i=0;i127) speed1+=kg*((gravity_map[(word)dist1 % NPIXELS])-127); speed1-=speed1*kf; if ( (flag_sw2==1) && (digitalRead(PIN_P2)==0) ) {flag_sw2=0;speed2+=ACEL;} if ( (flag_sw2==0) && (digitalRead(PIN_P2)==1) ) {flag_sw2=1;} if ((gravity_map[(word)dist2 % NPIXELS])<127) speed2-=kg*(127-(gravity_map[(word)dist2 % NPIXELS])); if ((gravity_map[(word)dist2 % NPIXELS])>127) speed2+=kg*((gravity_map[(word)dist2 % NPIXELS])-127); speed2-=speed2*kf; if ( (flag_sw3==1) && (digitalRead(PIN_P3)==0) ) {flag_sw3=0;speed3+=ACEL;} if ( (flag_sw3==0) && (digitalRead(PIN_P3)==1) ) {flag_sw3=1;} if ((gravity_map[(word)dist3 % NPIXELS])<127) speed3-=kg*(127-(gravity_map[(word)dist3 % NPIXELS])); if ((gravity_map[(word)dist3 % NPIXELS])>127) speed3+=kg*((gravity_map[(word)dist3 % NPIXELS])-127); speed3-=speed3*kf; if ( (flag_sw4==1) && (digitalRead(PIN_P4)==0) ) {flag_sw4=0;speed4+=ACEL;} if ( (flag_sw4==0) && (digitalRead(PIN_P4)==1) ) {flag_sw4=1;} if ((gravity_map[(word)dist4 % NPIXELS])<127) speed4-=kg*(127-(gravity_map[(word)dist4 % NPIXELS])); if ((gravity_map[(word)dist4 % NPIXELS])>127) speed4+=kg*((gravity_map[(word)dist4 % NPIXELS])-127); speed4-=speed4*kf; dist1+=speed1; dist2+=speed2; dist3+=speed3; dist4+=speed4; if ((dist1>dist2) && (dist1>dist3) && (dist1>dist4)) {leader=1;} if ((dist2>dist1) && (dist2>dist3) && (dist2>dist4)) {leader=2;} if ((dist3>dist1) && (dist3>dist2) && (dist3>dist4)) {leader=3;} if ((dist4>dist1) && (dist4>dist2) && (dist4>dist3)) {leader=4;} if (dist1>NPIXELS*loop1) {loop1++;tone(PIN_AUDIO,500);TBEEP=2;} if (dist2>NPIXELS*loop2) {loop2++;tone(PIN_AUDIO,600);TBEEP=2;} if (dist3>NPIXELS*loop3) {loop3++;tone(PIN_AUDIO,700);TBEEP=2;} if (dist4>NPIXELS*loop4) {loop4++;tone(PIN_AUDIO,800);TBEEP=2;} if (loop1>loop_max) {for(int i=0;iloop_max) {for(int i=0;iloop_max) {for(int i=0;iloop_max) {for(int i=0;i0) {TBEEP-=1; if (TBEEP==0) {noTone(PIN_AUDIO);}; // lib conflict !!!! interruption off by neopixel }; } // Fill the dots one after the other with a color void colorWipe(uint32_t c, uint8_t wait) { for(uint16_t i=0; i