#include <SevSeg.h>
#include <Tone.h>
SevSeg sevseg; // объект SevSeg
Tone buzzer; // объект для зуммера
// Параметры для семисегментного индикатора
const uint8_t numDigits = 4; // Число разрядов
const uint8_t digitPins[] = {10, 11, 12, 13}; // Пины для разрядов
const uint8_t segmentPins[] = {2, 3, 4, 5, 6, 7, 8}; // Пины для сегментов
// Пины для кнопок
const int buttonUp = A0; // Кнопка увеличения
const int buttonDown = A1; // Кнопка уменьшения
const int buttonConfirm = A2; // Кнопка подтверждения
int secretNumber; // Загаданное число
int guessedNumber = 0; // Выбираемое число
bool guessedCorrectly = false; // Статус угадывания
int correctCount = 0; // Счетчик правильных ответов
void setup() {
Serial.begin(9600);
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, true);
randomSeed(analogRead(A3)); // Используем аналоговый пин для генерации случайного числа
resetGame(); // Генерируем случайное число при старте
pinMode(buttonUp, INPUT_PULLUP);
pinMode(buttonDown, INPUT_PULLUP);
pinMode(buttonConfirm, INPUT_PULLUP);
buzzer.begin(9); // Пин для зуммера
}
void loop() {
if (!guessedCorrectly) {
// Обработка кнопок для увеличения и уменьшения угаданного числа
if (digitalRead(buttonUp) == LOW) {
guessedNumber = (guessedNumber + 1) % 10; // Увеличиваем на 1 (0–9)
delay(200); // Задержка
}
if (digitalRead(buttonDown) == LOW) {
guessedNumber = (guessedNumber - 1 + 10) % 10; // Уменьшаем на 1 (0–9)
delay(200); // Задержка
}
if (digitalRead(buttonConfirm) == LOW) {
guessedCorrectly = (guessedNumber == secretNumber);
if (guessedCorrectly) {
correctCount++; // Увеличиваем счетчик правильных ответов
buzzer.play(3000); // Проигрываем звук для правильного ответа
} else {
buzzer.play(500); // Проигрываем звук для неправильного ответа
correctCount = 0; // Сбрасываем счетчик при неправильном ответе
}
delay(500); // Задержка для звука
buzzer.stop(); // Останавливаем звук после задержки
resetGame(); // Сбрасываем игру
}
}
// Отображение счетчика правильных ответов с 1 по 3 разряды ндикатора
int displayValue = correctCount * 10 + guessedNumber; // счетчик угаданных чисел (находится левее выбираемого числа)
sevseg.setNumber(displayValue);
sevseg.refreshDisplay(); // Обновляем дисплей
}
// Функция сброса игры
void resetGame() {
guessedNumber = 0;
guessedCorrectly = false;
// Генерируем новое случайное число
secretNumber = random(0, 10);
Serial.println(secretNumber); // Отображение на консоли обновлённого загаданного числа
sevseg.setNumber(guessedNumber); // сброс выбираемого числа на 0
}