Загрузка данных
// Выводы дисплея
const int digitPins[4] = {6, 7, 8, 9}; // D1, D2, D3, D4
const int segmentPins[8] = {2, 3, 4, 5, 0, 1, 2, 3}; // a, b, c, d, e, f, g, dp (A0=14, A1=15, A2=16, A3=17)
// Переопределение для ясности
const int segA = 2, segB = 3, segC = 4, segD = 5;
const int segE = 14, segF = 15, segG = 16, segDP = 17;
const int btnStart = 10;
const int btnReset = A4;
unsigned long timerMs = 0;
boolean timerRunning = false;
unsigned long lastUpdate = 0;
// Таблица семисегментных кодов (для цифр 0-9)
// Бит: gfedcba (сегменты g, f, e, d, c, b, a)
const byte digitCodes[10] = {
0b0111111, // 0: a b c d e f
0b0000110, // 1: b c
0b1011011, // 2: a b d e g
0b1001111, // 3: a b c d g
0b1100110, // 4: b c f g
0b1101101, // 5: a c d f g
0b1111101, // 6: a c d e f g
0b0000111, // 7: a b c
0b1111111, // 8: a b c d e f g
0b1101111 // 9: a b c d f g
};
void setup() {
// Инициализация выводов сегментов
pinMode(segA, OUTPUT);
pinMode(segB, OUTPUT);
pinMode(segC, OUTPUT);
pinMode(segD, OUTPUT);
pinMode(segE, OUTPUT);
pinMode(segF, OUTPUT);
pinMode(segG, OUTPUT);
pinMode(segDP, OUTPUT);
// Инициализация выводов разрядов
for (int i = 0; i < 4; i++) {
pinMode(digitPins[i], OUTPUT);
digitalWrite(digitPins[i], HIGH); // HIGH = разряд выключен (общий катод)
}
// Инициализация кнопок
pinMode(btnStart, INPUT_PULLUP);
pinMode(btnReset, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
// Обработка кнопки START/STOP
if (digitalRead(btnStart) == LOW) {
delay(50);
if (digitalRead(btnStart) == LOW) {
timerRunning = !timerRunning;
if (timerRunning) {
lastUpdate = millis();
}
while (digitalRead(btnStart) == LOW) {
delay(10);
}
delay(50);
}
}
// Обработка кнопки RESET
if (digitalRead(btnReset) == LOW) {
delay(50);
if (digitalRead(btnReset) == LOW) {
timerMs = 0;
timerRunning = false;
while (digitalRead(btnReset) == LOW) {
delay(10);
}
delay(50);
}
}
// Обновление времени
if (timerRunning) {
unsigned long now = millis();
timerMs += (now - lastUpdate);
lastUpdate = now;
}
// Вывод на дисплей (это должно повторяться часто)
displayTime(timerMs);
}
void displayTime(unsigned long ms) {
// Преобразование в MM:SS
unsigned long seconds = (ms / 1000) % 60;
unsigned long minutes = (ms / 60000) % 60;
int digits[4] = {
minutes / 10, // D1: десятки минут
minutes % 10, // D2: единицы минут
seconds / 10, // D3: десятки секунд
seconds % 10 // D4: единицы секунд
};
// Мультиплексирование: показываем каждый разряд по 2 мс
for (int i = 0; i < 4; i++) {
displayDigit(i, digits[i], (i == 1)); // Точка после D2 (между минутами и секундами)
delay(2);
}
}
void displayDigit(int digitPos, int digit, boolean showDP) {
// Отключить все разряды
for (int i = 0; i < 4; i++) {
digitalWrite(digitPins[i], HIGH);
}
// Получить код сегментов для цифры
byte code = digitCodes[digit];
// Установить сегменты (инвертируем для общего катода)
digitalWrite(segA, (code & 0b0000001) ? LOW : HIGH);
digitalWrite(segB, (code & 0b0000010) ? LOW : HIGH);
digitalWrite(segC, (code & 0b0000100) ? LOW : HIGH);
digitalWrite(segD, (code & 0b0001000) ? LOW : HIGH);
digitalWrite(segE, (code & 0b0010000) ? LOW : HIGH);
digitalWrite(segF, (code & 0b0100000) ? LOW : HIGH);
digitalWrite(segG, (code & 0b1000000) ? LOW : HIGH);
digitalWrite(segDP, showDP ? LOW : HIGH);
// Включить текущий разряд
digitalWrite(digitPins[digitPos], LOW); // LOW = разряд включен (общий катод)
}
Дисплей (вывод) Резистор (330Ω) Arduino Nano
──────────────────────────────────────────────────
1 ──→ D6 (Digit 1)
A (seg a) ──[330Ω]──→ D2
F (seg f) ──[330Ω]──→ A1
2 ──→ D7 (Digit 2)
3 ──→ D8 (Digit 3)
B (seg b) ──[330Ω]──→ D3
E (seg e) ──[330Ω]──→ A0
D (seg d) ──[330Ω]──→ D5
DP (точка) ──[330Ω]──→ A3
C (seg c) ──[330Ω]──→ D4
G (seg g) ──[330Ω]──→ A2
4 (Digit 4) ──→ D9
GND (общий катод) ──→ GND (Arduino)