7-сегментный индикатор: выводим цифры с Arduino, общий анод и общий катод
Как работает 7-сегментный индикатор? Обозначения сегментов (a–g, dp), общий катод и общий анод, распиновка и резисторы, счёт 0–9, 4-разрядные индикаторы и мультиплексирование, модуль TM1637, ESP32 и Pico.
7-сегментный индикатор — простой индикатор из семи светодиодных полосок, расположенных в форме цифры «8», и маленькой точки. Его используют цифровые часы, таймеры микроволновок, табло и бензоколонки. Он дешёвый, очень яркий и легко читается даже издалека. В проектах на Arduino это один из классических выходов для счётчиков, игральных кубиков, секундомеров и часов.

Как работает 7-сегментный индикатор?
Сегменты обозначаются буквами: начиная с a сверху и дальше по часовой стрелке идут b (справа сверху), c (справа снизу), d (снизу), e (слева снизу) и f (слева сверху); средняя полоска — g, а точка — dp. Каждый сегмент на самом деле отдельный светодиод, и в зависимости от того, какие из них горят, получаются разные цифры. Например, для «1» горят только b и c, а для «8» — все семь.
| Цифра | Горящие сегменты |
|---|---|
| 0 | a, b, c, d, e, f |
| 1 | b, c |
| 2 | a, b, d, e, g |
| 3 | a, b, c, d, g |
| 4 | b, c, f, g |
| 5 | a, c, d, f, g |
| 6 | a, c, d, e, f, g |
| 7 | a, b, c |
| 8 | a, b, c, d, e, f, g |
| 9 | a, b, c, d, f, g |
Общий катод или общий анод?
Как и у RGB-светодиода, один конец всех сегментов объединён в общий вывод. У индикатора с общим катодом общий вывод идёт на GND, а сегмент загорается, когда на него подают HIGH. У индикатора с общим анодом общий вывод идёт на 5V, а сегмент загорается при LOW. Снаружи они выглядят одинаково; чтобы узнать, какой у тебя, подключи общий вывод к GND и коснись вывода сегмента 5V через резистор 220 Ω. Если сегмент загорелся — общий катод; если нет, поменяй подключение и попробуй снова.
| Параметр | Общий катод (CC) | Общий анод (CA) |
|---|---|---|
| Общий вывод (3 и 8) | GND | 5V |
| Чтобы зажечь сегмент | HIGH | LOW |
| В коде | digitalWrite(pin, on) | digitalWrite(pin, !on) |
Распиновка и подключение к Arduino
У распространённых 10-выводных одноразрядных индикаторов выводы нумеруются против часовой стрелки, начиная с левого нижнего, если смотреть на лицевую сторону. Два средних вывода (3 и 8) — общие и соединены между собой внутри. В таблице ниже указаны и выводы индикатора, и пины Arduino, которые использует код из этой статьи:
| Вывод индикатора | Сегмент | Пин Arduino |
|---|---|---|
| 7 | a | D2 |
| 6 | b | D3 |
| 4 | c | D4 |
| 2 | d | D5 |
| 1 | e | D6 |
| 9 | f | D7 |
| 10 | g | D8 |
| 5 | dp | D9 |
| 3 и 8 | Общий | GND (общий катод) или 5V (общий анод) |
Считаем от 0 до 9 с Arduino
Если хранить, какие сегменты зажигает каждая цифра, в виде битов в массиве, код получается коротким. В примере ниже самый левый бит каждого байта — сегмент a, а самый правый — сегмент g. Функция showDigit() по очереди читает эти биты и записывает их в пины; если индикатор с общим анодом, просто поставь COMMON_ANODE в true.
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}4-разрядные индикаторы и мультиплексирование

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

Если 12 проводов и постоянное сканирование кажутся слишком хлопотными, тебе подойдёт модуль TM1637. Его микросхема-драйвер сама занимается мультиплексированием; Arduino только сообщает ей по пинам CLK и DIO, какое число показать. У большинства версий посередине есть ещё двоеточие (:) для часов. Установи библиотеку TM1637 от Avishay Orpaz через «Менеджер библиотек» (Library Manager); код ниже показывает минуты и секунды с двоеточием:
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):
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 16x2 | OLED |
|---|---|---|---|
| Что может показать | Цифры и несколько букв | Буквы, цифры, свои символы | Текст, графику, значки |
| Читаемость | Очень яркий, виден издалека | Хорошая с подсветкой | Высокий контраст, но маленький |
| Нужно пинов | 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 на семисегментном индикаторе
Сам выведи те знакомые цифры, которые видишь в лифтах и электронных часах. На индикаторе из семи маленьких светящихся полосок Arduino каждую секунду показывает цифру от 0 до 9, а затем начинает сначал

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

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

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

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

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

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

4-разрядный семисегментный индикатор TM1637 на ESP32
Модуль 4-разрядного семисегментного индикатора с драйвером TM1637 управляется с ESP32. Всего через 2 пина GPIO (CLK и DIO) запускается счётчик от 0 до 9999, меняется яркость и показывается двоеточие (:) в формате часов. Благодаря библиотеке TM1637Display выводить числа, шестнадцатеричные значения, сегменты и строки очень просто.
Другие статьи
Приложение BlueGrays
Собери эту схему шаг за шагом в телефоне
Схема подключения, код и список деталей на одном экране. 200+ проектов на Arduino, ESP32 и Pico готовы к сборке.
Наведи камеру телефона
Наведи камеру на код — откроется магазин приложений на телефоне.
или открыть магазин

