// Пины для семисегментного индикатора
const int segmentPins[8] = {2, 3, 4, 5, 6, 7, 8, 9}; // A, B, C, D, E, F, G, DP
const bool commonCathode = true; // true для общего катода, false для общего анода
// Пины для кнопок и пьезоизлучателя
const int buttonIncrease = 11;
const int buttonStart = 12;
const int buzzerPin = 10;
// Переменные для таймера
int timerValue = 0; // Текущее значение таймера
bool timerRunning = false; // Флаг работы таймера
// Массив для кодов цифр на семисегментном индикаторе
const byte digitCodes[10] = {
B00111111, // 0
B00000110, // 1
B01011011, // 2
B01001111, // 3
B01100110, // 4
B01101101, // 5
B01111101, // 6
B00000111, // 7
B01111111, // 8
B01101111 // 9
};
void setup() {
// Настройка пинов семисегментного индикатора
for (int i = 0; i < 8; i++) {
pinMode(segmentPins[i], OUTPUT);
}
// Настройка пинов кнопок и пьезоизлучателя
pinMode(buttonIncrease, INPUT_PULLUP);
pinMode(buttonStart, INPUT_PULLUP);
pinMode(buzzerPin, OUTPUT);
// Настройка таймера/счетчика 1
TCCR1A = 0;
TCCR1B = 0;
// Режим Fast PWM с TOP = ICR1
TCCR1A |= (1 << WGM11);
TCCR1B |= (1 << WGM13) | (1 << WGM12);
// Неинверсный режим на выводе OC1A
TCCR1A |= (1 << COM1A1);
// Предделитель N = 64
TCCR1B |= (1 << CS11) | (1 << CS10);
// Максимальное значение счетчика (TOP)
ICR1 = 499; // Частота PWM = 500 Гц
// Инициализация таймера
timerValue = 0;
timerRunning = false;
// Включение Serial Monitor
Serial.begin(9600);
}
void loop() {
// Увеличение времени при нажатии кнопки
if (digitalRead(buttonIncrease) == LOW) {
delay(200); // Защита от дребезга
timerValue++;
if (timerValue > 99) timerValue = 0;
Serial.print("Timer Value: ");
Serial.println(timerValue);
displayDigit(timerValue);
}
// Запуск таймера при нажатии кнопки
if (digitalRead(buttonStart) == LOW && !timerRunning) {
delay(200); // Защита от дребезга
timerRunning = true;
}
// Работа таймера
if (timerRunning) {
if (timerValue > 0) {
delay(1000); // Пауза 1 секунда
timerValue--;
displayDigit(timerValue);
} else {
// По окончании таймера включить звуковой сигнал
tone(buzzerPin, 1000); // Частота 1000 Гц
delay(500);
noTone(buzzerPin);
timerRunning = false;
}
}
}
// Функция для отображения цифры на семисегментном индикаторе
void displayDigit(int value) {
byte code = digitCodes[value % 10]; // Получаем код для младшего разряда
Serial.print("Displaying digit: ");
Serial.println(value);
for (int i = 0; i < 8; i++) {
digitalWrite(segmentPins[i], commonCathode ? bitRead(code, i) : !bitRead(code, i));
}
}