Как подключить семисегментный индикатор к Arduino
В этой статье описывается схема подключения пары светодиодных семисегментных индикаторов к Arduino Uno с помощью микросхем-драйверов CD4026. При таком подходе для вывода произвольного числа используется всего 2 цифровых выхода контроллера.
Для примера будем выводить на индикаторы количество секунд, прошедших с момента начала работы.
Исходные компоненты
Для эксперимента нам понадобятся:
Принцип работы
Семисегментный индикатор — это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.
Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.
На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.
Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.
Подключение
Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.

Далее, подключим один из драйверов в соответствии с его распиновкой

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

Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через токоограничивающие резисторы как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.
Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)


Повторяем процедуру для второго разряда

Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.
Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.

Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.
Железо подготовленно, осталось реализовать несложную программу.
Программирование
Результат
Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 — к общему reset’у драйверов; разводим питание; включаем — работает!
Arduino: 7-сегментный индикатор
Если вы научились пользоваться «световой шкалой», то следующий шаг в освоении нового компонента «7-сегментный индикатор» дастся вам легко. Он попадается практически во всех стартовых наборах.
Одноразрядный 7-сегментный индикатор

Мы имеем дело опять с набором светодиодов, только на этот раз их 8 (семь полосок и один кружочек) и они расположены не друг за другом, а в определённом порядке, которые позволяют вам выводить цифры от 0 до 9.
Важная отличительная черта — у индикатора имеются общие ножки для катода (ножки 3 и 8). Всего их две и они равноценны. Это удобно, вам не нужно будет от каждого катода вести отдельный провод на землю. Достаточно выбрать один из общих катодов и от неё соединиться с GND. Аноды у всех отдельные.
Также при желании вы можете установить несколько таких индикаторов подряд для вывода больших двухзначных, трёхзначных и т.д. чисел. Но существуют готовые компактные наборы для этих целей.
На 7-сегментный индикатор распространяются те же правила, что и на стандартные светодиоды — у каждого должен быть свой резистор. Поэтому для опытов приготовьте 8 резисторов.
Схематично можно изобразить следующим образом.



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

Для проверки можно запустить стандартный пример Blink, только установите в качестве проверочного светодиода любой из ваших используемых портов. Я выбрал пятый порт, чтобы помигать точкой.
Если мы хотим помигать цифрой 1, то нам надо использовать светодиоды 4 и 6, которые идут на порты 4 и 6 платы микроконтроллера.
Если мы захотим вывести цифру 5, то понадобится работать с пятью светодиодами, цифру 8 — уже семь светодиодов. При сложных проектах работать с таким количеством становится затруднительно. Придётся каждый раз смотреть на схему, что вспомнить, какие светодиоды нужно включить для отображения каждой цифры.
Но можно пойти другим путём. А поможет нам единица информации — байт. Байт в своём двоичном представлении состоит из 8 бит. Каждый бит может принимать значения 0 или 1. А наш светодиодный индикатор как раз и состоит из восьми светодиодов. Таким образом мы можем представить цифру на индикаторе в виде набора байт, где единица будет отвечать за включённый диод, а ноль — за выключенный диод.
Число в двоичном виде записывается следующим образом:
Первые два символа 0b дают понять, что речь идёт о двоичном счёте. Все нули означают, что все светодиоды будут выключены.
У нас задействованы порты от 2 по 9. Второй порт записывается в самую правую позицию. Чтобы его включить, поставим единицу.
Можно самостоятельно включать по отдельности каждый диод, перемещая единицу в представленном байте. Поняв принцип, можно, например, заметить, что за точку отвечает четвёртый бит справа. Если мы его не будем использовать, то он всегда будет равен 0. За чёрточку посередине индикатора отвечает самый последний байт (или первый слева).
Комбинируя набор нулей и единиц, можно создать нужные нам цифры. Например, цифра 0 будет представлена как 0b01110111.
Давайте напишем пример вывода цифры 0.
Код немного избыточен, переменная mask здесь лишняя, но она нам пригодится в следующем примере. Здесь важно, что мы пробегаемся в цикле по числу светодиодов и устанавливаем у всех режим OUTPUT. Затем также в цикле проходим через все светодиоды и узнаём, комбинацию бит с помощью метода bitRead(). Полученная информация помогает нам подсветить нужные светодиоды и получить цифру 0 на выходе.
Для остальных цифр можно также подготовить нужные наборы бит.
Но мы пойдём другим путём. Все эти значения мы поместим в массив. И будем вытаскивать по индексу. А индексом для примера нам послужит метод millis. С его помощью мы можем получить число секунд, прошедших с запуска скетча, но выводить будем только последнюю цифру прошедших секунд.
Запустив пример, мы получим реальный секундомер. За точность не ручаюсь, но для простых задач подойдёт.
На видео некоторые цифры отображаются коряво, видимо из-за особенностей записи. В реальности все цифры работают как положено.
Позже я добавил на плату ещё один светодиод, который загорался при значении 0. При других значениях он был выключен.
На Амперке есть упоминания о двух компонентах, которые можно использовать для светодиодного индикатора. Я пока ими не пользовался:
Четырёхразрядный 7-сегментный индикатор

У четырёхразрядного 7-сегментного индикатора двенадцать выводов: 8 для каждого разряда с точкой и 4 для выбора нужного разряда. Чтобы разобраться в подключении, желательно иметь картинку перед глазами.
Если индикатор держать точкой вниз, то отсчёт идёт против часовой стрелки от нижнего левого угла.

Выводы 6, 8, 9 и 12 отвечают за конкретные разряды. Это могут быть общие катоды или общие аноды.
Выводы 1, 2, 3, 4, 5, 7, 10, 11 отвечают за конкретные сегменты. Например, самая верхняя полоска обозначена буквой A и имеет номер вывода 11. Таким образом, если подключить выводы 11 и 12 индикатора к выводу 11 и 12 на плате Arduino, то можем управлять этой полоской стандартным способом, например, помигать светодиодом.

Соедините все двенадцать выводов индикатора с выводами на плате. В своих примерах я использовал следующую схему.
При необходимости используйте резисторы, хотя во многих примерах в интернете встречал схемы без них.
Включаем букву H на всех разрядах.
Работа с индикатором показалась мне слишком муторной и сложной. Дополнительные материалы можно посмотреть на сайте, с которого я взял часть примеров.
Библиотека fDigitsSegtPin
К счастью есть библиотека fDigitsSegtPin, которую можно установить через менеджер библиотек. Подключаем библиотеку, указываем все двенадцать выводов по порядку и выводим нужное число.
Модули 7-сегментных дисплеев
Большое количество выводов у 7-сегментных дисплеев не слишком удобно использовать. Поэтому появились дисплеи в виде готовых модулей. Например, популярна модель TM1637.
Как подключить 7-сегментный индикатор к Arduino
1 Описание сегментного светодиодного индикатора
Индикатор называется 7-сегментным из-за того, что он состоит из семи светодиодов, которые расположены в форме цифры «8». Зажигая определённые сегменты, можно изображать разные цифры. Это похоже на цифры индекса на почтовом конверте: закрашивая определённые участки, мы пишем разные индексы. Зачастую дополнительно к 7-ми сегментам, индикатор содержит десятичную точку. Также индикатор может иметь несколько цифр – разрядов. Обычно от одного до 4-х. Сегменты индикатора обозначаются латинскими буквами от A до G, а DP – это десятичная точка (decimal point).
Обозначение сегментов 7-, 9-, 14- и 16-сегментных индикаторов
К слову, существуют сегментные индикаторы, число сегментов которых отличается от 7-ми. Так, например, существуют 14- и 16-сегментные индикаторы. Кроме цифр от 0 до 9 они также позволяют выводить буквы. Принцип их работы и управления обычно идентичны таковым для 7-сегментных индикаторов.
Мы в качестве индикатора будем использовать семисегментный индикатор 3361AS-1. Он построен по принципу индикатора с общим катодом. Это значит, что индикатор состоит из нескольких светодиодов в одном корпусе, у которых общая земля, а питание на каждый светодиод подаётся отдельно.
Как не трудно догадаться, существуют индикаторы с общим анодом. У них всё наоборот: общее питание, а для зажигания отдельного светодиода необходимо подать на него нулевой уровень.
2 Подключение 7-сегментного индикатора непосредственно к Arduino
Мы можем подключить индикатор прямо к выводам Arduino. Для этого придётся задействовать сразу 7 ножек (или 8, если нужна десятичная точка). Обратим внимание, что индикатор 3361AS не имеет токоограничивающих резисторов. Необходимо обеспечить наличие сопротивления номиналом около 180…220 Ом на каждый вывод индикатора (т.к. питание подаём +5 В от Arduino).
Электрическая схема 7-сегментного индикатора 3361AS
Расположение выводов индикатора показано на иллюстрации:
Размеры корпуса и расположение выводов 7-сегментного индикатора 3361AS
Подключать индикатор будем в соответствии с таблицей. Будет выбран первый разряд, остальные два пока не будем трогать.
| Вывод индикатора 3361AS | Назначение | Вывод Arduino |
|---|---|---|
| 1 | Сегмент E | D6 |
| 2 | Сегмент D | D5 |
| 3 | DP | D9 |
| 4 | Сегмент C | D4 |
| 5 | Сегмент G | D8 |
| 7 | Сегмент B | D3 |
| 8 | Выбор 3-го разряда | 5V |
| 9 | Выбор 2-го разряда | 5V |
| 10 | Сегмент F | D7 |
| 11 | Сегмент A | D2 |
| 12 | Выбор 1-го разряда | GND |
Напишем скетч, который последовательно выводит числа от 0 до 9 на первом разряде индикатора.
Скетч управления индикатором 3361AS (разворачивается)
Небольшое пояснение по поводу массива numbers[] в функции printNumber().
Этот массив состоит из 10-ти подмассивов, каждый из которых определяет одну цифру от 0 до 9. В свою очередь подмассивы состоят из 8-ми элементов, которые задают состояния сегментов от A до G и DP. Например, первый подмассив описан как <1,1,1,1,1,1,0,0>и он отвечает за вывод на индикатор нуля. Это означает, что сегменты A,B,C,D,E,F должны гореть, а сегменты G и DP – нет.
В результате получаем примерно следующее:
Управление 7-сегментным индикатором с помощью Arduino Nano
И вот так в динамике:
Это самый простой способ управления сегментным индикатором, но, как мы видим, он задействует почти все цифровые ножки Arduino. Особенно если мы решим использовать все разряды индикатора. Тогда кроме ножек для управления сегментами придётся дополнительно использовать столько выводов, сколько разрядов у индикатора. Получится, что для управления 7-сегментным индикатором с 3-мя разрядами необходимо 11 ножек (7 сегментов + 1 десятичная точка + 3 ножки для выбора разряда). Это расточительно, и не всегда можно такое себе позволить.
3 Драйвер для управления 7-сегментным индикатором
Чтобы сократить число задействованных выводов микроконтроллера обычно на практике используются различные решения. Например, популярным способом управления 7-сегментным индикатором является применение микросхемы CD4511 – двоично-десятичного преобразователя. Он переводит двоичный код числа в напряжение на соответствующих цифре сегментах индикатора. Такой преобразователь будет использовать всего 4 ножки Arduino. То есть, например, если необходимо отобразить на индикаторе десятичное число 7, необходимо выставить на входе преобразователя двоичное 0111 («LOW HIGH HIGH HIGH»). Микросхема CD4511 выполняется в разных типах корпусов. Назначение выводов в исполнении с 16-тью ножками, такое:
Выводы двоично-десятичного преобразователя CD4511
Отечественными аналогами данного преобразователя являются микросхемы серий ИД1…ИД7. Кстати, отечественные преобразователи изображают цифры «6» и «9», используя 6 сегментов, а зарубежные CD4511 – только 5 сегментов.
Разница в выводе цифр CD4511 и ИД7
4 Управление 7-сегментным индикатором с помощью драйвера CD4511 и Arduino
При подключении двоичного декодера будем руководствоваться следующей таблицей:
| Вывод CD4511 | Назначение | Примечание |
|---|---|---|
| A0. A3 | Входы двоичного преобразователя | Соответствуют разрядам двоичного числа. |
| a. g | Выходы на сегменты индикатора | Подключаются через токоограничивающие резисторы к соответствующим сегментам светодиодного индикатора. |
| Lamp Test# | Тест индикатора (включает все сегменты) | Подключим к питанию, не использовать его. |
| Blanking# | Очистка индикатора (отключает все сегменты) | Подключим к питанию, чтобы не использовать его. |
| Latch Enabled# | Выход активен | Будет подключен к земле, чтобы выход был всегда активен. |
| VDD | Питание микросхемы и индикатора | От 3 до 15 В. |
| GND | Земля | Общая у CD4511, Arduino, 7-сегментного индикатора. |
Желательно также подключить керамический конденсатор ёмкостью примерно 1 мкФ между землёй и питанием микросхемы CD4511.
Подключение 7-сегментного индикатора к Arduino с двоичным декодером CD4511B
Теперь напишем простой скетч, чтобы проверить работоспособность 7-сегментного индикатора 3361AS-1 в связке с двоично-десятичным декодером, а также получить опыт работы с ними. Данный скетч будет поочерёдно перебирать числа от 0 до 9, перемещаясь по циклу от одного разряда индикатора к следующему.
Скетч для управления 7-сегментным индикатором (светится 1 разряд) (разворачивается)
Загрузим скетч в Arduino и посмотрим результат.
В один момент времени светится только один разряд индикатора. Как же задействовать одновременно сразу три разряда индикатора? Это будет немного сложнее. Сложность заключается в том, что нам одновременно нужно управлять тремя разрядами десятичного число, используя только один преобразователь CD4511. Но чисто физически это невозможно. Однако можно добиться иллюзии постоянного свечения всех разрядов светодиодного индикатора. Для этого придётся быстро переключаться между разрядами, постоянно обновляя показание каждого разряда. Мы будем поочерёдно активировать каждый из разрядов индикатора 3361AS, выставлять на нём с помощью двоичного преобразователя CD4511 нужную цифру, а затем переключаться на следующий разряд.
Для человеческого глаза такое переключение между разрядами будет незаметно, но если результат снять на видео, то его можно увидеть.
Также перепишем функцию setNumber() отправки двоичного кода на вход микросхемы преобразователя CD4511. Вместо использования оператора switch, используем массив массивов.
Скетч для управления трёхразрядным 7-сегментным индикатором (разворачивается)
Получится вот такая картина.
Управление трёхразрядным семисегментным индикатором с помощью преобразователя CD4511 и Arduino
В динамике это выглядит так. Тут как раз временами видны мерцания сегментов светодиодного индикатора.
Можно попробовать поиграть значением задержек в функции setDigit(). Если сделать задержки меньше, то мерцание станет меньше заметно. Но начнут сильнее засвечиваться соседние сегменты на выбранном разряде индикатора. Тут необходимо выбрать какое-то компромиссное решение.
5 Управление 7-сегментным индикатором с помощью драйвера TM1637 и Arduino
Существуют и другие драйверы для подключения 7-сегментных дисплеев. Один из них – TM1637. Есть готовые модули, в которых уже присутствует и индикатор, и драйвер, и вся необходимая «обвязка» (резисторы, конденсаторы). Пример – модуль HW-069. В качестве семисегментного индикатора здесь 4-разрядный индикатор 3642BS-1.
Модуль HW-069 с драйвером TM1637 и четырёхразрядным семисегментным индикатором
Подключение модуля к Arduino предельно простое, т.к. для обмена с драйвером используется интерфейс, очень похожий на I2C. Т.е. необходимо подключить питание от 5 В Arduino, а данные передаются по DIO и тактируются по CLK. Но тем не менее, интерфейс не эквивалентен полностью I2C, т.к. у дисплея нет своего адреса.
Модуль HW-069 с драйвером TM1637 и четырёхразрядным семисегментным индикатором
Как всегда, есть множество готовых библиотек для управления индикатором через драйвер TM1637. Например, библиотека Gyver TM1637 или библиотека Avishay TM1637.
Модуль с драйвером TM1637 работает с Arduino UNO
Эти библиотеки работают прекрасно, и рассказывать, как загружать и устанавливать библиотеку для Arduino не буду: мы это делали уже миллион раз. Мы же не ищем лёгких путей, поэтому попробуем разобраться в работе драйвера TM1637 самостоятельно, верно?
Семисегментный индикатор Ардуино подключение
Одноразрядный семисегментный индикатор Arduino можно подключить к плате с помощью макетной платы, главное — знать распиновку модуля для управления сегментами от микроконтроллера. Рассмотрим в этой статье, как подключить 7-сегментный индикатор к Arduino Uno и составим простую программу с таймером, будем управлять светодиодным индикатором 5161as непосредственно с платы Ардуино и с помощью тактовой кнопки.
Необходимые компоненты:
- Arduino Uno / Arduino Nano / Arduino Mega
- 7-сегментный дисплей 5161
- резисторы
- тактовая кнопка
- макетная плата
- коннекторы
На рисунке показана распиновка одноразрядного 7-сегментного дисплея с общим катодом (минус) и общим анодом (минус). Модуль представляет собой небольшой светодиодный индикатор, который содержит семь светодиодов (отсюда и название индикатора) и восьмой светодиод в форме точки. Включая светодиоды модуля в разной последовательности от микроконтроллера, можно выводить различные числа на 7-сегментном индикаторе.
7 сегментный индикатор распиновка, характеристики

Характеристики семисегментный индикатор
- Напряжение питания: от 3 В до 5 В
- Диапазон рабочих температур: от -40°C до +85°C
Обратите внимание, что у этого модуля нет встроенных резисторов, поэтому для подключения светодиодов используйте внешние резисторы. Если вам непонятна распиновка семисегментного дисплея с общим анодом, вы можете экспериментально установить распиновку, подключая питание к разным контактам. При неправильном подключении ничего не произойдет, но без резистора светодиоды модуля перегорят.
Как подключить семисегментный индикатор к Ардуино

Чтобы использовать модуль 5161as или hdsp 7503 без сдвигового регистра 74hc595, нам потребуется задействовать большое количество выводов на Arduino Uno. В первом примере мы просто будем поочередно включать и отключать светодиоды для обозначения различных чисел на дисплее. Соберите схему с индикатором, как показано на изображении выше, и загрузите в микроконтроллер следующий пример программы.
Скетч управление семисегментным индикатором
Подключение семисегментного индикатора к Ардуино

В следующем примере цифры на дисплее 7-сегментного индикатора изменяются только при нажатии кнопки. При достижении цифры 3 таймер сбрасывается на нуль и ждет повторного нажатия кнопки. Это довольно простые программы для Arduino и 7-сегментного дисплея, для более сложных и интересных программ на базе микроконтроллеров Ардуино необходимо использовать сдвиговый регистр 74hc595 для Arduino Uno или модуль tm1637.
Скетч управление 7-сегментным дисплеем Ардуино
Заключение. Мы ограничились кратким обзором модуля и его применением с платой Ардуино. Используя несколько панелей или четырехзначный индикатор tm1637, вы уже можете сделать полноценный таймер на Arduino или часы реального времени. Мы разместили схемы и программы этих проектов на нашем сайте в разделе Проекты на Ардуино для начинающих, где каждый сможет найти проект по своему вкусу.
