int firstSegmentPin = 2; // Подключение 1-го сегмента (A) к пину
int segmentCount = 8; // Сколько всего сегментов подключим подряд
int digitCount = 4; // На сколько порядков(разрядов) дисплей (единицы, десятки, сотни, тысячи)
byte numberSegments[10] = { // Коды для цифр от 0 до 9
0b00111111, // цифра 0
0b00000110, // цифра 1
0b01011011, // цифра 2
0b01001111, // цифра 3
0b01100110, // цифра 4
0b01101101, // цифра 5
0b01111101, // цифра 6
0b00000111, // цифра 7
0b01111111, // цифра 8
0b01101111 // цифра 9
};
byte digitSelect[5] = { // Какой разряд высветить
0b00000000, // очистка экрана
0b00001000, // единицы
0b00000100, // десятки
0b00000010, // сотни
0b00000001 // тысячи
};
// Переменные для счётчиков
int my_counter = 0; // Пользовательский счётчик
unsigned long previousMillis = 0; // Переменная для отслеживания времени
const unsigned long interval = 1000UL; // Интервал в 1 секунду
void setup() {
Serial.begin(115200); // Запуск серийного порта с заданной скоростью
Serial.println("Введите число: "); // Сообщение для пользователя
// Настройка пинов сегментов как выходы
for (int i = 0; i < segmentCount; i++) {
pinMode(firstSegmentPin + i, OUTPUT);
}
// Настройка пинов разрядов как выходы
for (int i = 0; i < digitCount; i++) {
pinMode(firstSegmentPin + segmentCount + i, OUTPUT);
}
}
// Функция для очистки дисплея
void clear_segment() {
for (int i = 0; i < segmentCount; i++) {
digitalWrite(firstSegmentPin + i, HIGH); // Установка всех сегментов в состояние HIGH (выключены)
}
}
// Функция для отображения цифры на дисплее
void switch_segment(int digit) {
clear_segment(); // Очистка дисплея
for (int i = 0; i < segmentCount; i++) {
digitalWrite(firstSegmentPin + i, ((numberSegments[digit] >> i) & 0b00000001) ? LOW : HIGH);
}
}
// Функция для отображения всех разрядов
void ShowNumber_on_Display(int l_digit, int th_digit, int sec_digit, int f_digit) {
// Включение разряда для тысяч
if (f_digit > 0 || (my_counter == 0)){
digitalWrite(firstSegmentPin + segmentCount + 0, HIGH); // Включаем разряд для тысяч
switch_segment(f_digit); // Отображение тысяч
delay(5); // Небольшая задержка для стабильности
clear_segment(); // Очистка дисплея
digitalWrite(firstSegmentPin + segmentCount + 0, LOW); // Выключаем разряд
}
// Включение разряда для сотен
if (f_digit > 0 || sec_digit >0 || (my_counter == 0)){
digitalWrite(firstSegmentPin + segmentCount + 1, HIGH); // Включаем разряд для сотен
switch_segment(sec_digit); // Отображение сотен
delay(5); // Небольшая задержка для стабильности
clear_segment(); // Очистка дисплея
digitalWrite(firstSegmentPin + segmentCount + 1, LOW); // Выключаем разряд
}
// Включаем разряд для десятков
if (f_digit > 0 || sec_digit >0 || th_digit >0 || (my_counter == 0)){
// Включение разряда для десятков
digitalWrite(firstSegmentPin + segmentCount + 2, HIGH); // Включаем разряд для десятков
switch_segment(th_digit); // Отображение десятков
delay(5); // Небольшая задержка для стабильности
clear_segment(); // Очистка дисплея
digitalWrite(firstSegmentPin + segmentCount + 2, LOW); // Выключаем разряд
}
// Включение разряда для единиц
digitalWrite(firstSegmentPin + segmentCount + 3, HIGH); // Включаем разряд для единиц
switch_segment(l_digit); // Отображение младшего разряда
delay(5); // Небольшая задержка для стабильности
clear_segment(); // Очистка дисплея
digitalWrite(firstSegmentPin + segmentCount + 3, LOW); // Выключаем разряд
}
void loop() {
// Проверка наличия данных на серийном порту
if (Serial.available() > 0) {
my_counter = Serial.parseInt(); // Чтение введенного пользовательского числа
Serial.read(); // Чтение остатка данных из порта (чтобы очистить буфер)
Serial.println("Введенное число: " + String(my_counter)); // Вывод введенного числа в консоль
}
// Установка отрицательных значений в 0 или больших 9999
if (my_counter < 0 || my_counter > 9999) my_counter = 0;
unsigned long currentMillis = millis(); // Получение текущего времени
// Извлечение отдельных цифр из числа
int lastdigit = my_counter % 10; // Младшая цифра
int third_digit = (my_counter / 10) % 10; // Третья цифра
int second_digit = (my_counter / 100) % 10; // Вторая цифра
int first_digit = my_counter / 1000; // Первая цифра
ShowNumber_on_Display(lastdigit, third_digit, second_digit, first_digit); // Отображение цифр на дисплее
// Проверка, прошла ли секунда с предыдущего обновления
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis; // Обновление временной метки
my_counter--; // Уменьшение счётчика на 1
if(my_counter == 0) {
Serial.println("Отсчёт окончен");
}
}
}