#include <Adafruit_NeoPixel.h>
#include <Keypad.h>
#define PIN 14 // Пин для подключения NeoPixels
#define NUMPIXELS 16 // Количество NeoPixels (4x4)
#define ROWS 4 // Количество строк на клавиатуре
#define COLS 4 // Количество столбцов на клавиатуре
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
// Настройка клавиатуры (4x4)
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
};
byte rowPins[ROWS] = {21, 22, 19, 18}; // Подключение к пинам строк
byte colPins[COLS] = {5, 17, 4, 2}; // Подключение к пинам столбцов
byte ledPinMap[16] = {15, 14, 13, 12, 8, 9, 10, 11, 7, 6, 5, 4, 0, 1, 2, 3};
Keypad keypad = Keypad(makeKeymap(keys), rowPins, colPins, ROWS, COLS);
// Последовательность для игры
int sequence[5]; // Массив для хранения последовательности (изменено с 6 на 5)
int sequenceLength = 1; // Начинаем с одной кнопки в последовательности
int playerPosition = 0; // Текущая позиция игрока
unsigned long lastInputTime = 0; // Время последнего ввода игрока
const unsigned long inputTimeout = 7000; // Время ожидания ввода (в миллисекундах)
void setup() {
pixels.begin(); // Инициализация NeoPixels
pixels.clear(); // Очистка всех NeoPixels
pixels.show(); // Обновление состояния NeoPixels
Serial.begin(9600);
randomSeed(analogRead(1)); // Инициализация генератора случайных чисел
// Генерация случайной последовательности кнопок
generateSequence();
}
void loop() {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(ledPinMap[i], pixels.Color(0, 20, 0)); // Зеленый цвет
pixels.show();
delay(100);
}
playSequence(); // Показываем текущую последовательность
if (checkPlayerInput()) { // Проверяем ввод игрока
if (playerPosition == sequenceLength) { // Если игрок успешно повторил всю текущую последовательность
if (sequenceLength == 5) { // Изменено с 6 на 5
// Все NeoPixels загораются зеленым
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(ledPinMap[i], pixels.Color(0, 255, 0)); // Зеленый цвет
}
pixels.show();
delay(2000); // Пауза перед новой игрой
restartGame();
} else {
// Переходим к следующему раунду игры
sequenceLength++; // Увеличиваем длину последовательности
playerPosition = 0; // Сбрасываем позицию игрока
lastInputTime = millis(); // Обновляем время последнего ввода
clearPixels(); // Очищаем NeoPixels для следующей итерации
delay(1000); // Задержка перед показом новой последовательности
generateSequence(); // Генерируем новую случайную последовательность
}
}
// Если игрок еще не завершил текущую последовательность, продолжаем игру
} else {
// Игрок ошибся, все NeoPixels загораются красным
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(ledPinMap[i], pixels.Color(255, 0, 0)); // Красный цвет
}
pixels.show();
delay(2000); // Пауза перед новой игрой
restartGame();
}
// Проверка на время ожидания ввода
if (millis() - lastInputTime > inputTimeout) {
restartGame(); // Если время истекло, начинаем игру заново
}
}
void playSequence() {
for (int i = 0; i < sequenceLength; i++) {
int index = sequence[i];
pixels.setPixelColor(index, pixels.Color(10, 0, 150)); // Синий цвет
pixels.show();
delay(500); // Задержка для мигания NeoPixel
pixels.setPixelColor(index, 0); // Выключаем NeoPixel
pixels.show();
delay(500); // Задержка между миганиями
}
}
bool checkPlayerInput() {
while (playerPosition < sequenceLength) {
char key = keypad.getKey();
if (key) {
int inputIndex = ledPinMap [keyToIndex(key)];
Serial.print("inputIndex: ");
Serial.println(inputIndex);
if (inputIndex == sequence[playerPosition]) {
playerPosition++; // Правильный ввод, двигаемся к следующему элементу в последовательности
pixels.setPixelColor(inputIndex, pixels.Color(0, 255, 0)); // Зеленый цвет
pixels.show();
delay(500); // Задержка для показа правильного ввода
pixels.setPixelColor(inputIndex, 0); // Выключаем NeoPixel
pixels.show();
lastInputTime = millis(); // Обновляем время последнего ввода
} else {
return false; // Неправильный ввод
}
}
}
return true;
}
void restartGame() {
sequenceLength = 1; // Начинаем снова с одной кнопки в последовательности
playerPosition = 0; // Сбрасываем позицию игрока
clearPixels(); // Очищаем все NeoPixels
generateSequence(); // Генерируем новую случайную последовательность
lastInputTime = millis(); // Обновляем время последнего ввода
}
void clearPixels() {
for (int i = 0; i < NUMPIXELS; i++) {
pixels.setPixelColor(ledPinMap[i], 0); // Выключаем все NeoPixels
}
pixels.show();
}
void generateSequence() {
// Генерируем случайную последовательность кнопок
for (int i = 0; i < sequenceLength; i++) {
sequence[i] = random(0, 16); // Генерируем случайное число от 0 до 15
}
}
int keyToIndex(char key) {
switch (key) {
case '1': return 0;
case '2': return 1;
case '3': return 2;
case 'A': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case 'B': return 7;
case '7': return 8;
case '8': return 9;
case '9': return 10;
case 'C': return 11;
case '*': return 12;
case '0': return 13;
case '#': return 14;
case 'D': return 15;
default: return -1;
}
}