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


const int segPins[] = {6, 7, 8, 9, 10, 11, 12, 13};
const int digitPins[] = {5, 4, 3, 2};
const int buttonPin = A2; // Кнопка между A2 и GND

const byte charMasks[] = {
  0b11111100, // 0
  0b01100000, // 1
  0b11011010, // 2
  0b11110010, // 3
  0b01100110, // 4
  0b10110110, // 5
  0b10111110, // 6
  0b11100000, // 7
  0b11111110, // 8
  0b11110110  // 9
};

bool running = false;
unsigned long startTime = 0;
unsigned long elapsedPaused = 0;

int lastButtonState = HIGH;
unsigned long lastDebounceTime = 0;
unsigned long debounceDelay = 50;

void setup() {
  for (int i = 0; i < 8; i++) pinMode(segPins[i], OUTPUT);
  for (int i = 0; i < 4; i++) {
    pinMode(digitPins[i], OUTPUT);
    digitalWrite(digitPins[i], HIGH);
  }
  pinMode(buttonPin, INPUT_PULLUP); // Подтяжка к питанию, кнопка замыкает на GND
}

void loop() {
  // Чтение кнопки с защитой от дребезга
  int reading = digitalRead(buttonPin);

  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }

  if ((millis() - lastDebounceTime) > debounceDelay) {
    // Если кнопка была нажата (переход из HIGH в LOW)
    if (reading == LOW && lastButtonState == HIGH) {
      running = !running; // Переключаем: старт / пауза
      
      if (running) {
        // Запуск: фиксируем точку отсчета с учетом уже прошедшего времени
        startTime = millis() - elapsedPaused;
      } else {
        // Пауза: сохраняем сколько времени уже набежало
        elapsedPaused = millis() - startTime;
      }
    }
  }
  lastButtonState = reading;

  // Расчет времени для отображения
  unsigned long currentMillis = elapsedPaused;
  if (running) {
    currentMillis = millis() - startTime;
  }

  int totalSec = currentMillis / 1000;
  int m = (totalSec / 60) % 100;
  int s = totalSec % 60;

  int digits[4] = { m / 10, m % 10, s / 10, s % 10 };

  // Динамическая индикация (вывод цифр на экран)
  for (int d = 0; d < 4; d++) {
    digitalWrite(digitPins[d], HIGH); // Выключаем разряд
    byte mask = charMasks[digits[d] % 10];
    for (int sIdx = 0; sIdx < 8; sIdx++) {
      digitalWrite(segPins[sIdx], bitRead(mask, 7 - sIdx));
    }
    digitalWrite(digitPins[d], LOW); // Включаем разряд
    delay(3); // Задержка для свечения
  }
}