Загрузка данных


// Пины для сегментов (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);
  }
}