Advertisement
Guest User

Arduino "Simon Says" by YemSalat v0.033

a guest
Aug 3rd, 2015
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1.  
  2. const unsigned char BUTTON_PIN = 0;
  3. const unsigned char LED_PIN_1 =  11;
  4. const unsigned char LED_PIN_2 =  10;
  5. const unsigned char LED_PIN_3 =  9;
  6. const int BUTTON_VALUE_1 = 1015;
  7. const int BUTTON_VALUE_2 = 925;
  8. const int BUTTON_VALUE_3 = 845;
  9.  
  10. // GLOBAL
  11. int currentReading;
  12. unsigned long currentTimer;
  13.  
  14. // GAME VARS
  15. unsigned char gameCombination[100];
  16. unsigned long gameTimer = 0;
  17. unsigned char gameState = 0;
  18. unsigned char gameLevel = 0;
  19. unsigned char gameAccel = 25;
  20. unsigned char gameStep = 0;
  21. unsigned char gameInputDelay = 150;
  22. int gameStateDelay = 1000;
  23. int gameMinDelay = 500;
  24.  
  25. // LED Light
  26. class Light {
  27.     unsigned char pin;
  28.     unsigned long timerCheck; // checks led timing
  29.  
  30.     unsigned char ledState; // led current state
  31.  
  32.     public:
  33.         Light() = default;
  34.         Light(unsigned char p) { // pin number
  35.             pin = p;
  36.             ledState = 0; // off by default
  37.             timerCheck = 0;
  38.  
  39.             pinMode(pin, OUTPUT);
  40.         }
  41.  
  42.         void blink(unsigned long onTime) {
  43.             timerCheck = currentTimer + onTime;
  44.             ledState = 1;
  45.             digitalWrite(pin, HIGH);
  46.         }
  47.  
  48.         void update() {
  49.             // Check if led is on and if its time to switch it off yet
  50.             if (ledState == 1) {
  51.                 if (timerCheck < currentTimer) {
  52.                     digitalWrite(pin, LOW);
  53.                     ledState = 0;
  54.                 }
  55.             }
  56.  
  57.         }
  58. };
  59.  
  60. // BUTTON
  61. class Button {
  62.     int triggerValue; // trigger value
  63.     unsigned char triggerFlac; // trigger flactuation
  64.     unsigned char inputDelay; // debounce delay
  65.  
  66.     unsigned char buttonPressed; // button state
  67.     unsigned char debounce;
  68.  
  69.     public:
  70.        
  71.         Button() = default;
  72.         Button(int tV) : triggerValue{tV} {
  73.             debounce = 0;
  74.             buttonPressed = 0;
  75.  
  76.             triggerFlac = 40;
  77.             inputDelay = 150;
  78.         }
  79.  
  80.         unsigned char isPressed() {
  81.             return buttonPressed;
  82.         }
  83.  
  84.         void update() {
  85.  
  86.             // Check current reading
  87.             if (currentReading > triggerValue - triggerFlac && currentReading < triggerValue + triggerFlac) {
  88.                 debounce++;
  89.             } else {
  90.                 debounce = 0;
  91.                 buttonPressed = 0;
  92.             }
  93.  
  94.             // The button state is changed if the reading is within
  95.             // the trigger value boundaries for a certain amount of time
  96.             if (debounce > inputDelay) {
  97.                 buttonPressed = 1;
  98.             }
  99.  
  100.         }
  101. };
  102.  
  103. // UTILS
  104. void _delay(int dl) {
  105.     gameTimer = currentTimer + dl;
  106. }
  107.  
  108.  
  109.  
  110. // GAME LIGHTS
  111. Light gameLights[] = {
  112.     Light(LED_PIN_1),
  113.     Light(LED_PIN_2),
  114.     Light(LED_PIN_3)
  115. };
  116.  
  117. // GAME BUTTONS
  118. Button gameButtons[] = {
  119.     Button(BUTTON_VALUE_1),
  120.     Button(BUTTON_VALUE_2),
  121.     Button(BUTTON_VALUE_3)
  122. };
  123.  
  124.  
  125. // SETUP
  126. void setup() {
  127.  
  128.     pinMode(BUTTON_PIN, INPUT);
  129.  
  130.     // RANDOMIZER
  131.     randomSeed(analogRead(5));
  132.  
  133. }
  134.  
  135. // TODO: Refactor
  136. // this is currently wathing the last user input
  137. unsigned char lastUserInput;
  138.  
  139.  
  140. // LOOP
  141. void loop() {
  142.  
  143.     currentReading = analogRead(BUTTON_PIN);
  144.     currentTimer = millis();
  145.  
  146.     if (gameTimer < currentTimer) {
  147.  
  148.         // STATE :: Start game
  149.         if (gameState == 0) {
  150.             // initialize new game
  151.             gameLevel = 0;
  152.             gameState = 1;
  153.             gameStep = 0;
  154.             _delay(gameStateDelay);
  155.         }
  156.  
  157.         // STATE :: Set combination
  158.         if (gameState == 1) {
  159.             // add new random number to current combination
  160.             gameCombination[gameLevel] = random(3);
  161.             gameLevel = gameLevel + 1;
  162.             gameStep = 0; // reset step
  163.             if (gameStateDelay > gameMinDelay) {
  164.                 gameStateDelay -= gameAccel; // decrease game intervals
  165.             }
  166.             _delay(gameStateDelay);
  167.             gameState = 2; // ->> go to STATE 2
  168.         }
  169.    
  170.         // STATE :: Play current combination
  171.         else if (gameState == 2) {
  172.             if (gameStep < gameLevel) {
  173.                 gameLights[gameCombination[gameStep]].blink(150);
  174.                 gameStep = gameStep + 1;
  175.                 _delay(gameStateDelay);
  176.             }
  177.             else {
  178.                 gameStep = 0;
  179.                 gameState = 3; // ->> go to STATE 3
  180.                 _delay(gameInputDelay);
  181.             }
  182.         }
  183.    
  184.         // STATE :: User input
  185.         else if (gameState == 3) {
  186.             if (gameStep < gameLevel) {
  187.                
  188.                 // cycle through all buttons
  189.                 for (unsigned char i = 0; i < 3; i++) {
  190.                     gameButtons[i].update(); // update each button
  191.  
  192.                     // BUTTON PRESSED
  193.                     if (gameButtons[i].isPressed() == 1) {
  194.                         if (lastUserInput != i) {
  195.                             lastUserInput = i;
  196.  
  197.                             gameLights[i].blink(150);
  198.  
  199.                             if (gameCombination[gameStep] == i) {
  200.                                 // correct press
  201.                                 gameStep++;
  202.                                 _delay(gameInputDelay);
  203.                             }
  204.                             else {
  205.                                 // wrong press
  206.                                 gameLevel = gameStep; // used for blinking this led on game over
  207.                                 gameStep = 0;
  208.                                 gameState = 4; // ->> got to STATE 4
  209.                             }
  210.                         }
  211.    
  212.                         break;
  213.                     }
  214.                     else if (i == 2) { // Reached last button
  215.                         // reset user input because none of the buttons are pressed
  216.                         lastUserInput = 255;
  217.                     }
  218.                 }
  219.             }
  220.             else { // reached last button - reset user input
  221.                 gameState = 1; // ->> go to STATE 1
  222.             }
  223.         }
  224.  
  225.         // STATE :: Game over
  226.         else if (gameState == 4) {
  227.             // blink the correct light 10 times
  228.             if (gameStep < 10) {
  229.                 gameStep++;
  230.                 gameLights[gameCombination[gameLevel]].blink(100);
  231.                 _delay(gameStateDelay/5);
  232.             }
  233.             else {
  234.                 gameState = 0;  // ->> got to STATE 0
  235.                 _delay(gameStateDelay);
  236.             }
  237.         }
  238.     }
  239.  
  240.     // UPDATE LEDs
  241.     for (unsigned char i = 0; i < 3; i++) {
  242.         gameLights[i].update();
  243.     }
  244.  
  245. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement