Первый семисегментный индикатор я воткнул по привычке из урока про светодиод: один резистор 220 Ом на общий вывод, семь проводов на сегменты — и удивился, что схема работает криво. Цифра «1» сияла во всю яркость, «8» была заметно тусклее, «0» где-то посередине. Резистор был один на все сегменты, и ток делился между всеми горящими светодиодами: чем больше сегментов светится, тем меньше достаётся каждому. Лечится это честной схемой — свой резистор на каждый сегмент, — но пока я этого не понял, вечер ушёл на подозрения в скетче, который был ни при чём.
В этом уроке разберём индикатор как деталь: что за сегменты a-g и точка dp, почему у корпуса десять выводов, чем общий катод отличается от общего анода и почему второй требует инверсии в скетче. Соберём схему с семью резисторами и зажжём цифры «0» и «1» голым digitalWrite — без библиотек, без массивов, руками. Скучная на вид механика, без которой не взлетит ни счётчик из следующего урока, ни таймер из третьего: обе программы рисуют цифры ровно этим способом, только упакованным в таблицу чисел.
Семь светодиодов в одном корпусе
Семисегментный индикатор — это семь светодиодов, уложенных в одну восьмёрку. У каждого сегмента есть имя-буква: a — верхняя перекладина, b и c — правая пара сверху вниз, d — нижняя, e и f — левая, g — средняя черта. Рядом живёт восьмой светодиод — точка dp, она же десятичная точка. Цифры рисуются комбинациями: восьмёрка — все семь сегментов сразу, единица — только правая пара b и c, ноль — всё, кроме средней черты g. Именно поэтому ноль из моего первого абзаца светился ровнее единицы: шесть светодиодов делили один резистор вместо двух.
Комбинации стоит один раз проговорить руками, потому что дальше они станут массивом. Двойка — верхняя, правая верхняя, средняя, левая нижняя и нижняя: a, b, g, e, d. Семёрка — a, b и c, самый экономный символ после единицы. Разница между пятёркой и шестёркой — ровно один сегмент e: забытая левая нижняя палочка превращает честную шестёрку в пятёрку, и именно такие мелочи заставляют сверяться с таблицей, а не рисовать по памяти.
У одноразрядного корпуса обычно десять выводов: семь сегментов, точка и два общих, которые соединены внутри друг с другом. Распиновка у корпусов отличается, и слепая вера в первую попавшуюся картинку из поиска приводит к перепутанным проводам — я сверяюсь с даташитом на конкретную модель или просто прозваниваю корпус мультиметром в режиме прозвонки: общий вывод звенит с любым сегментом, сегмент с сегментом — не звенят никогда. Пять минут с щупами экономят час перекладывания проводов.
| Вывод индикатора | Куда подключается | Что важно помнить |
|---|---|---|
| Сегменты a-g | цифровой пин Uno через свой резистор 220-330 Ом | семь пинов и семь резисторов — по одному на сегмент |
| Точка dp | пин через собственный резистор | управляется отдельно; в уроках кластера не используется |
| Общий вывод, катод (CC) | GND | сегмент горит от HIGH на пине — как обычный светодиод |
| Общий вывод, анод (CA) | 5 В | сегмент горит от LOW на пине — логика перевёрнута |
Общий катод или общий анод: два порядка на один корпус
Индикаторы бывают двух пород, и различие в самом слове «общий». У общего катода все катоды светодиодов соединены и выведены на общий контакт, который идёт на GND; сегмент зажигается HIGH на своём пине через резистор — ровно как обычный светодиод из первого урока. У общего анода наоборот: объединены аноды, общий контакт питается от 5 В, и сегмент загорается, когда пин притягивает его к земле — LOW. Электрически это одна и та же деталь, включённая с двух сторон питания.
Различить породы на глаз невозможно, а маркировка врёт редко. В распространённой серии 5161 одна буква в конце говорит всё: 5161AS — общий катод, 5161BS — общий анод. Если маркировки нет, включите диодный тест мультиметра: щуп на общий вывод и на любой сегмент, а потом поменяйте щупы местами — в одной из полярностей сегмент слабо засветится, и щуп, стоявший на плюсе, укажет на общий анод. Проверка занимает минуту и спасает от вечера с перевёрнутой логикой.
Про инверсию честно: пин Uno одинаково уверенно и отдаёт ток, и втягивает его в землю, так что общий анод — не «худший» вариант, а просто зеркальный. Тот же потолок в 20 мА комфортного тока, те же резисторы в тех же местах схемы. Единственное место, где порода всплывает, — скетч: у катодного HIGH значит «горит», у анодного LOW. Мой порядок действий при незнакомом корпусе: сначала определить породу щупами, потом писать хоть одну строчку кода — переучиваться на ходу дороже.
const int SEG_A = 2; // a - верхняя перекладинаconst int SEG_B = 3; // b - правая верхняяconst int SEG_C = 4; // c - правая нижняяconst int SEG_D = 5; // d - нижняяconst int SEG_E = 6; // e - левая нижняяconst int SEG_F = 7; // f - левая верхняяconst int SEG_G = 8; // g - средняя void setup() { pinMode(SEG_A, OUTPUT); pinMode(SEG_B, OUTPUT); pinMode(SEG_C, OUTPUT); pinMode(SEG_D, OUTPUT); pinMode(SEG_E, OUTPUT); pinMode(SEG_F, OUTPUT); pinMode(SEG_G, OUTPUT); Serial.begin(9600); Serial.println("Seg7: 0 i 1 rukami");} void loop() { // цифра 0: горят a b c d e f, спит g digitalWrite(SEG_A, HIGH); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, HIGH); digitalWrite(SEG_E, HIGH); digitalWrite(SEG_F, HIGH); digitalWrite(SEG_G, LOW); Serial.println("cifra 0"); delay(2000); // цифра 1: горят только b и c digitalWrite(SEG_A, LOW); digitalWrite(SEG_B, HIGH); digitalWrite(SEG_C, HIGH); digitalWrite(SEG_D, LOW); digitalWrite(SEG_E, LOW); digitalWrite(SEG_F, LOW); digitalWrite(SEG_G, LOW); Serial.println("cifra 1"); delay(2000);}Имена констант SEG_A и дальше — не украшение: строка digitalWrite(SEG_G, LOW) читается мгновенно, а digitalWrite(8, LOW) через неделю придётся сверять с комментарием. Магические числа в пинах — первый источник перепутанных сегментов; константы с буквами сегментов вышибают эту почву. Печать в Serial здесь тоже работает: строки cifra 0 и cifra 1 в мониторе — ритм, по которому видно, что цикл крутится, даже если индикатор ещё не подключён.
На одну цифру ушло семь вызовов digitalWrite, на две — четырнадцать. Десять цифр руками — это семьдесят строк, в которых легко забыть один сегмент и полчаса искать, почему шестёрка выглядит как пятёрка. В уроке про массивы и паттерны уже мелькала идея прятать повторяющиеся цепочки в таблицу чисел — следующий урок этого кластера доведёт её до конца: вся таблица цифр уместится в массив из десяти байт, а смена цифры станет одним вызовом функции.
Точку dp в скетче я сознательно не трогаю: семь сегментов закрывают все цифры, а восьмой провод и восьмой резистор на этом этапе только путают. Когда дойдёте до часов с дробной секундой или индикатора с двумя знаками после запятой, точка подключается по той же схеме — свой резистор, свой пин, тот же digitalWrite. Важно только не забыть её при подсчёте бюджета пинов: с точкой деталь занимает восемь выводов, а не семь.
Пины, ток и разница между схемой и симулятором
Прямое управление стоит семь цифровых пинов из четырнадцати — половину бюджета Uno, и это честная плата за отсутствие обвязки. Тот же счёт я разбирал на бегущей строке из восьми светодиодов: как только независимых светодиодов становится больше восьми, пины кончаются, и начинается мультиплексирование или сдвиговые регистры. Одноразрядный индикатор влезает напрямую, и для первых проектов это лучший вариант — видно каждый провод, а отладка сводится к поглядыванию на экран.
Ток посчитайте по закону Ома из урока про расчёт тока: на красном сегменте падает около 2 В, значит при 220 Ом через него течёт (5-2)/220 — примерно 14 мА, при 330 Ом — около 9 мА. Комфортный ток пина — до 20 мА, так что оба номинала безопасны; даже все семь сегментов разом возьмут порядка 95 мА, что вписывается в суммарный потолок чипа около 200 мА. Если на плате уже живут яркие светодиоды и зуммер, пересчитайте весь бюджет по уроку про бюджет тока — семь резисторов легко съедают половину копилки, а индикатор горит в ней дольше всех. А вот один резистор на общий вывод держать в схеме не стоит ни при какой экономии: яркость плывёт от цифры к цифре, а ток через общий резистор растёт с числом горящих сегментов.
Про симулятор честно: его макетка подключает индикатор к первым семи свободным цифровым пинам — D12, D11, D10, D9, D8, D7, D6, и именно они получают роли a-g по порядку. Поэтому sim-скетч ниже держит эти номера, а скетч для реальной платы выше — пины 2-8 подряд: провода ложатся линией и не путаются. На живой плате годятся любые семь цифровых выводов, главное — держать порядок a-g одинаковым в схеме и в скетче, иначе цифры превратятся в абстрактную живопись.
Зажигайте сегменты по одному биту и собирайте цифры 0–9.
Подгружаем интерактив…
- Семисегментный индикатор — семь светодиодов a-g плюс точка dp; у одноразрядного корпуса около 10 выводов, два из них общие
- Резистор 220-330 Ом ставится на КАЖДЫЙ сегмент: один общий резистор делит ток между светодиодами, и яркость плавает от цифры к цифре
- Общий катод: общий вывод на GND, сегмент горит от HIGH; общий анод: общий вывод на 5 В, сегмент горит от LOW — инверсия, типовая грабля
- Ток сегмента: (5-2)/220 около 14 мА, (5-2)/330 около 9 мА; все семь сегментов — порядка 95 мА, в бюджете Uno
- Прямое управление стоит 7 цифровых пинов; в симуляторе индикатор садится на D12-D6 (a-g по порядку), на плате удобны пины 2-8
- 1. Сколько цифровых пинов занимает одноразрядный индикатор при прямом управлении без точки dp?
- 2. У индикатора с общим анодом чем зажигают сегмент?
- 3. Почему на общий вывод нельзя ставить единственный резистор на все сегменты?
- 4. Сегмент красного свечения, питание 5 В, резистор 220 Ом. Ток через сегмент?
- 5. Как в симуляторе выяснить, на каком пине сидит сегмент g?
Частые вопросы по теме урока
- Сколько цифровых пинов занимает одноразрядный индикатор при прямом управлении без точки dp?
- Каждому сегменту нужен свой пин с резистором: семь сегментов — семь пинов. Корпус физически имеет десять выводов, но два общих идут на питание, а не на пины. 7 — по одному на сегмент a-g
- У индикатора с общим анодом чем зажигают сегмент?
- У общего анода объединены плюсы, общий контакт сидит на 5 В, и сегмент загорается, когда пин притягивает его к земле — LOW. Логика зеркальна катодной. LOW на пине сегмента
- Почему на общий вывод нельзя ставить единственный резистор на все сегменты?
- Сегменты — параллельные светодиоды с одним гасящим резистором: чем больше горит, тем меньше ток у каждого. Отсюда яркая «1» и тусклая «8». Правильно — резистор на каждый сегмент. ток разделится между горящими сегментами, и яркость будет зависеть от цифры
- Сегмент красного свечения, питание 5 В, резистор 220 Ом. Ток через сегмент?
- На красном сегменте падает около 2 В: (5-2)/220 = 13,6 мА, примерно 14. С 330 Ом ток упадёт до 9 мА — тоже рабочий вариант. около 14 мА
- Как в симуляторе выяснить, на каком пине сидит сегмент g?
- Макетка симулятора берёт первые семь свободных цифровых пинов по порядку a-g: D12, D11, D10, D9, D8, D7, D6. Седьмой по счёту — средняя черта g — на D6. индикатор занимает первые 7 свободных цифровых пинов в порядке a-g: D12-D6, значит g на D6