Семисегментный индикатор Arduino: подключение и распиновка
На столе индикатор, в руках двенадцать ножек — и ни одной подписи. В ролике, который привёл вас сюда, всё соединили за пять минут и улыбнулись в камеру; на макетке те же действия дают палку посередине там, где ждали пустоту, и пустоту там, где ждали двойку. Даташит на деталь из рыночного пакета — три строки на китайском, форумные советы стартуют со сдвигового регистра, а до регистра ещё надо дожить. Схема тут простая, но на каждые два провода приходится одна ловушка: перепутанный общий вывод, забытый резистор, скетч чужой полярности.
Разбираемся без магии: что сидит на каждой ножке, почему резистор 220-330 Ом нужен на каждый сегмент, а не один на всех, и как байт-маска превращается в цифру силой bitRead — без единой библиотеки. Схему с резисторами можно щупать на живом уроке из курса, а карту пинов платы я держу под рукой на странице с распиновкой Uno — там D2-D8 помечены на рисунке.
Ножки индикатора: сегменты a-g, точка и общий вывод
Двенадцать ножек распадаются на две группы: восемь сегментных и четыре общих. Сегменты промаркированы латинскими буквами a-g: a — верхняя перекладина, правая сторона — b и c, низ — d, левая — e и f, посередине g; восьмая сегментная линия — десятичная точка dp. Общие выводы соединяют между собой одноимённые электроды всех разрядов: сегментные линии у цифр общие, а общие ножки — персональные, по одной на разряд. Начинать советую с одной цифры: у одноразрядника десять ножек, две из них общие и внутри соединены накоротко, так что в GND уходит любая из пары. Каждый сегмент — обычный светодиод: красный съедает 2-2,2 В при расчётных 20 мА, и от 5 В резистору остаётся погасить около 2,8 В — минимум 140 Ом, на практике ставят 220-330 Ом: чуть тусклее, зато пин никогда не подбирается к своему потолку 40 мА. Живая схема с кнопкой и резисторами собрана в уроке про подключение семисегментника.
| Сегмент | Бит в маске | Пин Uno | Резистор |
|---|---|---|---|
| a — верхняя перекладина | 0, вес 1 | D2 | 220-330 Ом |
| b — верхняя правая | 1, вес 2 | D3 | 220-330 Ом |
| c — нижняя правая | 2, вес 4 | D4 | 220-330 Ом |
| d — нижняя перекладина | 3, вес 8 | D5 | 220-330 Ом |
| e — нижняя левая | 4, вес 16 | D6 | 220-330 Ом |
| f — верхняя левая | 5, вес 32 | D7 | 220-330 Ом |
| g — средняя перекладина | 6, вес 64 | D8 | 220-330 Ом |
| dp — десятичная точка | 7, вес 128 | D9 | по желанию, если нужна точка |
Бит в маске — не абстракция: бит 0 ведает сегментом a, бит 6 — сегментом g, а номер пина вычисляется на лету — 2 плюс номер бита. Общий вывод одноразрядника с общим катодом уходит на GND, сегмент загорается единицей; у анодного всё зеркально — общий на 5 В, зажигает ноль, и отличать их мультиметром мы научимся ниже. Четырёхразряднику при прямом подключении нужно уже двенадцать пинов и мультиплексирование в скетче — если это не ваш маршрут, посмотрите на модуль TM1637 с двумя сигнальными проводами. Ниже — живая лаборатория: кликайте сегменты и собирайте цифру, маска и код посчитаются сами.
Зажигайте сегменты по одному биту и собирайте цифры 0–9.
Подгружаем интерактив…
Скетч без библиотеки: массив масок и bitRead
// Общий катод: катоды всех сегментов — на GND,// каждый сегмент — через свой резистор 220-330 Омconst byte digits[10] = { 0b00111111, // 0 — a b c d e f 0b00000110, // 1 — b c 0b01011011, // 2 — a b d e g 0b01001111, // 3 — a b c d g 0b01100110, // 4 — b c f g 0b01101101, // 5 — a c d f g 0b01111101, // 6 — a c d e f g 0b00000111, // 7 — a b c 0b01111111, // 8 — все семь 0b01101111 // 9 — a b c d f g}; void setup() { for (byte pin = 2; pin <= 8; pin++) { // a-g на D2-D8 pinMode(pin, OUTPUT); }} void loop() { for (byte n = 0; n <= 9; n++) { // цифра за цифрой for (byte bit = 0; bit < 7; bit++) { // бит 0 = сегмент a digitalWrite(2 + bit, bitRead(digits[n], bit)); } delay(1000); // секунда на цифру }}Вся хитрость — в одной строке внутри вложенного цикла. bitRead(digits[n], bit) вытаскивает бит из байта, digitalWrite(2 + bit, ...) сажает на свой пин HIGH или LOW: подключение зашито в арифметику, и перенос скетча на другие пины — это правка одной двойки. Для общего анода поменяйте полярность в той же строке — bitRead(digits[n], bit) ? LOW : HIGH — или проинвертируйте маску оператором ~, схема останется прежней. Откуда берутся байты вида 0b01101101, как хранить их в массиве и построить счётчик с кнопкой, разобрано в уроке про счётчик на паттернах — там паттерны 0-9 разложены по битам с пояснениями.
Общий анод или общий катод: две минуты с мультиметром
Тест занимает меньше времени, чем спор на форуме о том, что у вас в руках. Ставьте мультиметр в режим диодной пробы, один щуп — на общий вывод (пара общих ножек звонится между собой накоротко), второй перебирайте остальные. Засветился какой-нибудь сегмент — смотрите, где был красный щуп: на общем — это общий анод, на сегменте — общий катод. Прибор заодно покажет падение около 2 В — норма для красного светодиода, а не признак брака. Перепутанная полярность выдаёт себя мгновенно: скетч, писанный под катод, на анодном индикаторе рисует негатив — там, где ждали единицу, гаснет всё, кроме неё. Мой первый 5161BS был анодным, а все примеры в сети — катодные; я потратил вечер, прежде чем догадался перевернуть нули и единицы.
- Одна цифра напрямую: семь пинов на a-g (D2-D8), восьмой на точку, резистор 220-330 Ом на каждый сегмент
- Общий катод — на GND и зажигается HIGH; общий анод — на 5 В и зажигается LOW, в коде достаточно инверсии
- Четыре разряда напрямую — это 12 пинов и мультиплексирование: разряды переключаются по очереди, по 2-5 мс на разряд
- Не хотите считать байты — TM1637 берёт два сигнальных пина (CLK и DIO) и сканирует четыре разряда сам, яркость 0-7
- Восемь разрядов и матрицы — территория MAX7219: три пина SPI, яркость в регистре одним байтом 0-15