Компоненты · 5 мин чтения

7-сегментный индикатор: выводим цифры с Arduino, общий анод и общий катод

Как работает 7-сегментный индикатор? Обозначения сегментов (a–g, dp), общий катод и общий анод, распиновка и резисторы, счёт 0–9, 4-разрядные индикаторы и мультиплексирование, модуль TM1637, ESP32 и Pico.

7-сегментный индикатор — простой индикатор из семи светодиодных полосок, расположенных в форме цифры «8», и маленькой точки. Его используют цифровые часы, таймеры микроволновок, табло и бензоколонки. Он дешёвый, очень яркий и легко читается даже издалека. В проектах на Arduino это один из классических выходов для счётчиков, игральных кубиков, секундомеров и часов.

Одноразрядный 7-сегментный индикатор
Одноразрядный 7-сегментный индикатор: семь сегментов-полосок и точка (dp); у него 10 выводов — пять снизу и пять сверху.

Как работает 7-сегментный индикатор?

Сегменты обозначаются буквами: начиная с a сверху и дальше по часовой стрелке идут b (справа сверху), c (справа снизу), d (снизу), e (слева снизу) и f (слева сверху); средняя полоска — g, а точка — dp. Каждый сегмент на самом деле отдельный светодиод, и в зависимости от того, какие из них горят, получаются разные цифры. Например, для «1» горят только b и c, а для «8» — все семь.

ЦифраГорящие сегменты
0a, b, c, d, e, f
1b, c
2a, b, d, e, g
3a, b, c, d, g
4b, c, f, g
5a, c, d, f, g
6a, c, d, e, f, g
7a, b, c
8a, b, c, d, e, f, g
9a, b, c, d, f, g

Общий катод или общий анод?

Как и у RGB-светодиода, один конец всех сегментов объединён в общий вывод. У индикатора с общим катодом общий вывод идёт на GND, а сегмент загорается, когда на него подают HIGH. У индикатора с общим анодом общий вывод идёт на 5V, а сегмент загорается при LOW. Снаружи они выглядят одинаково; чтобы узнать, какой у тебя, подключи общий вывод к GND и коснись вывода сегмента 5V через резистор 220 Ω. Если сегмент загорелся — общий катод; если нет, поменяй подключение и попробуй снова.

ПараметрОбщий катод (CC)Общий анод (CA)
Общий вывод (3 и 8)GND5V
Чтобы зажечь сегментHIGHLOW
В кодеdigitalWrite(pin, on)digitalWrite(pin, !on)

Распиновка и подключение к Arduino

У распространённых 10-выводных одноразрядных индикаторов выводы нумеруются против часовой стрелки, начиная с левого нижнего, если смотреть на лицевую сторону. Два средних вывода (3 и 8) — общие и соединены между собой внутри. В таблице ниже указаны и выводы индикатора, и пины Arduino, которые использует код из этой статьи:

Вывод индикатораСегментПин Arduino
7aD2
6bD3
4cD4
2dD5
1eD6
9fD7
10gD8
5dpD9
3 и 8ОбщийGND (общий катод) или 5V (общий анод)
Дай каждому сегменту свой резистор (220–330 Ω при 5 V). Если поставить один резистор на общий вывод, ток делится между всеми горящими сегментами: «1» будет очень яркой, а «8» — тусклой. Рассчитать номинал резистора поможет утилита Резистор для светодиода.

Считаем от 0 до 9 с Arduino

Если хранить, какие сегменты зажигает каждая цифра, в виде битов в массиве, код получается коротким. В примере ниже самый левый бит каждого байта — сегмент a, а самый правый — сегмент g. Функция showDigit() по очереди читает эти биты и записывает их в пины; если индикатор с общим анодом, просто поставь COMMON_ANODE в true.

C++ (Arduino IDE)
1const int SEG_PINS[7] = {2, 3, 4, 5, 6, 7, 8};   // a, b, c, d, e, f, g
2const bool COMMON_ANODE = false;                 // ortak anotsa true / true for common anode
3
4// her rakam için a–g segmentleri (1 = yanar) / a–g segments per digit (1 = on)
5const byte DIGITS[10] = {
6  0b1111110, // 0
7  0b0110000, // 1
8  0b1101101, // 2
9  0b1111001, // 3
10  0b0110011, // 4
11  0b1011011, // 5
12  0b1011111, // 6
13  0b1110000, // 7
14  0b1111111, // 8
15  0b1111011  // 9
16};
17
18void showDigit(int n) {
19  for (int i = 0; i < 7; i++) {
20    bool on = DIGITS[n] & (1 << (6 - i));       // a en soldaki bit / a is the leftmost bit
21    digitalWrite(SEG_PINS[i], COMMON_ANODE ? !on : on);
22  }
23}
24
25void setup() {
26  for (int i = 0; i < 7; i++) pinMode(SEG_PINS[i], OUTPUT);
27}
28
29void loop() {
30  for (int n = 0; n <= 9; n++) {
31    showDigit(n);
32    delay(1000);
33  }
34}
Добавь к этому коду кнопку — и получится счётчик, который увеличивается на единицу при каждом нажатии, или электронный кубик, показывающий случайное число. Подключение кнопки и дребезг контактов разобраны в статье Как подключить кнопку к Arduino.

4-разрядные индикаторы и мультиплексирование

4-разрядный 7-сегментный индикатор
4-разрядный 7-сегментный индикатор: 8 линий сегментов общие для всех четырёх разрядов, и у каждого разряда есть свой вывод выбора; всего 12 выводов.

У четырёхразрядного индикатора нет 32 отдельных выводов сегментов; у него всего 12 выводов: 8 линий сегментов (a–g и dp), общих для всех разрядов, и 4 вывода, которые выбирают, какой разряд горит. Поскольку линии сегментов общие, в один и тот же момент нельзя показать разные цифры в разных разрядах. Решение — мультиплексирование: на несколько миллисекунд зажигается только 1-й разряд, потом 2-й, 3-й и 4-й. Когда этот цикл повторяется чаще 50 раз в секунду, глаз видит все четыре разряда горящими одновременно. Вместо того чтобы писать такое сканирование вручную, гораздо проще взять библиотеку SevSeg:

C++ (Arduino IDE)
1#include "SevSeg.h"
2
3SevSeg sevseg;
4
5void setup() {
6  byte digitPins[] = {2, 3, 4, 5};                    // hane seçme pinleri / digit select pins
7  byte segmentPins[] = {6, 7, 8, 9, 10, 11, 12, 13};  // a, b, c, d, e, f, g, dp
8  sevseg.begin(COMMON_CATHODE, 4, digitPins, segmentPins, true);  // dirençler segmentlerde / resistors on segments
9  sevseg.setBrightness(90);
10}
11
12void loop() {
13  sevseg.setNumber(millis() / 1000);   // geçen saniye / elapsed seconds
14  sevseg.refreshDisplay();             // sürekli çağrılmalı / must be called continuously
15}
Не используй delay() внутри loop() с мультиплексированным индикатором. Сканирование остановится, и гореть будет только последний разряд. Отсчитывай время через millis() и следи, чтобы refreshDisplay() вызывалась постоянно.

Модуль TM1637: 4 разряда всего по 2 проводам

4-разрядный модуль 7-сегментного индикатора TM1637
Модуль TM1637: сканированием занимается микросхема-драйвер внутри; подключается всего 4 пинами: CLK, DIO, VCC и GND.

Если 12 проводов и постоянное сканирование кажутся слишком хлопотными, тебе подойдёт модуль TM1637. Его микросхема-драйвер сама занимается мультиплексированием; Arduino только сообщает ей по пинам CLK и DIO, какое число показать. У большинства версий посередине есть ещё двоеточие (:) для часов. Установи библиотеку TM1637 от Avishay Orpaz через «Менеджер библиотек» (Library Manager); код ниже показывает минуты и секунды с двоеточием:

C++ (Arduino IDE)
1#include <TM1637Display.h>
2
3TM1637Display display(2, 3);   // CLK, DIO
4
5void setup() {
6  display.setBrightness(5);    // 0–7
7}
8
9void loop() {
10  int minutes = (millis() / 60000) % 60;
11  int seconds = (millis() / 1000) % 60;
12  // ortadaki iki noktayla dakika:saniye / minutes:seconds with the colon
13  display.showNumberDecEx(minutes * 100 + seconds, 0b01000000, true);
14  delay(200);
15}

7-сегментные индикаторы с ESP32 и Raspberry Pi Pico

Одноразрядный индикатор можно подключить к ESP32 или Pico напрямую; пины выдают 3,3 V, поэтому сегменты чуть тусклее — бери резисторы поменьше, например 100–150 Ω. Модуль TM1637 тоже работает от 3,3 V и на ESP32 используется с той же библиотекой Arduino. На Pico с MicroPython достаточно скопировать на Pico файл tm1637.py (библиотека mcauser):

MicroPython
1import tm1637
2from machine import Pin
3import time
4
5tm = tm1637.TM1637(clk=Pin(16), dio=Pin(17))   # tm1637.py Pico'da olmalı / tm1637.py must be on the Pico
6tm.brightness(4)                               # 0–7
7
8count = 0
9while True:
10    tm.number(count)        # -999 … 9999
11    count += 1
12    time.sleep(1)

7-сегментный индикатор, LCD или OLED?

Параметр7-сегментныйLCD 16x2OLED
Что может показатьЦифры и несколько буквБуквы, цифры, свои символыТекст, графику, значки
ЧитаемостьОчень яркий, виден издалекаХорошая с подсветкойВысокий контраст, но маленький
Нужно пинов8 и больше (2 с TM1637)2 (I2C)2 (I2C)
Лучше всего дляЧасов, счётчиков, таблоМеню, текста с измерениямиГрафики, значков, маленьких гаджетов

Если нужно показывать только цифры и важна читаемость издалека, 7-сегментному индикатору нет равных. Если нужны текст, единицы измерения и меню, загляни в статью I2C LCD-дисплей.

Идеи проектов с 7-сегментным индикатором

  • Электронный кубик: показывай случайное число от 1 до 6 при нажатии кнопки.
  • Счётчик на кнопках: счётчик, который увеличивается одной кнопкой и сбрасывается другой.
  • Цифровые часы: часы на TM1637 с модулем RTC, который хранит время даже при отключении питания.
  • Обратный отсчёт: настраиваемый таймер для настольных игр или опытов.
  • Индикатор температуры: показывай крупными цифрами температуру, измеренную DHT11.
  • Тест реакции: показывай в миллисекундах, как быстро нажата кнопка после того, как загорелся светодиод.

Частые ошибки и как их исправить

  • Не горит ни один сегмент: общий вывод подключён не туда; возможно, индикатор с общим анодом подключён к GND.
  • Цифры выглядят как каша: неверно сопоставлены сегменты и пины Arduino; проверь, зажигая сегменты по одному.
  • Некоторые цифры тусклые: стоит один резистор на общем выводе; используй отдельный резистор на каждый сегмент.
  • На 4-разрядном индикаторе горит или мерцает только один разряд: в loop() есть delay(), или сканирование идёт недостаточно часто.
  • Нужные сегменты не горят, а остальные горят: перепутаны общий анод и катод; измени COMMON_ANODE.
  • Не хватает пинов: сократи их число с модулем TM1637, драйвером MAX7219 или сдвиговым регистром 74HC595.

Понимание того, что каждый сегмент — это светодиод, — ключ к 7-сегментным индикаторам; основы — в статье Что такое светодиод? В приложении BlueGrays есть пошаговые проекты со схемами подключения и кодом: счёт 0–9, счётчик на кнопке, кубик, 4-разрядные цифровые часы и анимация «бомбы».

Частые вопросы

Какой резистор нужен для 7-сегментного индикатора?

При 5 V подходят 220–330 Ω на каждый сегмент; 220 Ω дают более яркий свет, а 330 Ω потребляют меньше тока. На платах с 3,3 V, таких как ESP32 и Pico, можно взять 100–150 Ω. Ставь резисторы отдельно на каждую линию сегмента, а не на общий вывод.

Как узнать, с общим анодом мой 7-сегментный индикатор или с общим катодом?

Подключи общий вывод (3 или 8) к GND и коснись вывода сегмента 5V через резистор 220 Ω; если сегмент загорелся — это общий катод. Если нет, подключи общий вывод к 5V, а вывод сегмента через резистор к GND; если теперь горит — общий анод. Обычно в маркировке тоже есть CC или CA.

Сколько выводов у 7-сегментного индикатора?

У одноразрядных индикаторов 10 выводов: 7 сегментов, 1 точка и 2 общих. У четырёхразрядных 12 выводов: 8 общих линий сегментов и 4 вывода выбора разряда. Модули вроде TM1637 подключаются всего 4 пинами (CLK, DIO, VCC, GND).

Почему на моём 4-разрядном индикаторе горит только один разряд?

Четырёхразрядные индикаторы работают на мультиплексировании, поэтому разряды нужно постоянно сканировать один за другим. Если в loop() есть delay(), сканирование останавливается, и горит только последний разряд. Используй библиотеку вроде SevSeg, постоянно вызывай refreshDisplay() и отсчитывай время через millis().

Может ли 7-сегментный индикатор показывать буквы?

Некоторые — да: A, b, C, d, E, F, H, L, P, U и o выглядят узнаваемо. Буквы вроде K, M, W и X семью сегментами нормально не нарисовать. Если нужно показывать текст, лучше подойдёт LCD- или OLED-дисплей.

Как управлять 7-сегментным индикатором с меньшим числом пинов?

Проще всего взять модуль с микросхемой-драйвером: TM1637 управляет четырьмя разрядами по 2 проводам, а MAX7219 — восемью разрядами по 3. Если нужна своя схема без готового модуля, сдвиговый регистр 74HC595 позволяет управлять 8 сегментами всего с 3 пинов Arduino.

Все проекты
Цифры 0–9 на семисегментном индикаторе
#41Средний
Premium

Цифры 0–9 на семисегментном индикаторе

Сам выведи те знакомые цифры, которые видишь в лифтах и электронных часах. На индикаторе из семи маленьких светящихся полосок Arduino каждую секунду показывает цифру от 0 до 9, а затем начинает сначал

4.5(30)
43
Числа 0–99 на семисегментном индикаторе
#42Продвинутый
Premium

Числа 0–99 на семисегментном индикаторе

Двухразрядный индикатор из маленьких полосок, как на калькуляторе, считает от 0 до 99. Arduino делит каждое число на единицы и десятки и зажигает нужные полоски из семи в каждом разряде; число растёт

4.5(27)
35
Счётчик на семисегментном индикаторе с кнопками
#43Продвинутый
Premium

Счётчик на семисегментном индикаторе с кнопками

Простой счётчик с тремя кнопками: нажми одну — цифра на индикаторе увеличится на единицу, нажми другую — уменьшится, а третья возвращает её к нулю. Одноразрядный семисегментный индикатор считает от 0

4.6(35)
47
Игральный кубик
#79Средний
Premium

Игральный кубик

Больше никаких потерянных кубиков во время настольных игр: при каждом нажатии кнопки на семисегментном индикаторе появляется случайное число от 1 до 6. Каждое нажатие даёт ровно один результат, и он т

5.0(48)
67
Числа 0–9999 на 4-разрядном семисегментном индикаторе
#47Средний
Premium

Числа 0–9999 на 4-разрядном семисегментном индикаторе

На четырёхразрядном индикаторе числа несутся от 0 до 9999, а затем снова начинаются с нуля. Arduino обманывает твои глаза, чтобы все четыре разряда казались горящими одновременно: на самом деле она за

4.4(19)
25
Цифровые часы на 4-разрядном семисегментном индикаторе
#48Средний
Premium

Цифровые часы на 4-разрядном семисегментном индикаторе

Светящиеся цифровые часы из четырёх разрядов, почти как на кухонной духовке. Модуль часов DS1302 хранит время, а Arduino каждую секунду читает часы и минуты и показывает их на четырёхразрядном индикат

4.8(56)
73
Анимация бомбы на 4-разрядном семисегментном индикаторе
#49Новичок
Premium

Анимация бомбы на 4-разрядном семисегментном индикаторе

Сцена с тикающей бомбой из фильмов прямо у тебя на столе и совершенно безопасная: 4-разрядный индикатор отсчитывает время от 1:05, зуммер пищит каждую секунду, а красный светодиод мигает. Ты решаешь,

4.8(63)
79
4-разрядный семисегментный индикатор TM1637 на ESP32
#125Средний
Premium

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

Модуль 4-разрядного семисегментного индикатора с драйвером TM1637 управляется с ESP32. Всего через 2 пина GPIO (CLK и DIO) запускается счётчик от 0 до 9999, меняется яркость и показывается двоеточие (:) в формате часов. Благодаря библиотеке TM1637Display выводить числа, шестнадцатеричные значения, сегменты и строки очень просто.

4.7(20)
32