Таймер с обратным отсчётом на 4-разрядном семисегментном индикаторе
Простой, надёжный таймер с крупным индикатором, звуковым сигналом, ускорением при удержании кнопок и памятью последнего значения.
Возможности таймера
- Установка времени кнопками «+» и «−» (с ускорением при удержании)
- Кнопки «Старт/Пауза» и «Сброс»
- Память последнего установленного времени
- Звуковой сигнал по окончании
- Лёгкое подключение реле вместо/вместе с пищалкой
Схема подключения (общий катод)
- Катоды разрядов → A1, A2, A3, A4
- Сегменты a–g + dp → 2, 3, 4, 5, 6, 7, 8, A0 (по резистору 220–470 Ом на каждый)
- Кнопки (+ / − / Старт / Сброс) → 10, 11, 12, 13 (внутренняя подтяжка)
- Пищалка (активная или пассивная) → пин 9 (ШИМ)
Готовый скетч
#include <math.h>
const int digitPins[] = {A1, A2, A3, A4}; // катоды разрядов
const int segmentPins[] = {2, 3, 4, 5, 6, 7, 8, A0}; // a,b,c,d,e,f,g,dp
const int buzzerPin = 9;
const int btnPlus = 10;
const int btnMinus = 11;
const int btnStart = 12;
const int btnReset = 13;
unsigned long defaultTime = 30; // стартовое время в секундах
unsigned long lastSetTime = defaultTime;
unsigned long remainingTime = 0;
unsigned long previousMillis = 0;
bool running = false;
bool buzzerActive = false;
const byte numbers[10] = {
B11111100, // 0
B01100000, // 1
B11011010, // 2
B11110010, // 3
B01100110, // 4
B10110110, // 5
B10111110, // 6
B11100000, // 7
B11111110, // 8
B11110110 // 9
};
void setup() {
for (int i = 0; i < 4; i++) pinMode(digitPins[i], OUTPUT);
for (int i = 0; i < 8; i++) pinMode(segmentPins[i], OUTPUT);
pinMode(buzzerPin, OUTPUT);
pinMode(btnPlus, INPUT_PULLUP);
pinMode(btnMinus, INPUT_PULLUP);
pinMode(btnStart, INPUT_PULLUP);
pinMode(btnReset, INPUT_PULLUP);
remainingTime = lastSetTime;
displayTime(remainingTime);
}
void loop() {
unsigned long currentMillis = millis();
// обработка кнопок
if (!running) {
if (digitalRead(btnPlus) == LOW) { adjustTime(1); delay(10); }
if (digitalRead(btnMinus) == LOW) { adjustTime(-1); delay(10); }
}
if (digitalRead(btnStart) == LOW) { running = !running; delay(200); }
if (digitalRead(btnReset) == LOW) {
remainingTime = lastSetTime;
running = false;
buzzerActive = false;
noTone(buzzerPin);
delay(200);
}
// обратный отсчёт
if (running && currentMillis - previousMillis >= 1000) {
previousMillis = currentMillis;
if (remainingTime > 0) remainingTime--;
else {
running = false;
buzzerActive = true;
tone(buzzerPin, 1000);
}
displayTime(remainingTime);
}
// звуковой сигнал по окончании
if (buzzerActive && currentMillis % 1000 < 500) tone(buzzerPin, 1000);
else if (buzzerActive) noTone(buzzerPin);
displayTime(remainingTime);
}
void adjustTime(int dir) {
static unsigned long lastAdjust = 0;
unsigned long now = millis();
int speed = (now - lastAdjust < 500) ? 10 : 1;
remainingTime += dir * speed;
if (remainingTime > 3599) remainingTime = 0;
lastSetTime = remainingTime;
displayTime(remainingTime);
lastAdjust = now;
}
void displayTime(unsigned long seconds) {
int mins = seconds / 60;
int secs = seconds % 60;
int digits[4] = {mins / 10, mins % 10, secs / 10, secs % 10};
for (int d = 0; d < 4; d++) {
digitalWrite(digitPins[d], HIGH);
for (int s = 0; s < 8; s++) {
digitalWrite(segmentPins[s], bitRead(numbers[digits[d]], 7 - s));
}
delay(2);
digitalWrite(digitPins[d], LOW);
}
}
Кнопки позволяют увеличивать/уменьшать время, запускать/останавливать таймер и сбрасывать его.
Таймер ведёт обратный отсчёт, и по окончании звучит зуммер с прерывистым сигналом.
На дисплее одновременно отображаются минуты и секунды в формате MM:SS.
Что легко добавить
- Реле на свободный пин вместо/вместе с пищалкой
- Яркость через ШИМ
- Мелодия вместо простого писка
- Кнопка mute
Итог
Крупный, читаемый, удобный таймер с минимумом деталей и полностью готовым скетчем — собирается за вечер и работает без нареканий.
FAQ — Таймер с обратным отсчётом на 4-разрядном семисегментном индикаторе
Как работает таймер и какие функции он поддерживает?
Устройство позволяет устанавливать время кнопками «+» и «−» с ускорением при удержании, запускать и ставить на паузу обратный отсчёт, выполнять сброс, хранить последнее установленное значение и подавать звуковой сигнал по окончании. При необходимости вместо пищалки можно подключить реле.
Какая схема подключения семисегментного индикатора используется?
Используется индикатор с общим катодом. Катоды разрядов подключены к A1–A4, сегменты a–g и точка — к пинам 2–8 и A0 через резисторы 220–470 Ом.
Какие пины используются для кнопок и пищалки?
Кнопки подключаются к пинам 10, 11, 12 и 13 с внутренней подтяжкой. Пищалка (активная или пассивная) подключена к пину 9, поддерживающему ШИМ.
Как реализован обратный отсчёт времени?
Скетч использует millis() и уменьшает значение каждую секунду. Когда время достигает нуля, таймер останавливается, активирует звуковой сигнал и отображает 00:00.
Как работает ускорение при удержании кнопок?
Если между нажатиями проходит меньше 500 мс, шаг увеличения становится 10 единиц, иначе 1. Это обеспечивает быстрый набор времени.
Можно ли расширить функциональность таймера?
Можно подключить реле, добавить регулировку яркости через ШИМ, воспроизведение мелодии вместо одиночного сигнала и кнопку отключения звука.