

7-сегментные дисплеи часто оказываются куда сложнее, чем кажется на первый взгляд. В сущности, нужно просто включать несколько светодиодов для отображения цифр или букв. То есть, нужно управлять каждым сегментом каждой цифры, а если у цифр четыре, это уже 4 * 7 = 28 выходов! Не забывайте и о проводке с резисторами. А когда приходится управлять множеством таких дисплеев, всё становится куда сложнее. Я решил создать простой способ, который позволяет использовать любое количество 7-сегментных дисплеев с высокой степенью модульности. Нужно ли 20 дисплеев или всего 2 — в любом случае вам понадобится всего одна линия данных от Arduino для управления.
Шаг 1: Подготовьте необходимые детали и инструменты

В этом проекте используется минимальное количество деталей, почему он мне и нравится, но придётся освоить пайку SMD-компонентов.
Компоненты для одного дисплея:
1 x печатная плата — файлы можно скачать с GitHub или заказать через PCBWay
3 x WS2811 — Adafruit
1 x 7сегментный дисплей — должен быть с общим анодом! Они есть у Sparkfun
3 x Резистор 33 Ом 0805 — Digikey
3 x Конденсатор 1 мкФ 0805 — Digikey
1 x 3-пиновый угловой разъем — Female — Digikey
1 x 3-пиновый угловой разъем — Male — Digikey
Инструменты:
Паяльник
Печь для рефлоу или паяльная станция с горячим воздухом (опционально, но проще)
Паяльная паста или припой
Шаг 3: Начнём с SMD-компонентов

Нанесите паяльную пасту на обратную сторону платы. Все используемые компоненты достаточно просты в работе, так что это отличный проект для начала, если вы ещё ни разу не паяли SMD-компоненты (поверхностно-монтируемые) методом оплавления (рефлоу). После нанесения пасты установите конденсаторы, резисторы, а затем микросхему WS2811. Следуйте маркировке на плате.
Шаг 4: Процесс рефлоу

Возьмите паяльную станцию с горячим воздухом или печь для рефлоу и прогрейте компоненты до плавления паяльной пасты. Если у вас нет станции с горячим воздухом или печи для рефлоу, можно использовать обычный паяльник с припоями. Это более трудоёмко, но вполне выполнимо. У меня есть видео по этой теме, если хотите узнать несколько техник.
Шаг 5: Добавьте пины для разъёмов

Порядок шагов в этом руководстве имеет значение. Разъёмы нужно паять первыми, потому что их контактные площадки вскоре будут скрыты под компонентом 7-сегментного дисплея. На плате указана правильная ориентация разъёмов — постарайтесь установить их как можно ровнее.
Шаг 6: Припаяйте 7-сегментный дисплей

Последним этапом нужно припаять компонент 7-сегментного дисплея. Убедитесь, что он правильно ориентирован — ориентируйтесь на маркировку на шелкографии.
Когда пайка завершена, очистите плату с помощью очистителя — и всё готово!
Шаг 7: Как работает схема

Чип WS2811 позволяет управлять тремя светодиодами с регулируемой яркостью. Обычно это красный, зелёный и синий светодиоды, что позволяет создать тысячи различных цветов. В случае с 7-сегментным дисплеем мы используем три WS2811 для управления яркостью 8 различных сегментов дисплея. Два чипа WS2811 подключены к трём сегментам, трейти — к двум, а оставшийся сегмент соединён с неустановленным светодиодом, который я решил оставить про запас — на случай, если пригодится.
Адресуемость WS2811 заключается в том, что он может передавать данные от одного WS2811 к другому. Когда вы отправляете строку битов (данных), чип принимает информацию о том, какие светодиоды нужно включить, и передаёт часть данных следующему WS2811, пока все они не получат нужную информацию. Это значит, что для передачи данных достаточно всего одной линии. После того как данные для одного дисплея получены, чип передаёт информацию следующему.
На изображении выше представлена упрощённая схема подключения. Свободный зелёный провод идёт на следующий дисплей.
Шаг 8: Как работает демонстрационная программа

Я написал программу для Arduino, чтобы продемонстрировать отображение информации на адресном 7-сегментном дисплее. Она использует библиотеку Adafruit NeoPixel для управления 7-сегментными дисплеями. По сути, каждая цифра представляет собой в 3 Neopixels. Вы можете отправить одну цифру на дисплей и контролировать её яркость, просто написав:
writeDigit(DisplayNumber, Number, Brightness);
DisplayNumber
— это номер дисплея, на который вы хотите вывести цифру, начиная с 0. Number
— это цифра, которую вы хотите отобразить на дисплее (от 0 до 9), а Brightness — значение яркости от 0 до 255.
Каждый раз, когда нужно обновить дисплеи, отправьте:
segments.show();
Поскольку здесь не используется мультиплексирование, это упрощает выполнение таких задач, как пульсация чисел, их затемнение, создание интересных анимаций.
Вложения
addr_7seg_demo.ino: скачать
Шаг 9: Соединение дисплеев в цепочку
Это самая крутая часть. Если для проекта требуется 5 дисплеев, просто соедините их и измените код для отображения 5 дисплеев. Нужно 10? Просто соедините 10. Это так просто, и проводка остаётся точно такой же! Всего 3 провода.
Если хотите углубиться в разработку динамичных интерфейсов или реализовать собственный проект на Go с понятной архитектурой, обратите внимание на эти разборы:
7 мая 20:00 — Первое приложение на React: собираем игру Wordle шаг за шагом.
Быстрая практика основ React: компоненты, хуки, управление состоянием и вводом пользователя. Соберём рабочую версию игры Wordle за один вечер.13 мая 20:00 — Telegram-бот на Go с нуля: персональный менеджер задач.
Пошаговая разработка Telegram-бота на Go: базовая архитектура, обработка событий, настройка и идеи для расширения функционала.
Больше открытых уроков от преподавателей-практиков по разработке и не только смотрите в календаре.