Симулятор семисегментного индикатора: цифра из seg7 в браузере
Цифра на индикаторе не собирается с первого раза: семь резисторов, семь проводов, перепутанный сегмент — и на плате светится иероглиф вместо четвёрки. Гайд про подключение и распиновку разбирает электрику по шагам — здесь же индикатор переезжает в браузер: HIGH зажигает сегмент, LOW гасит, и любая цифра собирается за минуту без пайки.
Деталь «Семисегментный индикатор» ставится на стенд симулятора на семь цифровых пинов: провода светло-серые с меткой SEG7, у каждой колодки — метка своего сегмента от a до g. Ниже — цифры из байтов, инверсия для общего анода, TM1637 на двух проводах и честная граница логики и физики.
Что видно на стенде
Индикатор в каталоге — деталь «Семисегментный индикатор»: семь сигнальных выводов под сегменты a-g на цифровых пинах, провода светло-серые, у каждой колодки — метка своего сегмента. Никакого контроллера внутри: HIGH на пине зажигает сегмент, LOW гасит — ровно то, что делает digitalWrite на настоящей схеме с общим катодом. Порядок пинов всегда виден на метках проводов: на чистом стенде деталь встанет семью пинами по порядку каталога — от D12 до D6.
- Цифра из сегментов: семь битов — семь сегментов, зажигаются тем же digitalWrite, что и обычный светодиод.
- Метки a-g на проводах: перепутанный пин виден по картинке — сегмент встанет не на своё место.
- Проба «все сегменты»: байт 0b01111111 собирает восьмёрку — если светятся все семь, порядок пинов верный.
- Любые буквы: A, C, E, F, H — таблица не обязана кончаться на девятке; модель отрисует всё, что ведёт скетч.
- Двоеточие — не сюда: у голого индикатора его нет; четыре разряда и двоеточие живут в TM1637, о нём ниже.
Цифра из байта: таблица сегментов
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}; // порядок каталога стенда: сегменты a..g — по пинам 12, 11, 10, 9, 8, 7, 6const int segPins[7] = {12, 11, 10, 9, 8, 7, 6}; void showDigit(int n) { for (int i = 0; i < 7; i++) { digitalWrite(segPins[i], bitRead(DIGITS[n], i) ? HIGH : LOW); }} void setup() { for (int i = 0; i < 7; i++) pinMode(segPins[i], OUTPUT); Serial.begin(9600);} void loop() { for (int n = 0; n <= 9; n++) { showDigit(n); Serial.println(n); delay(600); }}Бит 0 байта — сегмент a, бит 6 — g; массив segPins в скетче повторяет порядок, который виден на метках проводов. Пробег 0-9 за полминуты проверяет всю таблицу: каждый знак собирается из сегментов, как в настоящей схеме. Полную распиновку с резисторами 220-330 Ом на сегмент разбирает урок про подключение семисегментного индикатора; когда семи пинов перестанет хватать, байты уезжают в сдвиговый регистр — урок про цифры байтами через 74HC595.
Общий катод против общего анода
void showDigitAnod(int n) { for (int i = 0; i < 7; i++) { // общий анод: зажигание — LOW, гашение — HIGH digitalWrite(segPins[i], bitRead(DIGITS[n], i) ? LOW : HIGH); }}Модель стенда зажигает сегмент от HIGH — это логика общего катода, и для общего анода инвертируется код, а не схема: тот же ход, что и на живой плате, где анод питает сегменты от плюса. Поменяли уровни — цифры собрались; забыли — светятся «дыры» от цифр. На железо добавьте резистор на каждый сегмент: в браузере ток не течёт, а на плате без резисторов сегменты выходят из строя.
Соберите цепь по условной схеме: светодиод, резистор, кнопка, земля.
Подгружаем интерактив…
Лаборатория выше тренирует глаз на схемах: светодиод, резистор, кнопка, земля. Навык прямой: на схеме семисегментника те же резисторы по сегментам и общий провод, который новички забывают найти до подачи питания. Потренировались — чтение схемы индикатора занимает минуты, а не вечер.
TM1637: те же цифры, два провода
#include <TM1637Display.h> TM1637Display ekran(4, 5); // CLK на D4, DIO на D5 void setup() { ekran.setBrightness(5); // 0..7 ekran.showNumberDec(1234); // крупными цифрами} void loop() { int sek = millis() / 1000; ekran.showNumberDecEx(sek, 0x40, true); // 0x40 — двоеточие в центре delay(200);}Дисплей TM1637 — вторая деталь того же жанра в каталоге: создайте в скетче TM1637Display с пинами CLK и DIO, и дисплей встанет на стенд с четырьмя разрядами. Внутри те же сегментные маски, что и в таблице выше: движок рисует сырые байты, 0x40 в showNumberDecEx зажигает двоеточие, setBrightness(0-7) правит яркость — числом в модели, а не вольтами. Полную обкатку библиотеки ведёт урок про яркость и цифры TM1637.
Честная граница: логика против физики
| Проверка | Симулятор | Только железо |
|---|---|---|
| Сегменты a-g от digitalWrite() | да: HIGH горит, LOW гасит | то же |
| Таблица цифр 0-9 и свои знаки | да: собирается из байтов | то же |
| Общий анод через инверсию кода | да: как на плате | то же |
| Тусклые сегменты и вытекающий ток | нет: модель горит или нет | да: ток делится между зажжёнными |
| Яркость от резисторов и ШИМ | нет: в модели яркость одна | да: резистор задаёт ток сегмента |
| Пин точки (dp) | нет: у детали семь выводов a-g | да — восьмой вывод на модуле |
Грабли семисегментника
- Перепутанный порядок пинов: вместо «4» — иероглиф; сверяйте метки a-g на проводах стенда с массивом segPins в скетче.
- Инверсия дважды: общий анод переворачивает уровни, а лишняя инверсия в цикле возвращает всё как было; в симе видно сразу — горят «дыры» цифр.
- Резисторы «потом»: в браузере ток не течёт, и соблазн оставить сегменты без резисторов велик; на плате это приговор сегментам.
- Ожидание яркости из ШИМ: в модели сегмент горит или нет, диммировать нечем; на железе яркость правят резистором или ШИМ — урок про ШИМ-яркость.
- Путаница seg7 с TM1637: у первого семь пинов и вся логика в вашем коде, у второго — CLK/DIO и библиотека; сценарий выбора разобран в вопросах ниже.