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


const int segPins[]   = {6, 7, 8, 9, 10, 11, 12, 13};
const int digitPins[] = {2, 3, 4, 5};
const int buttonPin   = A2;

const byte digitMasks[10] = {
  0b11111100, 0b01100000, 0b11011010, 0b11110010, 0b01100110,
  0b10110110, 0b10111110, 0b11100000, 0b11111110, 0b11110110
};

unsigned long startTime = 0;
unsigned long elapsed   = 0;
bool          running   = false;
bool          prevBtn   = HIGH;
unsigned long pressMs   = 0;
unsigned long lastDbg   = 0;

void setup() {
  Serial.begin(9600);
  for (int i = 0; i < 8; i++) { pinMode(segPins[i], OUTPUT); digitalWrite(segPins[i], LOW); }
  for (int i = 0; i < 4; i++) { pinMode(digitPins[i], OUTPUT); digitalWrite(digitPins[i], HIGH); }
  pinMode(buttonPin, INPUT_PULLUP);
  Serial.println("=== START ===");
}

void loop() {
  bool btn = digitalRead(buttonPin);
  if (prevBtn == HIGH && btn == LOW && millis() - pressMs > 100) {
    pressMs = millis();
    if (running) {
      elapsed += millis() - startTime;
      running = false;
      Serial.print("PAUSE  elapsed="); Serial.println(elapsed);
    } else {
      startTime = millis();
      running = true;
      Serial.print("START  startTime="); Serial.println(startTime);
    }
  }
  prevBtn = btn;

  unsigned long totalMs  = elapsed + (running ? millis() - startTime : 0);
  unsigned long totalSec = totalMs / 1000;
  int sec = totalSec % 60;
  int min = (totalSec / 60) % 100;

  if (millis() - lastDbg > 500) {
    lastDbg = millis();
    Serial.print("run=");     Serial.print(running);
    Serial.print(" ms=");     Serial.print(totalMs);
    Serial.print(" => ");     Serial.print(min);
    Serial.print(":");        Serial.println(sec);
  }

  byte digits[4] = {
    digitMasks[min / 10],
    digitMasks[min % 10],
    digitMasks[sec / 10],
    digitMasks[sec % 10]
  };
  if (!running || (millis() / 500) % 2 == 0)
    digits[1] |= 0b00000001;

  for (int i = 0; i < 4; i++) {
    for (int d = 0; d < 4; d++) digitalWrite(digitPins[d], HIGH);
    for (int s = 0; s < 8; s++) digitalWrite(segPins[s], bitRead(digits[i], 7 - s));
    digitalWrite(digitPins[i], LOW);
    delay(2);
  }
}