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 lastButton = HIGH;
unsigned long lastDebounce = 0;
void setup() {
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);
}
void updateButton() {
bool btn = digitalRead(buttonPin);
if (btn != lastButton && millis() - lastDebounce > 50) {
lastDebounce = millis();
lastButton = btn;
if (btn == LOW) {
if (running) { elapsed += millis() - startTime; running = false; }
else { startTime = millis(); running = true; }
}
}
}
void loop() {
updateButton();
unsigned long totalMs = elapsed + (running ? millis() - startTime : 0);
unsigned long totalSec = totalMs / 1000;
int sec = totalSec % 60;
int min = (totalSec / 60) % 100;
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);
}
}