Advertisement
KelvinMead

Untitled

Apr 11th, 2016
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.81 KB | None | 0 0
  1. #include <Wire.h>
  2. #include <ADXL345.h>
  3. #include <FastLED.h>
  4.  
  5. ADXL345 adxl; //variable adxl is an instance of the ADXL345 library
  6.  
  7. #define NUM_LEDS 12
  8. #define DATA_PIN 3
  9. #define CLOCK_PIN 13
  10. #define BRIGHTNESS 255
  11. #define NUM_LEDS_IN_SEGMENT 2
  12.  
  13. struct CRGB leds[NUM_LEDS];
  14.  
  15. // general variables
  16. int sensitivity = 220; // pitch to define side that is lit
  17. int fadeIn = 10; // fade in led time when moving
  18. int fadeOut = 15; // fade out led time when moving
  19. int state;
  20. int stateOld;
  21. int staticThreshold = 5; // variable to define when the unit is slightly moving
  22. int mode = 3; // 3 initilisation
  23. int modeOld;
  24. int breatheSpeed = 1;
  25. int level = 0;
  26. int levelOld = 0;
  27. int gameEnd = 0;
  28. int gameWin = 0;
  29. int gameLose = 0;
  30. int gameFail = 0;
  31.  
  32.  
  33. // core xyz
  34. int x, y, z;
  35. int xa, ya, za, xb, yb, zb;
  36. int xaOld, yaOld, zaOld, xbOld, ybOld, zbOld;
  37. int fr, ba, le, ri, to, bo;
  38.  
  39. // game variables
  40. //int gameOn = 3000;
  41. //int difficulty = 1;
  42. //int accuracy = 50;
  43. int randNumber;
  44. int randNumberOld;
  45. String sides[6] = {"fr", "ba", "le", "ri", "to", "bo"};
  46. int puzzleSteps = 10;
  47. int puzzleMax = 100;
  48. byte puzzle1[100];
  49. //int puzzle2[10] = {3, 5, 3, 5, 3, 5, 3, 5, 3, 5};
  50.  
  51. byte sideState[6][4] = {
  52. {ba, to, fr, bo},
  53. {ri, to, le, bo},
  54. {ri, ba, le, fr},
  55. {ba, to, fr, bo},
  56. {ri, to, le, bo},
  57. {ri, ba, le, fr}
  58. };
  59.  
  60. // HSV colour values
  61. //0 red, 32 orange, 64 yellow, 96 green, 128 aqua, 160 blue, 192 purple, 224 pink, 255 red
  62. int ledColour = 160;
  63. int ledColourReset = 160;
  64. int ledColourNew;
  65. int ledColourOld;
  66. int gHue = 0;
  67. int ledColourSides;
  68.  
  69. // time variables
  70. unsigned long previousMillisSensor = 0; // will store last time sensor was updated
  71. const long intervalSensor = 1; // interval at which to check sensor
  72. unsigned long previousMillisLeds = 0; // will store last time LED was updated
  73. const long intervalLeds = 100; // interval at which to operate leds
  74. unsigned long previousMillisBreathe = 0; // will store last time sensor was updated
  75. const long intervalBreathe = 5000; // interval at which to check sensor
  76. unsigned long previousMillisGame = 0; // will store last time sensor was updated
  77. const long intervalGame = 10000; // will store last time sensor was updated
  78. unsigned long previousMillisPause = 0; // will store last time sensor was updated
  79. const long intervalPause = 1000; // interval at which to check sensor
  80.  
  81.  
  82. void setup()
  83. {
  84. adxl.powerOn();
  85. //look of tap movement on this axes - 1 == on; 0 == off
  86. // adxl.setTapDetectionOnX(0);
  87. // adxl.setTapDetectionOnY(0);
  88. // adxl.setTapDetectionOnZ(1);
  89. //set values for what is a tap, and what is a double tap (0-255)
  90. // adxl.setTapThreshold(50); //62.5mg per increment
  91. // adxl.setTapDuration(15); //625μs per increment
  92. // adxl.setDoubleTapLatency(80); //1.25ms per increment
  93. // adxl.setDoubleTapWindow(200); //1.25ms per increment
  94. //setting all interupts to take place on int pin 1
  95. //I had issues with int pin 2, was unable to reset it
  96. // adxl.setInterruptMapping( ADXL345_INT_SINGLE_TAP_BIT, ADXL345_INT1_PIN );
  97. // adxl.setInterruptMapping( ADXL345_INT_DOUBLE_TAP_BIT, ADXL345_INT1_PIN );
  98. //register interupt actions - 1 == on; 0 == off
  99. // adxl.setInterrupt( ADXL345_INT_SINGLE_TAP_BIT, 1);
  100. // adxl.setInterrupt( ADXL345_INT_DOUBLE_TAP_BIT, 1);
  101.  
  102. // Wire.begin(); // join i2c bus (address optional for master)
  103. Serial.begin(9600); // start serial for output
  104. delay(2000);
  105. FastLED.addLeds<LPD8806, DATA_PIN, CLOCK_PIN, BRG>(leds, NUM_LEDS);
  106. FastLED.clear();
  107. FastLED.setBrightness(BRIGHTNESS);
  108. randomSeed(analogRead(0)); // random seed generator
  109. }
  110.  
  111. void loop() {
  112.  
  113. randomPuzzleGenerator();
  114. readXyz();
  115. checkPosition();
  116. showLeds();
  117.  
  118. // stateRead(); // game mode
  119. // pattern1();
  120.  
  121.  
  122. // if (level == 10) {
  123. // gameWin++;
  124. // }
  125. //
  126. // if (gameEnd==3) {
  127. //// pattern1();
  128. // }
  129.  
  130. // EVERY_N_MILLISECONDS( 500 ) {addGlitter(20);}
  131.  
  132. serialText();
  133.  
  134. } // end of void loop
  135.  
  136.  
  137. void randomPuzzleGenerator () {
  138. if ( (level == 0) && (puzzle1[0] == 0 || puzzle1[1] == 0 || puzzle1[2] == 0 || puzzle1[3] == 0 || puzzle1[4] == 0 || puzzle1[5] == 0) ) {
  139. randNumber = random(6); // generate number between 1 and 6 inclusive
  140. for (int i = 0; i < puzzleMax; i++) {
  141. puzzle1[i] = randNumber; // push a number into the puzzle string
  142. randNumberOld = randNumber; // save the number
  143. randNumber = random(6); // generate a new number
  144. while (randNumber == randNumberOld) randNumber = random(6); // if its the same number, get a new number
  145. while (randNumberOld == 2 && randNumber == 5) randNumber = random(6); // 2 & 5 // if an opposite number is generated, get a new number
  146. while (randNumberOld == 5 && randNumber == 2) randNumber = random(6); // 5 & 2
  147. while (randNumberOld == 1 && randNumber == 4) randNumber = random(6); // 1 & 4
  148. while (randNumberOld == 4 && randNumber == 1) randNumber = random(6); // 4 & 1
  149. while (randNumberOld == 0 && randNumber == 3) randNumber = random(6); // 0 & 3
  150. while (randNumberOld == 3 && randNumber == 0) randNumber = random(6); // 3 & 0
  151. }
  152. for (int i = 0; i < puzzleSteps; i++) {
  153. Serial.print(puzzle1[i]);
  154. }
  155. Serial.println();
  156. }
  157. }
  158.  
  159.  
  160. void readXyz () { // read accelerometer, map to leds, set states
  161. // read the accelerometer
  162. adxl.readAccel(&x, &y, &z); //read the accelerometer values and store them in variables x,y,z
  163.  
  164. // map the readXyz figures
  165. xa = map(x, -255, 255, 255, 0); // left
  166. xb = map(x, -255, 255, 0, 255); // right
  167. ya = map(y, -255, 255, 255, 0); // front
  168. yb = map(y, -255, 255, 0, 255); // back
  169. za = map(z, -255, 255, 0, 255); // top
  170. zb = map(z, -255, 255, 255, 0); // bottom
  171.  
  172. EVERY_N_MILLISECONDS( 20 ) {
  173. ba -= fadeOut;
  174. fr -= fadeOut;
  175. le -= fadeOut;
  176. ri -= fadeOut;
  177. to -= fadeOut;
  178. bo -= fadeOut;
  179. }
  180.  
  181. if (xa > sensitivity) le = 255; if (le <= 0) le = 0; if (le >= 255) {
  182. le = 255;
  183. state = 1;
  184. }
  185. if (ya > sensitivity) fr = 255; if (fr <= 0) fr = 0; if (fr >= 255) {
  186. fr = 255;
  187. state = 2;
  188. }
  189. if (za > sensitivity) to = 255; if (to <= 0) to = 0; if (to >= 255) {
  190. to = 255;
  191. state = 3;
  192. }
  193. if (xb > sensitivity) ri = 255; if (ri <= 0) ri = 0; if (ri >= 255) {
  194. ri = 255;
  195. state = 4;
  196. }
  197. if (yb > sensitivity) ba = 255; if (ba <= 0) ba = 0; if (ba >= 255) {
  198. ba = 255;
  199. state = 5;
  200. }
  201. if (zb > sensitivity) bo = 255; if (bo <= 0) bo = 0; if (bo >= 255) {
  202. bo = 255;
  203. state = 6;
  204. }
  205.  
  206. } // end of readXyz
  207.  
  208.  
  209.  
  210. void checkPosition () { // main gameplay
  211. unsigned long currentMillisGame = millis();
  212. Serial.print(currentMillisGame - previousMillisGame); Serial.print(" || ");
  213.  
  214. ledColour = map( (currentMillisGame - previousMillisGame), 0, intervalGame, ledColourOld, 255); // fade from last colour
  215.  
  216. for (int i = 0; i < puzzleSteps; i++) {
  217. if (level == i && puzzle1[i] == state && (currentMillisGame - previousMillisGame <= intervalGame)) {
  218. previousMillisGame = currentMillisGame;
  219. levelWin();
  220. level++;
  221. } else if ((currentMillisGame - previousMillisGame >= intervalGame)) {
  222. previousMillisGame = currentMillisGame;
  223. levelFail();
  224. level = 0;
  225. for (int i = 0; i < puzzleSteps; i++) {
  226. puzzle1[i] = 0;
  227. }
  228. }
  229. }
  230. } // end of void checkPosition
  231.  
  232.  
  233. void levelWinOld() {
  234. if (state == 1) {
  235. ledColour = 96;
  236. ba = 255;
  237. to = 255;
  238. fr = 255;
  239. bo = 255;
  240. }
  241. if (state == 2) {
  242. ledColour = 96;
  243. ri = 255;
  244. to = 255;
  245. le = 255;
  246. bo = 255;
  247. }
  248. if (state == 3) {
  249. ledColour = 96;
  250. ri = 255;
  251. ba = 255;
  252. le = 255;
  253. fr = 255;
  254. }
  255. if (state == 4) {
  256. ledColour = 96;
  257. ba = 255;
  258. to = 255;
  259. fr = 255;
  260. bo = 255;
  261. }
  262. if (state == 5) {
  263. ledColour = 96;
  264. ri = 255;
  265. to = 255;
  266. le = 255;
  267. bo = 255;
  268. }
  269. if (state == 6) {
  270. ledColour = 96;
  271. ri = 255;
  272. ba = 255;
  273. le = 255;
  274. fr = 255;
  275. }
  276. ledColourOld = ledColour;
  277. // puzzleSteps++;
  278. // gameEnd=0;
  279. } // end of levelWin
  280.  
  281.  
  282. void levelFailOld() {
  283. if (state == 1) {
  284. ledColour = 0;
  285. ba = 255;
  286. to = 255;
  287. fr = 255;
  288. bo = 255;
  289. }
  290. if (state == 2) {
  291. ledColour = 0;
  292. ri = 255;
  293. to = 255;
  294. le = 255;
  295. bo = 255;
  296. }
  297. if (state == 3) {
  298. ledColour = 0;
  299. ri = 255;
  300. ba = 255;
  301. le = 255;
  302. fr = 255;
  303. }
  304. if (state == 4) {
  305. ledColour = 0;
  306. ba = 255;
  307. to = 255;
  308. fr = 255;
  309. bo = 255;
  310. }
  311. if (state == 5) {
  312. ledColour = 0;
  313. ri = 255;
  314. to = 255;
  315. le = 255;
  316. bo = 255;
  317. }
  318. if (state == 6) {
  319. ledColour = 0;
  320. ri = 255;
  321. ba = 255;
  322. le = 255;
  323. fr = 255;
  324. }
  325. ledColourOld = ledColour;
  326. // puzzleSteps=10;
  327. // gameEnd++;
  328. } // end of levelFail
  329.  
  330.  
  331. void levelWin() {
  332. ledColourSides = 96;
  333. for (int j = 0; j < 6; j++) {
  334. if (state == j) {
  335. for (int i = 0; i < 3; i++) {
  336. sideState[state - 1][i] = {255};
  337. }
  338. // ledColourOld = ledColour;
  339. // gameWin++;
  340. // gameEnd=0;
  341. }
  342. }
  343. } // end of levelWin
  344.  
  345.  
  346. void levelFail() {
  347. ledColourSides = 0;
  348. for (int j = 0; j < 6; j++) {
  349. if (state == j) {
  350. for (int i = 0; i < 4; i++) {
  351. sideState[state - 1][i] = {255};
  352. Serial.println();
  353. Serial.println(sideState[state - 1][i]);
  354. Serial.println();
  355. }
  356. // ledColourOld = ledColour;
  357. // gameFail++;
  358. // gameEnd++;
  359. }
  360. }
  361. } // end of levelWin
  362.  
  363.  
  364.  
  365.  
  366.  
  367.  
  368.  
  369. void showLeds() {
  370. for (int i = 0; i < NUM_LEDS_IN_SEGMENT; i++) {
  371. leds[i] = CHSV( ledColour, 255, ba); // back
  372. leds[i + NUM_LEDS_IN_SEGMENT] = CHSV( ledColour, 255, le); // left
  373. leds[i + 2 * NUM_LEDS_IN_SEGMENT] = CHSV( ledColour, 255, fr); // front
  374. leds[i + 3 * NUM_LEDS_IN_SEGMENT] = CHSV( ledColour, 255, ri); // right
  375. leds[i + 4 * NUM_LEDS_IN_SEGMENT] = CHSV( ledColour, 255, to); // top
  376. leds[i + 5 * NUM_LEDS_IN_SEGMENT] = CHSV( ledColour, 255, bo); // bottom
  377. }
  378. FastLED.show();
  379. } // end of showLeds
  380.  
  381.  
  382. void serialText() {
  383. Serial.print(le); Serial.print(" ");
  384. Serial.print(ri); Serial.print(" | ");
  385. Serial.print(ba); Serial.print(" ");
  386. Serial.print(fr); Serial.print(" | ");
  387. Serial.print(to); Serial.print(" ");
  388. Serial.print(bo); Serial.print(" || ");
  389. Serial.print(" state: "); Serial.print(state);
  390. Serial.print(" mode: "); Serial.print(mode);
  391. Serial.print(" level: "); Serial.print(level);
  392. Serial.print(" gameEnd: "); Serial.print(gameEnd);
  393. // Serial.print( " lvlOld: "); Serial.print(levelOld);
  394. Serial.println();
  395. } // end of void serialText
  396.  
  397.  
  398.  
  399.  
  400. void addGlitter( fract8 chanceOfGlitter) {
  401. if ( random8() < chanceOfGlitter) {
  402. leds[ random16(NUM_LEDS) ] += CRGB::White;
  403. }
  404. FastLED.show();
  405. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement