// Пины для сегментов (a, b, c, d, e, f, g) через резисторы 220 Ом
const int segmentPins[] = {12, 11, 10, 9, 8, 7, 6};
// Пины для управления 4 разрядами (общий катод)
const int digitPins[] = {A3, A4, A5, A2};
// Массив цифр от 0 до 9 для индикатора с общим катодом (1 — сегмент горит, 0 — потушен)
const byte digits[10][7] = {
{1, 1, 1, 1, 1, 1, 0}, // 0
{0, 1, 1, 0, 0, 0, 0}, // 1
{1, 1, 0, 1, 1, 0, 1}, // 2
{1, 1, 1, 1, 0, 0, 1}, // 3
{0, 1, 1, 0, 0, 1, 1}, // 4
{1, 0, 1, 1, 0, 1, 1}, // 5
{1, 0, 1, 1, 1, 1, 1}, // 6
{1, 1, 1, 0, 0, 0, 0}, // 7
{1, 1, 1, 1, 1, 1, 1}, // 8
{1, 1, 1, 1, 0, 1, 1} // 9
};
int totalSeconds = 60; // Начальное время таймера (60 секунд / 01:00)
unsigned long lastTick = 0;
void setup() {
// Настраиваем пины сегментов на вывод
for (int i = 0; i < 7; i++) {
pinMode(segmentPins[i], OUTPUT);
}
// Настраиваем пины разрядов на вывод
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH); // Выключаем разряды при старте
}
}
void loop() {
// Вычисляем значение для отображения в формате ММСС (например, 1 минута 0 секунд = 100)
int minutes = totalSeconds / 60;
int seconds = totalSeconds % 60;
int displayValue = minutes * 100 + seconds;
// Постоянно обновляем индикатор (динамическая индикация)
showNumber(displayValue);
// Отсчет времени каждую 1 секунду (1000 мс)
if (millis() - lastTick >= 1000) {
lastTick = millis();
if (totalSeconds > 0) {
totalSeconds--;
}
}
}
// Функция быстрой отрисовки цифр на 4 разряда
void showNumber(int number) {
int d[4];
d[0] = number / 1000; // Тысячи (минуты десятки)
d[1] = (number / 100) % 10; // Сотни (минуты единицы)
d[2] = (number / 10) % 10; // Десятки секунд
d[3] = number % 10; // Единицы секунд
for (int i = 0; i < 4; i++) {
// Гасим все сегменты на мгновение
for (int s = 0; s < 7; s++) {
digitalWrite(segmentPins[s], LOW);
}
// Включаем текущий разряд
digitalWrite(digitPins[i], LOW); // LOW для общего катода открывает транзистор/разряд
// Зажигаем нужные сегменты для цифры
for (int s = 0; s < 7; s++) {
digitalWrite(segmentPins[s], digits[d[i]][s]);
}
delay(3); // Короткая задержка для свечения разряда (около 3–5 мс)
// Выключаем разряд перед переходом к следующему
digitalWrite(digitPins[i], HIGH);
}
}