special_forces

course iot

May 14th, 2022 (edited)
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.32 KB | None | 0 0
  1. #define SequenceMaxLen 50      // Длина последовательности
  2. #define ShowingTime 300        // Длительность отображения элемента последовательности (мс)
  3. #define DelayBetweenLeds 200   // Задержка между отображением элементов (мс)
  4. #define WaitingTime 10000      // Время ожидания ввода (мс)
  5. #define RepeatRightSequence 1  // Нужно ли повторять правильную последовательность при проигрыше
  6. byte Sequence[SequenceMaxLen]; // Последовательность включения светодиодов
  7. byte CurrentLen;               // Текущая длина последовательности
  8. int CurrentIndex;              // Номер обрабатываемого элемента последовательности
  9. byte ButtonsNLeds[] = {2, 3, 4, 5}; // Номера выводов, к которым подключены кнопки и светодиоды
  10. byte ButtonCount = sizeof(ButtonsNLeds) / sizeof(ButtonsNLeds[0]);
  11. bool ButtonStillPressed;
  12. enum eMode {mStartNewGame, mShowingSequence, mRepeatSequence, mWaitingForButtons}; // Соответсвующие значения к переменным 0,1,2,3
  13. eMode Mode;                    // Текущий режим: отображение последовательности/ожидание ввода
  14. unsigned long tm;              // Переменная для отслеживания временных интервалов
  15.  
  16. #define pin_Speaker 12         // Пин к которому подключен динамик
  17. int Notes[] = {880, 988, 1047, 1175}; // Частоты нот для каждой из кнопок (A5, B5, C6, D6)
  18.  
  19. void SetPinMode(byte NewPinMode) { // Установка режимов работы пинов
  20.   for (byte i = 0; i < ButtonCount; i++) //ButtonCount не надо изменять
  21.     pinMode(ButtonsNLeds[i], NewPinMode);
  22. }
  23.  
  24. void Blink(int Count, int DelayTime) { //Мерцание светодиодов  
  25.   SetPinMode(OUTPUT); //Режим работы всех пинов настроен как "ВЫХОД"
  26.   for (byte t = 0; t < Count; t++) {
  27.     for (byte i = 0; i < ButtonCount; i++) //ButtonCount не надо изменять
  28.       digitalWrite(ButtonsNLeds[i], 1); // высокий сигнал на пинах,то есть светятся светодиоды  
  29.     delay(DelayTime); //пауза
  30.     for (byte i = 0; i < ButtonCount; i++) //ButtonCount не надо изменять
  31.       digitalWrite(ButtonsNLeds[i], 0); // низкий сигнал на пинах,то есть не светятся светодиоды  
  32.     delay(DelayTime); //пауза
  33.   }
  34. }
  35.  
  36. /*void Win() { // отвечает за динамики (не используем)
  37.   tone(pin_Speaker, 2637, 125);
  38.   delay(162);
  39.   tone(pin_Speaker, 2093, 500);
  40.   SetPinMode(OUTPUT);
  41.   for (byte t = 0; t < 5; t++) {
  42.     for (byte i = 0; i < ButtonCount; i++) {
  43.       digitalWrite(ButtonsNLeds[i], 1);
  44.       delay(50);
  45.       digitalWrite(ButtonsNLeds[i], 0);
  46.       delay(20);
  47.     }
  48.   }
  49. }*/
  50.  
  51. void setup() {
  52.   Serial.begin(9600);
  53.   randomSeed(analogRead(0));// считывает начальное рандомное число
  54.   Mode = mStartNewGame; // m = 0;
  55. }
  56.  
  57. void loop() {
  58.   switch (Mode) {
  59.     case mStartNewGame: { // Новая игра
  60.         Serial.println("Mode = mStartNewGame");
  61.         for (byte i = 0; i < SequenceMaxLen; i++) // Создаем последовательность
  62.           Sequence[i] = random(ButtonCount);
  63.         SetPinMode(OUTPUT); // Установка режимов работы пинов
  64.         Blink(3, 800);  // Мерцание светодиодов
  65.         delay(DelayBetweenLeds); // Пауза перед включением первого светодиода
  66.         Mode = mShowingSequence; // Установили режим показывать последовательность
  67.         Serial.println("Mode = mShowingSequence");
  68.         CurrentIndex = -1; // Номер обрабатываемого элемента последовательности
  69.         CurrentLen = 1; // Текущая длина последовательности
  70.         return;
  71.       }
  72.     case mRepeatSequence: //повторять ли последовательность
  73.       if (RepeatRightSequence == 0) {
  74.         Mode = mStartNewGame;
  75.         return;
  76.       }
  77.     case mShowingSequence: { // Показываем последовательность
  78.         if (CurrentIndex == -1) {
  79.           CurrentIndex = 0; // Номер обрабатываемого элемента последовательности
  80.           Serial.print("Sequence: ");
  81.           Serial.print(Sequence[CurrentIndex]);
  82.           digitalWrite(ButtonsNLeds[Sequence[0]], HIGH); // Загорает светодиод
  83.           //tone(pin_Speaker, Notes[Sequence[0]], ShowingTime); отвечает за звук
  84.           tm = millis() + ShowingTime; // Переменная для отслеживания временных интервалов
  85.           return;
  86.         }
  87.         if (millis() >= tm) {
  88.           digitalWrite(ButtonsNLeds[Sequence[CurrentIndex]], LOW); // Гасим светодиод
  89.           CurrentIndex++; // Номер обрабатываемого элемента последовательности
  90.           if (CurrentIndex < CurrentLen) { // Если показана еще не вся последовательность
  91.             delay(DelayBetweenLeds); // Задержка между отображением элементов (мс)
  92.             Serial.print(", ");
  93.             Serial.print(Sequence[CurrentIndex]);
  94.             digitalWrite(ButtonsNLeds[Sequence[CurrentIndex]], HIGH); // то включаем следующий светодиод
  95.             // tone(pin_Speaker, Notes[Sequence[CurrentIndex]], ShowingTime); отвечает за звук
  96.             tm = millis() + ShowingTime;
  97.           }
  98.           else {
  99.             Serial.println();
  100.             if (Mode == mRepeatSequence) {
  101.               Mode = mStartNewGame; // Начинаем новую игру
  102.               delay(1000);
  103.             }
  104.             else {
  105.               Mode = mWaitingForButtons; // Иначе переключаемся в режим ввода
  106.               Serial.println("Mode = mWaitingForButtons");
  107.               SetPinMode(INPUT);
  108.               CurrentIndex = 0;
  109.               tm = millis() + WaitingTime;
  110.             }
  111.           }
  112.         }
  113.         return;
  114.       }
  115.     case mWaitingForButtons: { // Ожидаем ввода последовательности
  116.         if (millis() > tm) { // Время вышло. Game over
  117.           tone(pin_Speaker, 110, 800);
  118.           Blink(10, 50);
  119.           Mode = mRepeatSequence; // Показываем правильную последовательность
  120.           CurrentIndex = -1;
  121.           return;
  122.         }
  123.         for (byte i = 0; i < ButtonCount; i++) {
  124.           if (digitalRead(ButtonsNLeds[i]) == HIGH) { // Если кнопка нажата
  125.             delay(50);
  126.             if (ButtonStillPressed) return; // Кнопка все еще нажата, прерываем обработку
  127.             ButtonStillPressed = 1;
  128.             Serial.print("Button pressed: ");
  129.             Serial.print(i);
  130.             tone(12, Notes[i], 300);
  131.             if (i == Sequence[CurrentIndex]) { // Нажата верная кнопка
  132.               Serial.println(" - Right!");
  133.               CurrentIndex++;
  134.               if (CurrentIndex < CurrentLen) // Если введена еще не вся последовательность
  135.                 tm = millis() + WaitingTime; // то ожидаем следующую кнопку
  136.               else { // Иначе (введена вся последовательность)
  137.                 delay(500);
  138.                 if (CurrentLen == SequenceMaxLen) { // Конец игры
  139.                   Win();
  140.                   delay(500);
  141.                   Mode = mStartNewGame; // Начинаем новую игру
  142.                   return;
  143.                 }
  144.                 delay(800);
  145.                 CurrentLen++; // увеличиваем ее длину
  146.                 Mode = mShowingSequence; // и переключаем режим
  147.                 SetPinMode(OUTPUT);
  148.                 CurrentIndex = -1;
  149.                 Serial.println("Mode = mShowingSequence");
  150.                 return;
  151.               }
  152.             }
  153.             else { // Если нажата неверная кнопка
  154.               Serial.println(" - Wrong!");
  155.               tone(pin_Speaker, 110, 800);
  156.               SetPinMode(OUTPUT);
  157.               for (int t = 0; t < 10; t++) {
  158.                 digitalWrite(ButtonsNLeds[i], HIGH);
  159.                 delay(50);
  160.                 digitalWrite(ButtonsNLeds[i], LOW);
  161.                 delay(50);
  162.               }
  163.               Mode = mRepeatSequence; // Показываем правильную последовательность
  164.               CurrentIndex = -1;
  165.               Serial.println("Mode = mRepeatSequence");
  166.               return;
  167.             }
  168.             return;
  169.           }
  170.         }
  171.         ButtonStillPressed = 0;
  172.         return;
  173.       }
  174.   }
  175. }
Advertisement
Add Comment
Please, Sign In to add comment