Как работает семисегментный индикатор и подключение к Arduino
Вы когда-нибудь замечали те напряжённые сцены в классических фильмах, где герой отчаянно пытается обезвредить бомбу, прежде чем она разрушит весь город? Когда герой с тревогой наблюдает за обратным отсчётом таймера, каждая проходящая секунда становится всё ценнее. Если внимательно присмотреться к этим сценам, вы заметите, что почти все киношные бомбы используют семисегментные индикаторы для своих таймеров обратного отсчёта. И это вполне логично — как ещё наши герои узнают, сколько времени у них осталось, чтобы спасти мир?
Та же технология, которая помогала нашим героям, встречается и в повседневных устройствах вокруг нас — от таймеров микроволновок и будильников до автомобильных приборных панелей и индикаторов этажей в лифтах. И не зря: они просты в использовании, недороги и легко читаются как при ярком, так и при тусклом освещении.
В этом руководстве мы научимся использовать семисегментный индикатор с Arduino. Итак, берите свой Arduino и семисегментный индикатор — и начнём!
Семисегментный индикатор
Хотя семисегментный индикатор выглядит как единое целое, на самом деле он состоит из семи отдельных светодиодов (LED), расположенных в форме цифры «8». Каждый из этих светодиодов называется сегментом. Часто есть и восьмой сегмент — десятичная точка (DP), позволяющая отображать десятичные числа.
Эти светодиоды работают вместе для создания цифр и некоторых букв, но важно понимать их внутренние соединения.
Каждый сегмент имеет две точки электрического подключения, как и любой стандартный светодиод. Однако только одна из этих точек подключения выведена наружу пластикового корпуса как отдельный вывод. Эти выводы обозначены буквами от «a» до «g». Другие точки подключения всех семи светодиодов не получают собственных отдельных выводов. Вместо этого они все соединены вместе внутри корпуса, образуя единый общий вывод (COM).
Вы можете управлять каждым сегментом индивидуально, переключая его вывод в состояние HIGH или LOW, точно так же, как с обычным светодиодом. Включая различные комбинации сегментов, вы можете отображать все цифры от 0 до 9. Проявив немного творчества, можно отображать и некоторые буквы алфавита!
Распиновка семисегментного индикатора
Давайте рассмотрим расположение сегментов, чтобы вы понимали, какой вывод управляет каким сегментом:
Выводы a, b, c, d, e, f, g и DP управляют по одному сегменту индикатора. Включая нужные сегменты, можно создать любую цифру.
Выводы COM (обычно выводы 3 и 8) соединены вместе внутри индикатора. В зависимости от типа индикатора, этот вывод нужно подключить либо к земле (если у вас индикатор с общим катодом), либо к питанию 5V (если с общим анодом). Этот общий вывод (COM) замыкает цепь для всех сегментов, позволяя им светиться при активации.
Общий катод (CC) и общий анод (CA)
Существует два основных типа семисегментных индикаторов: с общим катодом (CC) и с общим анодом (CA). Хотя снаружи они выглядят практически одинаково, внутри они работают по-разному из-за различий в подключении светодиодов.
Индикаторы с общим катодом (CC)
В индикаторе с общим катодом все отрицательные выводы (катоды) светодиодных сегментов соединены вместе. Чтобы такой индикатор работал, общий вывод (COM) подключается к земле (GND), а каждый сегмент управляется подачей положительного напряжения на соответствующий вывод.
Индикаторы с общим анодом (CA)
В индикаторе с общим анодом все положительные выводы (аноды) светодиодных сегментов соединены вместе. Чтобы такой индикатор работал, общий вывод (COM) подключается к положительному напряжению (VCC), а каждый сегмент управляется подачей земли (GND) или низкого напряжения на соответствующий вывод.
Какой тип более распространён?
Семисегментные индикаторы с общим анодом, как правило, более популярны. Это связано с тем, что схемы с поглощением тока (когда управляющая микросхема втягивает ток) имеют ряд преимуществ перед схемами с источником тока (когда микросхема выталкивает ток) во многих применениях.
Принцип работы семисегментного индикатора
Семисегментный индикатор работает путём подсвечивания определённых комбинаций сегментов для создания цифр и некоторых букв. Например:
Для отображения цифры «8» нужно включить все семь сегментов (A, B, C, D, E, F и G)
Для отображения цифры «1» нужно включить только два сегмента (B и C)
Для отображения буквы «A» нужно включить сегменты A, B, C, E, F и G
Включая и выключая определённые сегменты, можно создать любую цифру от 0 до 9 и даже некоторые буквы от A до F, как показано на диаграмме ниже.
Таблицы истинности ниже для семисегментных индикаторов точно показывают, какие сегменты нужно включить или выключить для отображения каждого символа. Следуя этим шаблонам, вы можете запрограммировать микроконтроллер для отображения любой цифры или буквы на семисегментном индикаторе.
Важно отметить, что индикаторы с общим анодом и общим катодом имеют противоположные электрические соединения, поэтому таблица истинности для индикатора с общим анодом является точной противоположностью таблицы истинности для индикатора с общим катодом.
Выбор токоограничивающего резистора
Как вы знаете, семисегментный индикатор на самом деле состоит из семи отдельных светодиодов, собранных вместе. Поскольку светодиоды могут выдержать только ограниченный ток, слишком большой ток может привести к их быстрому перегоранию. Для предотвращения этого каждому сегменту нужен свой токоограничивающий резистор.
Для типичного красного семисегментного индикатора каждый сегмент лучше всего работает при токе около 15 миллиампер (мА). Чтобы рассчитать правильное значение резистора для схемы на 5 вольт, мы используем формулу:
Подставляя значения:
Напряжение питания = 5 вольт
Падение напряжения на светодиоде = около 2 вольт
Желаемый ток = 15 мА (или 0,015 А)
Подставим эти числа в формулу:
Поскольку резисторы выпускаются в стандартных номиналах, мы округляем до 220 Ом.
Использование резистора 220 Ом сделает индикатор чуть менее ярким, чем максимальная яркость, что обычно хорошо. Семисегментные индикаторы, как правило, довольно яркие, и работа при чуть меньшей яркости делает их более удобными для чтения и продлевает срок службы.
Если вам нужна максимальная яркость (например, для использования на улице), можно использовать резистор 150 Ом, но это приблизит светодиоды к их пределам.
Если вы используете индикатор другого цвета и не уверены в требованиях к току, резистор 330 Ом — безопасная отправная точка. Он ограничит ток достаточно, чтобы защитить светодиоды, обеспечивая при этом разумную яркость.
Резисторы подключаются между вашей управляющей схемой (например, Arduino или другим микроконтроллером) и каждым выводом сегмента индикатора, образуя защитный барьер, позволяющий индикатору работать правильно без перегорания.
Подключение семисегментного индикатора к Arduino
Теперь, когда мы понимаем, как работает семисегментный индикатор, давайте научимся подключать его к Arduino! Здесь мы применяем наши знания на практике.
Начните с размещения семисегментного индикатора на макетной плате так, чтобы каждая сторона индикатора располагалась по разные стороны центрального разделителя. Расположите индикатор десятичной точкой вниз. Выводы пронумерованы в определённом порядке. В нижнем ряду выводы с 1 по 5 слева направо. В верхнем ряду выводы с 10 по 6, также слева направо.
В зависимости от типа индикатора потребуются разные подключения. Для индикатора с общим анодом подключите один из выводов COM к выводу 5V Arduino. Для индикатора с общим катодом подключите вывод COM к выводу GND Arduino.
Теперь подключите каждый вывод сегмента к цифровому выводу Arduino. Подключите четыре верхних вывода (b, a, f и g) к цифровым выводам 2–5 Arduino. Затем подключите четыре нижних вывода (e, d, c и DP) к цифровым выводам 6–9 Arduino.
Хотя индикатор может работать и без токоограничивающих резисторов, всегда используйте их для защиты индикатора от повреждения. Для этого проекта вам понадобятся восемь резисторов 220 Ом — по одному на каждый сегмент. Эти резисторы размещаются между цифровыми выводами Arduino и выводами сегментов индикатора.
Вот краткая таблица подключений:
| 7-Segment Display | Arduino | Notes | |
| a | 3 | via 220Ω | |
| b | 2 | via 220Ω | |
| c | 8 | via 220Ω | |
| d | 7 | via 220Ω | |
| e | 6 | via 220Ω | |
| f | 4 | via 220Ω | |
| g | 5 | via 220Ω | |
| DP | 9 | via 220Ω | |
| COM | 5V | only for common anode display | |
| COM | GND | only for common cathode display |
Обратитесь к рисунку ниже, чтобы увидеть все подключения.
Подключение семисегментного индикатора с общим анодом к Arduino UNO
Подключение семисегментного индикатора с общим катодом к Arduino UNO
Когда всё правильно подключено и защищено, вы готовы программировать Arduino для отображения цифр и букв на семисегментном индикаторе!
Библиотека SevSeg
При работе с семисегментными индикаторами не нужно писать весь код с нуля. Существуют библиотеки, которые могут выполнить большую часть работы за вас. Одна из самых популярных библиотек для управления семисегментными индикаторами называется SevSeg.
Эта библиотека берёт на себя все сложные части управления семисегментным индикатором. Вместо того чтобы помнить, какие сегменты включать для каждой цифры, библиотека позволяет просто указать, какое число вы хотите отобразить. Она сама определяет, какие сегменты нужно зажечь. Это делает ваш код намного проще и понятнее.
Для установки библиотеки:
Сначала откройте Arduino IDE. Затем нажмите на значок Менеджер библиотек на левой боковой панели.
Введите «sevseg» в поле поиска для фильтрации результатов.
Найдите библиотеку «SevSeg» от Dean Reading.
Нажмите кнопку Install, чтобы добавить её в Arduino IDE.
Пример кода Arduino
Теперь оживим наш семисегментный индикатор!
Тестовый скетч ниже заставит индикатор считать от 0 до 9. Попробуйте запустить его, а затем мы разберём детали вместе.
#include "SevSeg.h"
SevSeg sevseg;
void setup() {
//Set to 1 for single digit display
byte numDigits = 1;
//defines common pins while using multi-digit display. Left empty as we have a single digit display
byte digitPins[] = {};
//Defines arduino pin connections in order: A, B, C, D, E, F, G, DP
byte segmentPins[] = { 3, 2, 8, 7, 6, 4, 5, 9 };
bool resistorsOnSegments = true;
// Display type
// Uncomment appropriate line
byte hardwareConfig = COMMON_ANODE;
//byte hardwareConfig = COMMON_CATHODE;
//Initialize sevseg object
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
}
void loop() {
//Display numbers one by one with 2 seconds delay
for (int i = 0; i < 10; i++) {
sevseg.setNumber(i);
sevseg.refreshDisplay();
delay(1000);
}
}
Объяснение кода:
В начале скетча мы подключаем библиотеку SevSeg и создаём объект SevSeg, который будем использовать на протяжении всей программы. Этот объект будет обрабатывать все сложные части управления индикатором.
// Include library
#include "SevSeg.h"
// Create object
SevSeg sevseg;
Далее мы указываем программе, сколько разрядов у нашего индикатора. Поскольку мы используем одноразрядный индикатор, устанавливаем значение 1. Если бы вы использовали четырёхразрядный индикатор, установили бы 4.
// Number of digits in display
byte numDigits = 1;
Массив digitPins используется для указания номеров выводов Arduino, подключённых к общим выводам каждого разряда многоразрядного индикатора. Однако, поскольку мы используем одноразрядный индикатор, нам не нужно определять выводы разрядов, поэтому мы просто оставляем массив пустым.
// Specifies the 'common pins' while using multi-digit display.
// If you have a single digit display, leave it blank.
byte digitPins[] = {};
Затем мы определяем, какие выводы Arduino подключены к каким сегментам индикатора. Помните сегменты A, B, C, D, E, F, G и DP, о которых мы говорили ранее? Здесь мы указываем Arduino, какой вывод управляет каждым сегментом.
// Display segment pins A,B,C,D,E,F,G,DP
byte segmentPins[] = {3, 2, 8, 7, 6, 4, 5, 9};
Мы также используем логическую переменную resistorsOnSegments, чтобы сообщить программе, используем ли мы токоограничивающие резисторы в схеме (что мы и должны делать!).
// Dropping resistors used
bool resistorsOnSegments = true;
Далее нужно указать тип семисегментного индикатора — с общим анодом или общим катодом. Это важно, потому что влияет на то, как Arduino будет управлять индикатором. Переменная hardwareConfig используется для хранения этой информации. Она может иметь одно из двух допустимых значений: COMMON_ANODE и COMMON_CATHODE.
// Display type
byte hardwareConfig = COMMON_ANODE;
В функции setup() мы инициализируем индикатор со всеми определёнными ранее настройками. Мы также устанавливаем яркость индикатора на комфортный уровень (90 по шкале от 0 до 150).
void setup() {
// Start display object
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
// Set brightness
sevseg.setBrightness(90);
}
Основной цикл программы использует цикл for для счёта от 0 до 9. Для каждой цифры:
Мы указываем индикатору, какое число отобразить, с помощью функции
setNumber()Мы обновляем индикатор с помощью функции
refreshDisplay(), чтобы число появилосьМы ждём секунду перед показом следующего числа
Это создаёт простой счётный индикатор, который циклически проходит все десять цифр с паузой в секунду на каждой.
for (int i = 0; i < 10; i++) {
sevseg.setNumber(i);
sevseg.refreshDisplay();
delay(1000);
}
Поняв, как работает эта базовая программа, вы можете начать вносить изменения для создания собственных пользовательских дисплеев и паттернов!
Проект Arduino — Электронный бросок кубика
Давайте создадим забавный электронный бросок кубика с помощью нашего семисегментного индикатора! Этот проект будет автоматически генерировать случайные числа от 1 до 6 при нажатии кнопки — идеально подходит для настольных игр типа «Монополия» или «Лудо», где нужно бросать кости.
Вот что мы создадим.
Схема подключения
Мы будем использовать ту же конфигурацию Arduino, что и в предыдущем примере, но с одним важным дополнением — тактильной кнопкой, которая будет нашей кнопкой «бросить». Мы подключим кнопку к цифровому выводу 10 Arduino. Кнопка позволяет нам генерировать новое случайное число каждый раз, когда мы хотим «бросить» кубик.
Код Arduino
#include "SevSeg.h"
SevSeg sevseg;
const int buttonPin = 10; // the number of the pushbutton pin
// variables will change:
int buttonState = 0; // variable for reading the pushbutton status
void setup() {
byte numDigits = 1;
byte digitPins[] = {};
byte segmentPins[] = { 3, 2, 8, 7, 6, 4, 5, 9 };
bool resistorsOnSegments = true;
sevseg.begin(COMMON_ANODE, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
}
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
sevseg.setNumber(random(1, 7));
sevseg.refreshDisplay();
}
}
Объяснение кода:
Этот скетч похож на предыдущий — мы настраиваем семисегментный индикатор так же, с теми же подключениями и конфигурацией. Однако есть несколько ключевых отличий.
Сначала мы объявляем вывод Arduino, к которому подключена кнопка. Мы также определяем новую переменную buttonState для отслеживания состояния кнопки.
// the number of the pushbutton pin
const int buttonPin = 10;
// variable for reading the pushbutton status
int buttonState = 0;
Далее в функции setup() мы настраиваем buttonPin как вход, чтобы Arduino мог определять нажатие кнопки.
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
В основном цикле программы Arduino непрерывно проверяет состояние кнопки. Когда он обнаруживает нажатие (когда buttonState читает HIGH), программа генерирует случайное число от 1 до 6 с помощью встроенной функции random(min, max).
Важно отметить, что эта функция включает минимальное значение, но исключает максимальное. Это означает, что вызов random(1,7) даст нам числа от 1 до 6, что идеально подходит для имитации шестигранного кубика.
Как только случайное число сгенерировано, оно немедленно отображается на семисегментном индикаторе. При следующем нажатии кнопки появляется новое случайное число!
void loop() {
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
if (buttonState == HIGH) {
sevseg.setNumber(random(1,7));
sevseg.refreshDisplay();
}
}
Этот простой, но увлекательный проект показывает, как можно комбинировать семисегментный индикатор с пользовательским вводом для создания интерактивных проектов. Вы можете развить эту идею для создания электронных настольных игр, генераторов случайных чисел или даже магического шара для принятия решений!