Семисегментный индикатор и Arduino: схема подключения, общий катод и скетч
Семисегментный индикатор — это семь светодиодов, расставленных в форме восьмёрки, плюс восьмой для десятичной точки. Зажигая их в разных сочетаниях, получают любую цифру: для единицы нужны два сегмента, для восьмёрки все семь.
Сегменты обозначают буквами от A до G, начиная с верхнего и дальше по часовой стрелке; G — перекладина посередине. Это стандарт, одинаковый у всех производителей, поэтому таблица цифр из любого учебника подойдёт и вашему индикатору.
Схема подключения
Распиновка
| Провод | Куда и зачем |
|---|---|
| A–G | Семь сегментов цифры. Любые цифровые выводы платы, через резисторы. |
| DP | Десятичная точка. Подключается так же, как сегмент, если нужна. |
| COM (два вывода) | Общий катод или общий анод. Их два, они соединены внутри — можно использовать любой. |
Характеристики
- Количество сегментов
- 7 плюс точка
- Прямое напряжение сегмента
- около 2 В для красного
- Ток сегмента
- 10–20 мА
- Резистор
- 220–330 Ом на каждый сегмент
- Занимает выводов
- 8 на один разряд
Как определить общий катод или анод
У индикатора с общим катодом все минусы светодиодов соединены вместе: общий вывод идёт на землю, а сегмент зажигается высоким уровнем. У общего анода наоборот — общий на питание, сегмент зажигается низким уровнем.
Внешне они неразличимы, а перепутанный тип даёт один и тот же результат: индикатор не светится. Проверить можно мультиметром в режиме прозвонки диодов — коснитесь общего вывода красным щупом, а любого сегмента чёрным. Вспыхнул — значит общий анод. Не вспыхнул — поменяйте щупы местами; если вспыхнул теперь, это общий катод.
В скетче тип учитывается одной строкой: для общего анода все значения инвертируются.
Библиотека
не нужна— Достаточно digitalWrite и таблицы сегментов. Библиотека SevSeg пригодится для многоразрядных индикаторов, где разряды приходится зажигать по очереди.
Готовый скетч
// выводы в порядке сегментов A, B, C, D, E, F, G
const int SEGMENTS[7] = {2, 3, 4, 5, 6, 7, 8};
// какие сегменты горят для каждой цифры
// порядок в строке: A B C D E F G
const byte DIGITS[10][7] = {
{1,1,1,1,1,1,0}, // 0
{0,1,1,0,0,0,0}, // 1
{1,1,0,1,1,0,1}, // 2
{1,1,1,1,0,0,1}, // 3
{0,1,1,0,0,1,1}, // 4
{1,0,1,1,0,1,1}, // 5
{1,0,1,1,1,1,1}, // 6
{1,1,1,0,0,0,0}, // 7
{1,1,1,1,1,1,1}, // 8
{1,1,1,1,0,1,1} // 9
};
// для индикатора с общим анодом поставьте true
const bool COMMON_ANODE = false;
void showDigit(int digit) {
for (int i = 0; i < 7; i++) {
bool on = DIGITS[digit][i];
digitalWrite(SEGMENTS[i], COMMON_ANODE ? !on : on);
}
}
void setup() {
for (int i = 0; i < 7; i++) {
pinMode(SEGMENTS[i], OUTPUT);
}
}
void loop() {
for (int digit = 0; digit <= 9; digit++) {
showDigit(digit);
delay(700);
}
}Скетч собирается arduino-cli под Arduino UNO
Таблица DIGITS — это и есть весь секрет индикатора: каждая строка описывает, какие из семи палочек зажечь. Её удобно один раз выписать и переиспользовать во всех проектах.
Частые ошибки
Индикатор не светится совсем
Перепутан тип: общий катод посажен на питание вместо земли или наоборот. Проверьте прозвонкой и поменяйте COMMON_ANODE в скетче.
Цифры горят с разной яркостью
Поставлен один резистор на общий вывод вместо резистора на каждый сегмент. Ток делится между зажжёнными сегментами, поэтому единица светит ярче восьмёрки.
Часть сегментов не горит
Либо оборван провод, либо сегмент подключён к выводу, который в скетче не объявлен выходом. Проверьте по порядку A–G: путаница в порядке — самая частая причина.
Индикатор работает без резисторов
Он и правда будет светиться, но выводы платы работают на пределе, а светодиоды деградируют. Резистор на 220 Ом стоит копейки и решает вопрос.
Четырёхразрядный индикатор показывает одну цифру на всех разрядах
У многоразрядных индикаторов сегменты общие, а разряды зажигаются по очереди с высокой частотой. Без такой динамической индикации все разряды показывают одно и то же.
Что понадобится
- Семисегментный индикатор с общим катодом
- Семь резисторов 220 Ом
- Arduino UNO
- Макетная плата и провода