Урок 18: 4-разрядный 7-сегментный индикатор

1. Зачем нужен 4-разрядный 7-сегментный индикатор

4-разрядный 7-сегментный светодиодный индикатор позволяет отображать числа (и некоторые буквы) на четырёх разрядах, что удобно для создания часов, таймеров, счётчиков и других устройств с цифровой индикацией. Управление таким индикатором на Arduino — отличный способ познакомиться с принципами мультиплексирования и работы с несколькими сегментами.

2. Оборудование

Кол-во

Деталь

1

Плата Arduino UNO

1

4-разрядный 7-сегментный индикатор

8

Резисторы 220 Ω

1

Макетная плата (breadboard)

12

Провода-перемычки

1

USB-кабель A-B

3. Внешний вид и распиновка

4-разрядный 7-сегментный индикатор
4-разрядный 7-сегментный индикатор
Распиновка
Pinout 4-digit 7-segment

4. Схема подключения

Схема подключения 4-разрядного 7-сегментного индикатора

Варианты подключения резисторов:

  • Вариант 1: Один резистор на каждый катод (всего 4). Преимущество — меньше резисторов, но яркость сегментов может отличаться в зависимости от числа одновременно горящих сегментов.

  • Вариант 2: Один резистор на каждый сегмент (всего 8). Гарантирует постоянную яркость, но требует больше резисторов. В этом уроке используется этот вариант (8 резисторов по 220 Ом).

5. Принцип работы

4-разрядный индикатор содержит 12 пинов. При размещении индикатора десятичной точкой вниз, пин в нижнем левом углу — 1, в верхнем левом — 12. Каждый сегмент (a–g, dp) и каждый разряд (d1–d4) подключается к отдельному пину Arduino через резистор.

Мультиплексирование позволяет зажигать поочерёдно каждый разряд, быстро переключая их, чтобы для глаза они светились одновременно.

6. Пример кода

four_digit_7seg.ino
///////////////////////////////////////////////////////////////
// 4-разрядный 7 - Сегментный Светодиодный  Индикатор
// выбор пина для каждого сегмента
int a = 1;
int b = 2;
int c = 3;
int d = 4;
int e = 5;
int f = 6;
int g = 7;
int dp = 8;
// выбор пина для анода
int d4 = 9;
int d3 = 10;
int d2 = 11;
int d1 = 12;
// установка переменной
long n = 1230;
int x = 100;
int del = 55;  // тонкая настройка времени
void setup() {
  pinMode(d1, OUTPUT);
  pinMode(d2, OUTPUT);
  pinMode(d3, OUTPUT);
  pinMode(d4, OUTPUT);
  pinMode(a, OUTPUT);
  pinMode(b, OUTPUT);
  pinMode(c, OUTPUT);
  pinMode(d, OUTPUT);
  pinMode(e, OUTPUT);
  pinMode(f, OUTPUT);
  pinMode(g, OUTPUT);
  pinMode(dp, OUTPUT);
}
void loop() {
  Display(1, 5);
  Display(2, 6);
  Display(3, 4);
  Display(4, 1);
}
void setSegment(unsigned char n) {
  switch (n)  {
    case 1:
      digitalWrite(d1, LOW);
      digitalWrite(d2, HIGH);
      digitalWrite(d3, HIGH);
      digitalWrite(d4, HIGH);
      break;
    case 2:
      digitalWrite(d1, HIGH);
      digitalWrite(d2, LOW);
      digitalWrite(d3, HIGH);
      digitalWrite(d4, HIGH);
      break;
    case 3:
      digitalWrite(d1, HIGH);
      digitalWrite(d2, HIGH);
      digitalWrite(d3, LOW);
      digitalWrite(d4, HIGH);
      break;
    case 4:
      digitalWrite(d1, HIGH);
      digitalWrite(d2, HIGH);
      digitalWrite(d3, HIGH);
      digitalWrite(d4, LOW);
      break;
    default:
      digitalWrite(d1, HIGH);
      digitalWrite(d2, HIGH);
      digitalWrite(d3, HIGH);
      digitalWrite(d4, HIGH);
      break;
  }
}
void Num_0() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, LOW);
  digitalWrite(dp, LOW);
}
void Num_1() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(dp, LOW);
}
void Num_2() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, LOW);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_3() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_4() {
  digitalWrite(a, LOW);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_5() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_6() {
  digitalWrite(a, HIGH);
  digitalWrite(b, LOW);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_7() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(dp, LOW);
}
void Num_8() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, HIGH);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Num_9() {
  digitalWrite(a, HIGH);
  digitalWrite(b, HIGH);
  digitalWrite(c, HIGH);
  digitalWrite(d, HIGH);
  digitalWrite(e, LOW);
  digitalWrite(f, HIGH);
  digitalWrite(g, HIGH);
  digitalWrite(dp, LOW);
}
void Clear() { // очистка экрана
  digitalWrite(a, LOW);
  digitalWrite(b, LOW);
  digitalWrite(c, LOW);
  digitalWrite(d, LOW);
  digitalWrite(e, LOW);
  digitalWrite(f, LOW);
  digitalWrite(g, LOW);
  digitalWrite(dp, LOW);
}
void pickNumber(unsigned char n) { // выбор числа
  switch (n)  {
    case 0: Num_0(); break;
    case 1: Num_1(); break;
    case 2: Num_2(); break;
    case 3: Num_3(); break;
    case 4: Num_4(); break;
    case 5: Num_5(); break;
    case 6: Num_6(); break;
    case 7: Num_7(); break;
    case 8: Num_8(); break;
    case 9: Num_9(); break;
    default: Clear(); break;
  }
}
void Display(unsigned char x, unsigned char Number) { // установка x как координаты и отображение числа
  setSegment(x);
  pickNumber(Number);
  delay(1);
  Clear(); // очистка экрана
}
///////////////////////////////////////////////////////////////

7. Результат

Загрузите приведённый выше код на плату Arduino, и вы увидите, что светодиодный дисплей показывает число 1234. Если отображение некорректно — проверьте подключение.

8. Типовые проблемы

Симптом

Причина

Решение

Не все сегменты светятся

Ошибка в подключении или плохой контакт

Проверьте схему, убедитесь в надёжности соединений

Яркость сегментов разная

Используется только 4 резистора (на катоды)

Используйте 8 резисторов (на каждый сегмент)

Сегменты светятся тускло

Слишком большие резисторы

Используйте 220 Ом или 100 Ом

9. Идеи для расширения

  • Реализуйте отображение счётчика или часов

  • Добавьте управление с кнопок или энкодера

  • Используйте сдвиговые регистры для экономии пинов Arduino