Семисегментные индикаторы - простые и удобные устройства для отображения информации в виде цифр. В этой статье мы подробно разберем особенности их применения в проектах на популярной платформе Arduino.
Типы семисегментных индикаторов
Существует два основных типа семисегментных индикаторов:
- С общим катодом
- С общим анодом
Разница между ними в том, как соединены внутри прибора светодиодные сегменты, формирующие цифры и буквы. У индикатора с общим катодом отрицательные выводы сегментов объединены вместе и подключены к паре контактов корпуса. А у индикатора с общим анодом - наоборот, положительные выводы сегментов соединены и выведены наружу.
При выборе типа индикатора для проекта на Arduino следует учитывать полярность используемых цифровых выходов. Для ATmega328 микроконтроллера на борту Arduino Uno полярность выходов - положительная. Поэтому предпочтительнее использовать индикатор с общим катодом.
Распиновка и маркировка выводов
Семисегментный индикатор содержит 8 светодиодов, сформированных определенным образом:
- 7 сегментов (полосок), образующих символы
- 1 сегмент - точка
Сегменты промаркированы латинскими буквами от a до g. Точка обозначается буквой dp (decimal point). Их расположение показано на рисунке:
Для отображения конкретной цифры включаются различные комбинации сегментов согласно таблице:
Цифра | Включенные сегменты |
0 | a b c d e f |
1 | b c |
2 | a b г d e |
3 | a b г d c |
Остальные цифры получаются аналогичным образом.
Схема подключения к Arduino
Давайте разберем последовательность подключения одноразрядного индикатора с общим катодом к Arduino Uno.
- Подготовьте компоненты:
- 1 шт. семисегментный индикатор; 1 шт. Arduino Uno; 8 шт. резисторов 220 Ом; Соединительные провода;
- Соедините общий катод индикатора с контактом GND на Arduino.
- Последовательно через резисторы 220 Ом соедините оставшиеся выводы индикатора с цифровыми контактами 2-8 на Arduino.
Теперь индикатор готов к управлению от Arduino! Далее перейдем к программированию.
На примере нескольких скетчей для Arduino IDE покажем основные приемы работы с семисегментным индикатором.
Отображение статической цифры
В этом простейшем примере мы установим на индикатор цифру 5 и оставим ее гореть.
// Подключено к выводам 2-8 int a = 2; int b = 3; int c = 4; int d = 5; int e = 6; int f = 7; int g = 8; void setup() { // Устанавливаем выводы на запись pinMode(a, OUTPUT); pinMode(b, OUTPUT); pinMode(c, OUTPUT); pinMode(d, OUTPUT); pinMode(e, OUTPUT); pinMode(f, OUTPUT); pinMode(g, OUTPUT); // Выводим цифру 5 digitalWrite(a, HIGH); digitalWrite(b, LOW); digitalWrite(c, HIGH); digitalWrite(d, HIGH); digitalWrite(e, LOW); digitalWrite(f, HIGH); digitalWrite(g, HIGH); } void loop() { // Ничего не делаем }
В функции setup мы сначала инициализировали выводы режим записи OUTPUT. Затем включили и выключили нужные сегменты согласно таблице для цифры 5. В цикле loop никаких действий не происходит, состояние сегментов остается неизменным.
Вывод счетчика на индикатор
Реализуем простой счетчик, значение которого будет отображаться на индикаторе. Для перехода между цифрами воспользуемся функцией delay().
int num = 0; // Счетчик void loop() { // Выводим текущее значение счетчика outputNumber(num); // Инкрементируем счетчик num++; // Если превысили 9, обнуляем if(num > 9) { num = 0; } // Пауза перед следующим шагом delay(1000); } // Функция вывода числа на индикатор void outputNumber(int digit) { // Код включения сегментов switch(digit) { case 0: activateSegments(a, b, c, d, e, f); break; case 1: activateSegments(b, c); break; } // остальные цифры аналогично } void activateSegments(int seg1, int seg2, ...) { digitalWrite(seg1, HIGH); digitalWrite(seg2, HIGH); // остальные сегменты }
Здесь мы реализовали вывод любой цифры на индикатор через функцию outputNumber(). В ней для каждого значения активируются нужные сегменты. Функция activateSegments() используется для упрощения записи.
Отображение физических величин
Считывая данные с различных датчиков, можно вывести измеренные значения на индикатор. Например, температуру:
// Подключен датчик температуры int tempSensor = A1; void loop() { // Считываем температуру int tempC = readTemp(tempSensor); // Преобразуем в целое 0-99 int displayNum = map(tempC, 0, 100, 0, 99); // Выводим на индикатор outputNumber(displayNum); delay(250); }
Аналогично можно реализовать измерение влажности, освещенности, расстояния при помощи ультразвукового дальномера и т.д.
Управление яркостью индикатора
Четырехразрядный семисегментный индикатор обладает встроенными резисторами для регулировки яркости свечения. Это позволяет использовать его в устройствах, где нужно экономить энергию или избегать чрезмерной яркости в темноте.
Путем подачи аналогового напряжения на вывод яркости Bright можно плавно регулировать яркость всех сегментов одновременно.
Отображение температуры с регулировкой яркости
Рассмотрим пример скетча для Arduino с четырехразрядным семисегментным индикатором, где реализовано:
- Считывание температуры с датчика
- Вывод измеренного значения на индикатор
- Автоматическая регулировка яркости в зависимости от освещенности
int tempSensor = A1; int ldrSensor = A2; // Датчик освещенности void loop() { float tempC = readTemp(tempSensor); float light = readLight(ldrSensor); // уровень освещенности setBrightness(light); // Устанавливаем яркость outputNumber(tempC); // Выводим delay(250); } // Установка яркости по уровню освещенности void setBrightness(float lightLevel) { int brightVal; if(lightLevel < 300) { // темнота brightVal = 255; } else if(lightLevel < 600) { // сумерки brightVal = 128; } else { brightVal = 32; } analogWrite(brightPin, brightVal); }
Такой подход позволяет сделать индикацию более комфортной в разных условиях освещенности.
Использование многоцветных индикаторов
Помимо стандартных красных семисегментных индикаторов, существуют модели с RGB-подсветкой. Это позволяет выводить информацию различными цветами.
Управление осуществляется аналогично, только для каждого сегмента предусмотрено 3 вывода - красный, зеленый, синий. Комбинируя яркость каждого из них, можно получить нужный оттенок.
int r1 = 3; int g1 = 5; int b1 = 6; // Устанавливаем красный цвет setColor(255, 0, 0); // Функция выбора цвета void setColor(int red, int green, int blue) { analogWrite(r1, red); analogWrite(g1, green); analogWrite(b1, blue); }
С помощью таких индикаторов можно не только выводить разноцветные цифры и тексты. Их можно использовать для индикации различных режимов работы устройства, отображения уровней сигналов, цветовой маркировки данных.
Повышение разрядности индикации
Одноразрядный индикатор позволяет отображать числа от 0 до 9. Для расширения диапазона можно объединить несколько индикаторов.
Например, соединив два четырехразрядных индикатора, можно реализовать отображение восьмизначных чисел. При этом потребуется всего 3 вывода Arduino на управление:
- DATA - передача данных
- CLK - синхронизация
- RCK - захват данных
Такое решение гораздо компактнее использования восьми отдельных одноразрядных индикаторов.
Дополнительные элементы управления
Для расширения функциональности устройства с индикатором можно добавить кнопки, переключатели, энкодеры. Они позволят:
- Навигация по меню
- Управление отображаемыми данными
- Запуск процессов
- Изменение настроек и режимов работы
Например, для включения/отключения отображения секунд в часах на индикаторе можно использовать переключатель. А для корректировки показаний - два кнопки "Больше" и "Меньше".
Примеры готовых устройств
На базе Arduino и семисегментных индикаторов можно создавать различные полезные гаджеты:
- Часы и будильники
- Измерители температуры, влажности, освещенности
- Устройства отображения данных различных датчиков
- Информационные табло
- Элементы интерактивных арт-объектов
Простота интеграции в проекты на Arduino в сочетании с низкой стоимостью делают семисегментные индикаторы отличным решением для самых разных задач.