Advertisement
safwan092

Untitled

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