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


// Выводы дисплея
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)