Advertisement
Guest User

OpenLEDRACER-3joueurs

a guest
Jan 17th, 2020
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.10 KB | None | 0 0
  1. /*
  2. * ____ _ ______ _____ _____
  3. / __ \ | | | ____| __ \ | __ \
  4. | | | |_ __ ___ _ __ | | | |__ | | | | | |__) |__ _ ___ ___
  5. | | | | '_ \ / _ \ '_ \ | | | __| | | | | | _ // _` |/ __/ _ \
  6. | |__| | |_) | __/ | | | | |____| |____| |__| | | | \ \ (_| | (_| __/
  7. \____/| .__/ \___|_| |_| |______|______|_____/ |_| \_\__,_|\___\___|
  8. | |
  9. |_|
  10. Open LED Race
  11. An minimalist cars race for LED strip
  12.  
  13. This program is free software; you can redistribute it and/or modify
  14. it under the terms of the GNU General Public License as published by
  15. the Free Software Foundation; either version 3 of the License, or
  16. (at your option) any later version.
  17.  
  18. by gbarbarov@singulardevices.com for Arduino day Seville 2019
  19.  
  20. Code made dirty and fast, next improvements in:
  21. https://github.com/gbarbarov/led-race
  22. https://www.hackster.io/gbarbarov/open-led-race-a0331a
  23. https://twitter.com/openledrace
  24. */
  25.  
  26.  
  27. #include <Adafruit_NeoPixel.h>
  28. #define MAXLED 300 // MAX LEDs actives on strip
  29.  
  30. #define PIN_LED A0 // R 500 ohms to DI pin for WS2812 and WS2813, for WS2813 BI pin of first LED to GND , CAP 1000 uF to VCC 5v/GND,power supplie 5V 2A
  31. #define PIN_P1 7 // switch player 1 to PIN and GND
  32. #define PIN_P2 6 // switch player 2 to PIN and GND
  33. #define PIN_P3 5 // switch player 2 to PIN and GND
  34. #define PIN_AUDIO 3 // through CAP 2uf to speaker 8 ohms
  35.  
  36.  
  37. int NPIXELS=MAXLED; // leds on track
  38.  
  39. #define COLOR1 track.Color(255,0,0) // rouge
  40. #define COLOR2 track.Color(0,255,0) // vert
  41. #define COLOR3 track.Color(0,0,255) // bleu
  42.  
  43. int win_music[] = {
  44. 2637, 2637, 0, 2637,
  45. 0, 2093, 2637, 0,
  46. 3136, 2637, 0, 2637,
  47. 0, 2093, 2637, 0,
  48. 3136, 2637, 2637, 0, 2637,
  49. 0, 2093, 2637, 0,
  50. 3136, 2637, 0, 2637,
  51. 0, 2093, 2637, 0,
  52. 3136, 0, 250,250,1500,250,250, 750,
  53. 250,250,750,250,750 // cette musique peut-être modifiée
  54. };
  55.  
  56. byte gravity_map[MAXLED];
  57.  
  58. int TBEEP=3;
  59.  
  60. float speed1=0;
  61. float speed2=0;
  62. float speed3=0;
  63.  
  64. float dist1=0;
  65. float dist2=0;
  66. float dist3=0;
  67.  
  68. byte loop1=0;
  69. byte loop2=0;
  70. byte loop3=0;
  71.  
  72. byte leader=0;
  73. byte loop_max=5; //total laps race
  74.  
  75.  
  76. float ACEL=0.2;
  77. float kf=0.015; //friction constant
  78. float kg=0.003; //gravity constant
  79.  
  80. byte flag_sw1=0;
  81. byte flag_sw2=0;
  82. byte flag_sw3=0;
  83. byte draworder=0;
  84.  
  85. unsigned long timestamp=0;
  86.  
  87. Adafruit_NeoPixel track = Adafruit_NeoPixel(MAXLED, PIN_LED, NEO_GRB + NEO_KHZ800);
  88.  
  89. int tdelay = 5;
  90.  
  91. void set_ramp(byte H,byte a,byte b,byte c)
  92. {for(int i=0;i<(b-a);i++){gravity_map[a+i]=127-i*((float)H/(b-a));};
  93. gravity_map[b]=127;
  94. for(int i=0;i<(c-b);i++){gravity_map[b+i+1]=127+H-i*((float)H/(c-b));};
  95. }
  96.  
  97. void set_loop(byte H,byte a,byte b,byte c)
  98. {for(int i=0;i<(b-a);i++){gravity_map[a+i]=127-i*((float)H/(b-a));};
  99. gravity_map[b]=255;
  100. for(int i=0;i<(c-b);i++){gravity_map[b+i+1]=127+H-i*((float)H/(c-b));};
  101. }
  102.  
  103.  
  104. void setup() {
  105. for(int i=0;i<NPIXELS;i++){gravity_map[i]=127;};
  106. track.begin();
  107. pinMode(PIN_P1,INPUT_PULLUP);
  108. pinMode(PIN_P2,INPUT_PULLUP);
  109. pinMode(PIN_P3,INPUT_PULLUP);
  110.  
  111. if ((digitalRead(PIN_P1)==0)) //push switch 1 on reset for activate physic
  112. {
  113. set_ramp(12,90,100,110); // ramp centred in LED 100 with 10 led fordward and 10 backguard
  114. for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,0,(127-gravity_map[i])/8) );};
  115. track.show();
  116. };
  117. start_race();
  118. }
  119.  
  120. void start_race(){for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,0,0));};
  121. track.show();
  122. delay(2000);
  123. track.setPixelColor(12, track.Color(0,255,0));
  124. track.setPixelColor(11, track.Color(0,255,0));
  125. track.show();
  126. tone(PIN_AUDIO,400);
  127. delay(2000);
  128. noTone(PIN_AUDIO);
  129. track.setPixelColor(12, track.Color(0,0,0));
  130. track.setPixelColor(11, track.Color(0,0,0));
  131. track.setPixelColor(10, track.Color(255,255,0));
  132. track.setPixelColor(9, track.Color(255,255,0));
  133. track.show();
  134. tone(PIN_AUDIO,600);
  135. delay(2000);
  136. noTone(PIN_AUDIO);
  137. track.setPixelColor(9, track.Color(0,0,0));
  138. track.setPixelColor(10, track.Color(0,0,0));
  139. track.setPixelColor(8, track.Color(255,0,0));
  140. track.setPixelColor(7, track.Color(255,0,0));
  141. track.show();
  142. tone(PIN_AUDIO,1200);
  143. delay(2000);
  144. noTone(PIN_AUDIO);
  145. timestamp=0;
  146. };
  147.  
  148. void winner_fx() {
  149. int msize = sizeof(win_music) / sizeof(int);
  150. for (int note = 0; note < msize; note++) {
  151. tone(PIN_AUDIO, win_music[note],200);
  152. delay(230);
  153. noTone(PIN_AUDIO);
  154.  
  155. }
  156.  
  157.  
  158. };
  159.  
  160. void burning1(){
  161. //to do
  162. }
  163.  
  164. void burning2(){
  165. //to do
  166. }
  167.  
  168. void burning3(){
  169. //to do
  170. }
  171.  
  172. void track_rain_fx(){
  173. //to do
  174. }
  175.  
  176. void track_oil_fx(){
  177. //to do
  178. }
  179.  
  180. void track_snow_fx(){
  181. //to do
  182. }
  183.  
  184.  
  185. void fuel_empty(){
  186. //to do
  187. }
  188.  
  189. void fill_fuel_fx(){
  190. //to do
  191. }
  192.  
  193. void in_track_boxs_fx(){
  194. //to do
  195. }
  196.  
  197. void pause_track_boxs_fx(){
  198. //to do
  199. }
  200.  
  201. void flag_boxs_stop(){
  202. //to do
  203. }
  204.  
  205. void flag_boxs_ready(){
  206. //to do
  207. }
  208.  
  209. void draw_safety_car(){
  210. //to do
  211. }
  212.  
  213. void telemetry_rx(){
  214. //to do
  215. }
  216.  
  217. void telemetry_tx(){
  218. //to do
  219. }
  220.  
  221. void telemetry_lap_time_car1(){
  222. //to do
  223. }
  224.  
  225. void telemetry_lap_time_car2(){
  226. //to do
  227. }
  228.  
  229. void telemetry_record_lap(){
  230. //to do
  231. }
  232.  
  233. void telemetry_total_time(){
  234. //to do
  235. }
  236.  
  237. int read_sensor(byte player){
  238. //to do
  239. }
  240.  
  241. int calibration_sensor(byte player){
  242. //to do
  243. }
  244.  
  245. int display_lcd_laps(){
  246. //to do
  247. }
  248.  
  249. int display_lcd_time(){
  250. //to do
  251. }
  252.  
  253.  
  254.  
  255. void draw_car1(void){for(int i=0;i<=loop1;i++){track.setPixelColor(((word)dist1 % NPIXELS)+i, track.Color(0,255-i*20,0));};
  256. }
  257.  
  258. void draw_car2(void){for(int i=0;i<=loop2;i++){track.setPixelColor(((word)dist2 % NPIXELS)+i, track.Color(0,0,255-i*20));};
  259. }
  260.  
  261. void draw_car3(void){for(int i=0;i<=loop3;i++){track.setPixelColor(((word)dist3 % NPIXELS)+i, track.Color(255-i*20,0,0));};
  262. }
  263.  
  264. void loop() {
  265. //for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,0,0));};
  266. for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,0,(127-gravity_map[i])/8) );};
  267.  
  268. if ( (flag_sw1==1) && (digitalRead(PIN_P1)==0) ) {flag_sw1=0;speed1+=ACEL;};
  269. if ( (flag_sw1==0) && (digitalRead(PIN_P1)==1) ) {flag_sw1=1;};
  270.  
  271. if ((gravity_map[(word)dist1 % NPIXELS])<127) speed1-=kg*(127-(gravity_map[(word)dist1 % NPIXELS]));
  272. if ((gravity_map[(word)dist1 % NPIXELS])>127) speed1+=kg*((gravity_map[(word)dist1 % NPIXELS])-127);
  273.  
  274.  
  275. speed1-=speed1*kf;
  276.  
  277. if ( (flag_sw2==1) && (digitalRead(PIN_P2)==0) ) {flag_sw2=0;speed2+=ACEL;};
  278. if ( (flag_sw2==0) && (digitalRead(PIN_P2)==1) ) {flag_sw2=1;};
  279.  
  280. if ((gravity_map[(word)dist2 % NPIXELS])<127) speed2-=kg*(127-(gravity_map[(word)dist2 % NPIXELS]));
  281. if ((gravity_map[(word)dist2 % NPIXELS])>127) speed2+=kg*((gravity_map[(word)dist2 % NPIXELS])-127);
  282.  
  283. speed2-=speed2*kf;
  284.  
  285. if ( (flag_sw3==1) && (digitalRead(PIN_P3)==0) ) {flag_sw3=0;speed3+=ACEL;};
  286. if ( (flag_sw3==0) && (digitalRead(PIN_P3)==1) ) {flag_sw3=1;};
  287.  
  288. if ((gravity_map[(word)dist2 % NPIXELS])<127) speed3-=kg*(127-(gravity_map[(word)dist3 % NPIXELS]));
  289. if ((gravity_map[(word)dist2 % NPIXELS])>127) speed3+=kg*((gravity_map[(word)dist3 % NPIXELS])-127);
  290.  
  291. speed3-=speed3*kf;
  292.  
  293. dist1+=speed1;
  294. dist2+=speed2;
  295. dist3+=speed3;
  296.  
  297. if (dist1>dist2 && dist1>dist3) {leader=1;}
  298. if (dist2>dist1 && dist2>dist3) {leader=2;}
  299. if (dist3>dist1 && dist3>dist2) {leader=3;};
  300.  
  301.  
  302. if (dist1>NPIXELS*loop1) {loop1++;tone(PIN_AUDIO,600);TBEEP=2;};
  303. if (dist2>NPIXELS*loop2) {loop2++;tone(PIN_AUDIO,700);TBEEP=2;};
  304. if (dist3>NPIXELS*loop3) {loop3++;tone(PIN_AUDIO,500);TBEEP=2;};
  305.  
  306. if (loop1>loop_max) {for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,255,0));}; track.show();
  307. winner_fx();loop1=0;loop2=0;loop3=0;dist1=0;dist2=0;dist3=0;speed1=0;speed2=0;speed3=0;timestamp=0;
  308. start_race();
  309. }
  310. if (loop2>loop_max) {for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(0,0,255));}; track.show();
  311. winner_fx();loop1=0;loop2=0;loop3=0;dist1=0;dist2=0;dist3=0;speed1=0;speed2=0;speed3=0;timestamp=0;
  312. start_race();
  313. }
  314. if (loop3>loop_max) {for(int i=0;i<NPIXELS;i++){track.setPixelColor(i, track.Color(255,0,0));}; track.show();
  315. winner_fx();loop1=0;loop2=0;loop3=0;dist1=0;dist2=0;dist3=0;speed1=0;speed2=0;speed3=0;timestamp=0;
  316. start_race();
  317. }
  318.  
  319. if ((millis() & 512)==(512*draworder)) {if (draworder==0) {draworder=1;}
  320. else {draworder=0;}
  321. };
  322.  
  323. if (draworder==0) {draw_car1();draw_car2();draw_car3();}
  324. else {draw_car3();draw_car2();draw_car1();}
  325.  
  326. track.show();
  327. delay(tdelay);
  328.  
  329. if (TBEEP>0) {TBEEP-=1;
  330. if (TBEEP==0) {noTone(PIN_AUDIO);}; // lib conflict !!!! interruption off by neopixel
  331. };
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement