Секундомер на четырёх разрядах

Счёт идёт по millis(), а индикация — непрерывно: delay() остановил бы и её, и гореть остался бы один разряд. Десятые прибавляются с переносом, как на счётах.

Продвинутый уровень Arduino Uno C++
Схема подключения: Секундомер на четырёх разрядах
Схема в симуляторе. Нажмите «Открыть в симуляторе», чтобы запустить её и поменять.

Что понадобится

Как подключить

ОткудаКуда
Arduino UnoD2→Резистор 11
Резистор 12→Четырёхразрядный индикаторA
Arduino UnoD3→Резистор 21
Резистор 22→Четырёхразрядный индикаторB
Arduino UnoD4→Резистор 31
Резистор 32→Четырёхразрядный индикаторC
Arduino UnoD5→Резистор 41
Резистор 42→Четырёхразрядный индикаторD
Arduino UnoD6→Резистор 51
Резистор 52→Четырёхразрядный индикаторE
Arduino UnoD7→Резистор 61
Резистор 62→Четырёхразрядный индикаторF
Arduino UnoD8→Резистор 71
Резистор 72→Четырёхразрядный индикаторG
Arduino UnoD13→Резистор 81
Резистор 82→Четырёхразрядный индикаторDP
Arduino UnoD9→Четырёхразрядный индикаторDIG1
Arduino UnoD10→Четырёхразрядный индикаторDIG2
Arduino UnoD11→Четырёхразрядный индикаторDIG3
Arduino UnoD12→Четырёхразрядный индикаторDIG4

Скетч

// Секундомер: секунды и десятые, точка отделяет десятые.
// Сегменты A…G — D2…D8, точка — D13, разряды DIG1…DIG4 — D9…D12.
const int SEG[7] = { 2, 3, 4, 5, 6, 7, 8 };
const int DP = 13;
const int DIG[4] = { 9, 10, 11, 12 };

const byte DIGITS[10] = {
  0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F
};

int shown[4] = { 0, 0, 0, 0 };   // цифры на индикаторе, слева направо
int current = 0;                 // какой разряд горит сейчас
unsigned long lastTick = 0;
unsigned long lastSwitch = 0;

// Прибавить десятую долю: как на счётах — 9 в разряде превращается в 0
// и переносит единицу в разряд левее.
void addTenth() {
  for (int d = 3; d >= 0; d--) {
    shown[d]++;
    if (shown[d] < 10) return;
    shown[d] = 0;
  }
}

void setup() {
  for (int s = 0; s < 7; s++) pinMode(SEG[s], OUTPUT);
  pinMode(DP, OUTPUT);
  for (int d = 0; d < 4; d++) {
    pinMode(DIG[d], OUTPUT);
    digitalWrite(DIG[d], HIGH);
  }
}

void loop() {
  // 1. Счёт: раз в 100 мс. Не delay() — он остановил бы и индикацию.
  if (millis() - lastTick >= 100) {
    lastTick += 100;
    addTenth();
  }

  // 2. Индикация: раз в 4 мс переходим к следующему разряду.
  if (millis() - lastSwitch >= 4) {
    lastSwitch = millis();
    digitalWrite(DIG[current], HIGH);
    current = (current + 1) % 4;
    for (int s = 0; s < 7; s++) {
      digitalWrite(SEG[s], (DIGITS[shown[current]] >> s) & 1);
    }
    digitalWrite(DP, current == 2 ? HIGH : LOW);
    digitalWrite(DIG[current], LOW);
  }
}

Коротко о детали: Четырёхразрядный индикатор

Четыре цифры с общими выводами сегментов A–G и DP: сегмент A у всех разрядов один и тот же провод. Какая цифра горит, решает общий вывод разряда DIG1–DIG4, поэтому число выводят динамической индикацией — по очереди зажигают разряды несколько миллисекунд каждый, и глаз видит все четыре сразу. Общий катод или анод задаётся двойным кликом.

Распиновка и все примеры →

Ещё примеры с деталью «Четырёхразрядный индикатор»

Попробуйте сами

Симулятор работает прямо в браузере: схему можно менять, код — править, а результат видно сразу. Бесплатно, без установки и регистрации.

Открыть «Секундомер на четырёх разрядах» в симуляторе