Семисегментный дисплей как подключить

Обновлено: 07.07.2024

В этой статье описывается схема подключения пары светодиодных семисегментных индикаторов к Arduino Uno с помощью микросхем-драйверов CD4026. При таком подходе для вывода произвольного числа используется всего 2 цифровых выхода контроллера.

Для примера будем выводить на индикаторы количество секунд, прошедших с момента начала работы.

Исходные компоненты

Для эксперимента нам понадобятся:

Принцип работы

Семисегментный индикатор — это просто набор обычных светодиодов в одном корпусе. Просто они выложены восьмёркой и имеют форму палочки-сегмента. Можно подключить его напрямую к Arduino, но тогда будет занято 7 контактов, а в программе будет необходимо реализовать алгоритм преобразования числа из двоичного представления в соответствующие «калькуляторному шрифту» сигналы.

Для упрощения этой задачи существует 7-сегментный драйвер. Это простая микросхема с внутренним счётчиком. У неё есть 7 выходов для подключения всех сегментов (a, b, c, d, e, f, g pins), контакт для сбрасывания счётчика в 0 (reset pin) и контакт для увеличения значения на единицу (clock pin). Значение внутреннего счётчика преобразуется в сигналы (включен / выключен) на контакты a-g так, что мы видим соответствующую арабскую цифру.

На микросхеме есть ещё один выход, обозначенный как «÷10». Его значение всё время LOW за исключением момента переполнения, когда значение счётчика равно 9, а его увеличивают на единицу. В этом случае значением счётчика снова становится 0, но выход «÷10» становится HIGH до момента следующего инкремента. Его можно соединить с clock pin другого драйвера и таким образом получить счётчик для двузначных чисел. Продолжая эту цепочку, можно выводить сколь угодно длинные числа.

Микросхема может работать на частоте до 16 МГц, т.е. она будет фиксировать изменения на clock pin даже если они будут происходить 16 миллионов раз в секунду. На той же частоте работает Arduino, и это удобно: для вывода определённого числа достаточно сбросить счётчик в 0 и быстро инкрементировать значение по единице до заданного. Глазу это не заметно.

Подключение

Сначала установим индикаторы и драйверы на breadboard. У всех них ноги располагаются с двух сторон, поэтому, чтобы не закоротить противоположные контакты, размещать эти компоненты необходимо над центральной канавкой breadboard’а. Канавка разделяет breadboard на 2 несоединённые между собой половины.

Далее, подключим один из драйверов в соответствии с его распиновкой

2 «disable clock» — к рельсе земли: мы его не используем 3 «enable display» — к рельсе питания: это питание для индикатора 1 «clock» — через стягивающий резистор к земле. К этому контакту мы позже подведём сигнал с Arduino. Наличие резистора полезно, чтобы избежать ложного срабатывания из-за окружающих помех пока вход ни к чему не подключен. Подходящим номиналом является 10 кОм. Когда мы соединим этот контакт с выходом Arduino, резистор не будет играть роли: сигнал притянет к земле микроконтроллер. Поэтому если вы знаете, что драйвер при работе всегда будет соединён с Arduino, можете не использовать резистор вовсе. 15 «reset» и 5 «÷10» пока оставим неподключенными, но возьмём на заметку — нам они понадобятся в дальнейшем

Контакты 3 и 8 на индикаторе обозначены как «катод», они общие для всех сегментов, и должны быть напрямую соединены с общей землёй.

Далее следует самая кропотливая работа: соединение выходов микросхемы с соответствующими анодами индикатора. Соединять их необходимо через токоограничивающие резисторы как и обычные светодиоды. В противном случае ток на этом участке цепи будет выше нормы, а это может привести к выходу из строя индикатора или микросхемы. Номинал 220 Ом подойдёт.

Соединять необходимо сопоставляя распиновку микросхемы (выходы a-g) и распиновку индикатора (входы a-g)

Повторяем процедуру для второго разряда

Теперь вспоминаем о контакте «reset»: нам необходимо соединить их вместе и притянуть к земле через стягивающий резистор. В последствии, мы подведём к ним сигнал с Arduino, чтобы он мог обнулять значение целиком в обоих драйверах.

Также подадим сигнал с «÷10» от правого драйвера на вход «clock» левого. Таким образом мы получим схему, способную отображать числа с двумя разрядами.

Стоит отметить, что «clock» левого драйвера не стоит стягивать резистором к земле, как это делалось для правого: его соединение с «÷10» само по себе сделает сигнал устойчивым, а притяжка к земле может только нарушить стабильность передачи сигнала.

Железо подготовленно, осталось реализовать несложную программу.

Программирование

Результат

Подключаем контакт 2 с Arduino к контакту clock младшего (правого) драйвера, контакт 3 — к общему reset’у драйверов; разводим питание; включаем — работает!

.Урок 23. Подключение сегментного дисплея TM1637 к Arduino.

Сегодня в уроке подключим семисегментный индикатор TM1637 к Arduino. Установим библиотеку TM1637.h и научимся выводить на дисплей цифры и некоторые символы.

Как устроен и из чего состоит модуль TM1637.

Характеристики Индикатора на TM1637:
• Напряжение питание: 5,5В
• Потребляемый ток 0.2 — 80мА (в зависимости от горящих сегментов)
• Градаций яркости индикаторов — 8
• Размеры платы: 42x24мм
• Двух проводной последовательный интерфейс (CLK, DIO).

Фото модуля от магазина RobotDyn фронтальный вид.

Фото модуля от магазина RobotDyn, фронтальный вид

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Фото модуля от магазина RobotDyn вид с тыльной стороны.

Этот модуль собран на драйвере TM1637.
• Есть модули красного, синего, зелёного, белого цвета.
• Размеры 0,36” и 0,56”

В уроке будем использовать модуль TM1637 0,56”, зеленого цвета.


Возможности модуля TM1637:
• Зажигать сразу все знаки или по одному сегменту или символу,
• Выводить цифры от 0 до 9 и некоторые буквы. Смотри ниже.
• Цифры могут выводиться как с нулями слева, так и без них,
• 8 градаций изменения яркости.
• Вывод символа в определённую позицию (ячейку).

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Отличие модуля индикатора на TM1637 от других – это его компактность, он не дорогой, и управление всего по двум проводам.

Подключение дисплея TM1637 к Arduino

Подключить дисплей можно к любым цифровым пинам Ардуино. В нашем случае будем подключать к Arduino NANO по схеме.

Подключение дисплея TM1637 к Arduino

Arduino Nano [PIN 5V] - TM1637 Module[PIN 5V]

Arduino Nano [PIN GND] - TM1637 Module[PIN GND]

Arduino Nano [PIN 2] - TM1637 Module[PIN DIO]

Arduino Nano [PIN 3] - TM1637 Module[PIN CLK]

Подключение дисплея TM1637 к Arduino UNO

Установка и настройка библиотеки TM1637.h.

Установить библиотеку TM1637.h можно из менеджера библиотек. Для этого откроем Arduino IDE, перейдем в раздел Скетч-> Подключить библиотеку -> Управление библиотеками.

Установить библиотеку TM1637.h

Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

 Затем в строке поиска наберем TM1637. И установим библиотеку Grove 4-Digit Display.

Вы также можете скачать библиотеку TM1637 внизу урока, в разделе «материалы для скачивания».

Настройка библиотеки TM1637 для вывода дополнительных символов.

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Библиотека позволяет вывести цифры и некоторые символы на дисплей.

Для реализации простых проектов, таких как часы, индикаторы и счетчики, этого набора символов достаточно. Я реализовывал часы с выводом температуры и влажности: Arduino часы. Видео 2. Подключаем к Arduino TM1637 и датчик DHT11.

Для отображения температуры использовал символ «С» номер для вывода на индикатор 12и для отображения влажности использовал символ «F» номер для вывода на дисплей 15.

Но для некоторых проектов на Arduino не достаточно

Но для некоторых проектов на Arduino не достаточно данного набора символов. Расширить его достаточно легко, для этого в файле TM1637.cpp библиотеки находим массив TubeTab[] и добавляем нужные коды символов.

TM1637.cpp библиотеки

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

Список добавленных символов в файле TM1637.cpp, библиотеки TM1637.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

После чего данные символы можно использовать в своих проектах.

Если захочется закодировать свой символ, то можно использовать следующую таблицу:

После кодирования сегментов, установив нужные биты в байте,

После кодирования сегментов, установив нужные биты в байте, для сокращения записи можно перевести байт из двоичного в шестнадцатиричный формат, как - b00011110 -> 0x1E.

Пример кода для вывода информации на семисегментный индикатор с драйвером TM1637.

Пример 1. Вывод времени с мигающим двоеточием.

Пример 1. Вывод времени с мигающим двоеточием.

В данном примере выведем 4 цифры на индикатор TM1637, и научимся мигать двоеточием каждую секунду. Данный пример поможет вывести любую цифровую информацию: время, счётчики, показания с датчиков.

В данном примере выведем 4 цифры на индикатор TM1637,

Пример 2. Вывод слов на модуль TM1637.

Пример 2. Вывод слов на модуль TM1637.

Дополнительные символы добавили в библиотеку, сейчас осталось научиться их выводить. Создадим массивы необходимых слов, после чего по очереди выведем их на дисплей. Данные слова можно использовать при выводе статуса работы устройств. Это пример слов. Вы можете составлять свои слова в соответствии с вашей задачей.

Дополнительные символы добавили в библиотеку, сейчас осталось научиться их выводить.

Пример 3. Выводданных с датчиком с символами.

Пример 3. Выводданных с датчиком с символами.

Мы научились выводить цифры и слова на дисплей. Как же сделать динамическое изменение значений на дисплее. При этом добавлять символы для индикации различных данных.

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5) выводит первый символ на дисплей 5. Аналогично выводятся остальные 3 символа.

Тут поможет нам посимвольный вывод данных на дисплей. Например, запись tm1637.display(0, 5)

Для разделения числа на десятки и единицы, для нахождения единиц нужно найти остаток от деления на 10, и для получения десяток нужно число делить на 10.

Для разделения числа на десятки и единицы

И после числового значения выведем символ, например, для температуры символ «С».

И после числового значения выведем символ, например, для температуры символ «С».

Пример применим при выводе даты, времени и показаний с датчиков.

Появились вопросы или предложения не стесняйся, пиши в комментарии!

Не забывайте подписываться на канал Youtube и вступайте в группы в Вконтакте и Facebook.

Как подключить 7-сегментные дисплеи на Arduino


Семисегментные дисплеи используются во многих бытовых устройствах, таких как микроволновые печи, стиральные машины и кондиционеры. Это простой, но эффективный способ отображения числовых данных, таких как время или количество. Поскольку они сделаны из светодиодов, они являются недорогим вариантом отображения информации.

Семисегментных дисплеев бывает самых разных размеров и цветов. Красный, синий и зеленый - основные цвета. Размеры варьируются от небольших 1,5 см дисплеев до больших 10-и и даже 17 см дисплеев. Некоторые дисплеи имеют одну цифру(разряды), а другие две или четыре.

Arduino-7-Segment-Display-Single-Digit-a

Прежде чем мы начнем работать с 7-сегментными дисплеями, необходимо понять некоторые основы светодиодов и способы их управления.

ОСНОВЫ СВЕТОДИОДОВ
Один светодиод состоит из двух клемм, анода и катода. Анод является положительным выводом, а катод - отрицательным выводом:


Для питания светодиода вы подключаете катод к земле, а анод - к источнику напряжения. Светодиод может быть включен или выключен путем переключения питания на аноде или катоде.

АНОД К GPIO
Когда анод светодиода подключен к цифровому выводу, катод заземлен:


Примечание. Всем светодиодам необходим резистор для ограничения тока, размещенный либо на стороне анода, либо на стороне катода для предотвращения выгорания светодиода. Значение резистора будет определять, насколько ярко светится светодиод. 1 кОм - хорошее место для начала, но вы можете рассчитать идеальное значение с помощью светодиодного резисторного калькулятора .

Чтобы зажечь светодиод с анодом, подключенным к цифровому контакту, подаем на цифровой контакт ВЫСОКИЙ (HIGH) уровень:

void setup() <
pinMode(7, OUTPUT);
digitalWrite(7, HIGH);
>

В блоке void setup () мы настраиваем вывод GPIO 7 как выход pinMode (7, OUTPUT); и подаем на него высокий уровень с помощью digitalWrite (7, HIGH);

КАТОД К GPIO
С катодом светодиода, подключенным к цифровому выводу, анод подключен к Vcc. Для включения светодиода цифровой вывод переключается на НИЗКИЙ уровень, что замыкает цепь на землю:


В этом случае мы подаем на контакт GPIO 7 НИЗКИЙ уровень с помощью digitalWrite (7, LOW); Это замыкает цепь и позволяет току течь от Vcc к земле:

void setup() <
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
>

КАК РАБОТАЮТ 7-СЕГМЕНТНЫЕ ДИСПЛЕИ
Семисегментные дисплеи состоят из 7 светодиодов, называемых сегментами, расположенных в форме «8». Большинство 7-сегментных дисплеев на самом деле имеют 8 сегментов, с точкой справа от цифры, которая служит десятичной точкой. Каждый сегмент именуется буквой от A до G и DP для десятичной точки:


Каждый сегмент на дисплее может управляться индивидуально, как обычный светодиод.
Существует два типа 7-сегментных дисплеев - с общим катодом и с общим анодом .

ДИСПЛЕИ С ОБЩИМ КАТОДОМ
В обычных катодных дисплеях все катоды подключены к земле, а отдельные сегменты включаются и выключаются путем переключения питания на аноды:


ДИСПЛЕИ С ОБЩИМ АНОДОМ
В обычных анодных дисплеях все аноды подключены к Vcc, а отдельные сегменты включаются и выключаются путем переключения питания на катоды:

Arduino-7-Segment-Tutorial-Common-Anode-

ПОДКЛЮЧЕНИЕ 7-СЕГМЕНТНЫХ ДИСПЛЕЕВ К ARDUINO
Одноразрядные семисегментные дисплеи обычно имеют 10 контактов. Два контакта подключаются к земле, а остальные 8 подключаются к каждому из сегментов. Вот схема контактов популярного катодного дисплея 5161AS :


Прежде чем вы сможете подключить свой дисплей к Arduino, вам необходимо знать, является ли он общим анодом или общим катодом, и какие контакты подключены к каждому сегменту. Эта информация должна быть в таблице данных, но если вы не можете найти таблицу данных или не знаете номер детали вашего дисплея, я покажу вам, как это выяснить ниже…

КАК ОПРЕДЕЛИТЬ, КАКОЙ У ВАС ДИСПЛЕЙ С ОБЩИМ АНОДОМ ИЛИ С ОБЩИМ КАТОДОМ
Это можно проверить с помощью тестовой схемы, сконструированной следующим образом:


Подключите заземляющий (черный) провод к любому выводу дисплея. Затем вставьте положительный (красный) провод в каждый из других контактов. Если ни один сегмент не загорелся, переместите провод заземления на другой контакт и повторите процесс. Делайте это, пока не загорится хотя бы один сегмент.

Когда загорится первый сегмент, оставьте провод заземления там, где он есть, и снова подключите положительный провод к каждому из других контактов. Если с каждым другим выводом загорается другой сегмент - у вас дисплей с общим катодом. Контакт, который подключен к заземляющему проводу, является одним из общих контактов. Таких должно быть два.

Если два разных контакта освещают один и тот же сегмент - у вас дисплей с общим анодом. Контакт, который подключен к положительному проводу, является одним из общих контактов. Теперь, если вы подключите провод заземления к каждому из других выводов, вы должны увидеть, что разные сегменты загораются с каждым другим выводом.

КАК ОПРЕДЕЛИТЬ РАСПИНОВКУ ДЛЯ ВАШЕГО ДИСПЛЕЯ
Теперь нарисуйте схему, показывающую контакты на вашем дисплее. Когда общий контакт подключен к заземляющему проводу (общий катод) или положительному проводу (общий анод), проверьте каждый контакт другим проводом. Когда сегмент загорается, запишите имя сегмента (AG или DP) рядом с соответствующим выводом на диаграмме.

ПОДКЛЮЧЕНИЕ ОДНОРАЗРЯДНЫХ ДИСПЛЕЕВ К ARDUINO
Как только вы разобрались с расположением выводов, подключить дисплей к Arduino уже будет довольно просто. На этой схеме показано, как подключить одноразрядный дисплей 5161AS (обратите внимание на ограничивающий ток резистор 1 кОм, подключенный последовательно с общими контактами):


В приведенных ниже примерах программ контакты сегментов подключаются к Arduino в соответствии с этой таблицей:


ПРОГРАММИРОВАНИЕ ОДНОРАЗРЯДНЫХ ДИСПЛЕЕВ
УСТАНОВИТЬ БИБЛИОТЕКУ
Мы будем использовать библиотеку SevSeg для управления дисплеем. Библиотека SevSeg работает с одноразрядными и многоразрядными семисегментными дисплеями. Вы можете скачать ZIP-файл библиотеки с GitHub :

Чтобы установить его, откройте Arduino IDE, перейдите в «Sketch»> «Включить библиотеку»> «Добавить .ZIP библиотеку» и выберите загруженный ZIP-файл SevSeg.

ВЫВОД ЧИСЕЛ НА ДИСПЛЕЕ
Эта программа напечатает число «4» на одноразрядном 7-сегментном дисплее:

void setup() <
byte numDigits = 1;
byte digitPins[] = <>;
byte segmentPins[] = ;
bool resistorsOnSegments = true;

byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
>

void loop() <
sevseg.setNumber(4);
sevseg.refreshDisplay();
>

В этой программе мы создаем объект sevseg в строке 2. Чтобы использовать дополнительные дисплеи, вы можете создать другой объект и вызвать соответствующие функции для этого объекта. Отображение инициализируется с помощью функции sevseg.begin () в строке 11. Другие функции описаны ниже:

hardwareConfig = COMMON_CATHODE; Этот параметр устанавливает тип дисплея. Я использую общий катод, но если вы используете общий анод, тогда используйте COMMON_ANODE.

byte numDigits = 1; Этот параметр устанавливает количество цифр на вашем дисплее. Я использую одноразрядный дисплей, поэтому я установил его на 1. Если вы используете 4-разрядный дисплей, установите это на 4.

byte digitPins [] = <>; Создает массив, который определяет заземляющие контакты при использовании 4-разрядного или многоразрядного дисплея. Оставьте его пустым, если у вас есть одноразрядный дисплей. Например, если у вас 4-разрядный дисплей и вы хотите использовать выводы Arduino 10, 11, 12 и 13 в качестве заземляющих выводов цифр, вы должны использовать это так: byte digitPins [] = ; , См. ниже пример ипользования 4-разрядного дисплея для получения дополнительной информации.

byte segmentPins[] = ; Это объявляет массив, который определяет, какие выводы Arduino подключены к каждому сегменту дисплея. Порядок в алфавитном порядке (A, B, C, D, E, F, G, DP, где DP - десятичная точка). Таким образом, в этом случае контакт 6 Arduino подключается к сегменту A, контакт 5 подключается к сегменту B, контакт 2 подключается к сегменту C и так далее.

resistorsOnSegments = true; Это должно быть установлено в true, если ваши текущие ограничивающие резисторы соединены последовательно с сегментными выводами. Если резисторы соединены последовательно с цифровыми выводами, установите для этого параметра значение false. Установите это значение true при использовании многозначных дисплеев.

sevseg.setBrightness (90); Эта функция устанавливает яркость дисплея. Его можно настроить от 0 до 100.

sevseg.setNumber (); Эта функция выводит номер на дисплей. Например, sevseg.setNumber (4); напечатает число «4» на дисплее. Вы также можете печатать числа с десятичными точками. Например, чтобы напечатать число «4.999», вы должны использовать sevseg.setNumber (4999, 3); , Второй параметр (3) определяет, где находится десятичная точка. В этом случае это 3 цифры от самой правой цифры. На одноразрядном дисплее установка второго параметра на «0» включает десятичную точку, а установка на «1» отключает его.

sevseg.refreshDisplay (); Эта функция требуется в конце секции цикла, чтобы продолжить отображение номера.

ТАЙМЕР ОБРАТНОГО ОТСЧЕТА
Эта простая программа будет отсчитывать от нуля до 9 и затем возвращаться к началу:

void setup() <
byte numDigits = 1;
byte digitPins[] = <>;
byte segmentPins[] = ;
bool resistorsOnSegments = true;

byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
>

void loop() <
for(int i = 0; i < 10; i++) <
sevseg.setNumber(i, i%2);
delay(1000);
sevseg.refreshDisplay();
>
>

Код похож на предыдущий скетч. Единственное отличие состоит в том, что мы создаем переменную count «i» в операторе for в строке 16 и увеличиваем ее по одному числу за раз.

Sevseg.setNumber (I, I% 2); функция печатает значение i. Аргумент i% 2 делит i на 2 и возвращает остаток, в результате чего десятичная точка включает все остальные числа.

Таймер обратного отсчета - хороший способ продемонстрировать основы программирования дисплея, но теперь давайте попробуем сделать что-то более интересное.

ИГРАЛЬНЫЕ КОСТИ
Этот пример состоит из кнопки и одного 7-сегментного дисплея. Каждый раз, когда нажимается и удерживается кнопка, на дисплее быстро появляются цифры 0-9. Как только кнопка отпущена, дисплей продолжает цикл в течение того периода времени, почти равного времени нажатия кнопки, а затем отображает число вместе с десятичной точкой, чтобы указать новый номер.
Чтобы построить схему (с дисплеем 5161AS), подключите его следующим образом:


Затем загрузите эту программу в Arduino:

const int buttonPin = 10; // the pin that the pushbutton is attached to
int buttonState = 0; // current state of the button
int lastButtonState = LOW; // previous state of the button
int buttonPushCounter = 0; // counter for the number of button presses
long counter = 0;
long max_long_val = 2147483647L;

void setup() <
byte numDigits = 1;
byte digitPins[] = <>;
byte segmentPins[] = ;
bool resistorsOnSegments = true;

byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);

pinMode(buttonPin, INPUT_PULLUP);
Serial.begin(9600);
lastButtonState = LOW;
>

void loop() <
buttonState = digitalRead(buttonPin);
if(buttonState == HIGH) <
buttonState = LOW;
>

else
buttonState = HIGH;

if(buttonState == HIGH) <
Serial.println("on");
lastButtonState = HIGH;
buttonPushCounter++;
if(counter < max_long_val)
counter++;
buttonPushCounter %= 9;
sevseg.setNumber(buttonPushCounter, 1);
sevseg.refreshDisplay();
delay(100 - (counter%99));
>

else <
Serial.println("off");
if(lastButtonState == HIGH) <
Serial.println("in");
buttonPushCounter++;
buttonPushCounter %= 7;
if(buttonPushCounter == 0)
buttonPushCounter = 1;
counter--;
sevseg.setNumber(buttonPushCounter, 1);
sevseg.refreshDisplay();
delay(100 - (counter%99));
if(counter == 0) <
lastButtonState = LOW;
sevseg.setNumber(buttonPushCounter, 0);
sevseg.refreshDisplay();
>
>
>
>

4-РАЗРЯДНЫЙ 7-СЕГМЕНТНЫЙ ДИСПЛЕЙ
До сих пор мы работали только с одноразрядными 7-сегментными дисплеями. Для отображения такой информации, как время или температура, нам нужно использовать 2- или 4-разрядный дисплей или подключать несколько одноразрядных дисплеев рядом.


В многоразрядных дисплеях один сегментный вывод (A, B, C, D, E, F, G и DP) контролирует один и тот же сегмент на всех цифрах. Многоразрядные дисплеи также имеют отдельные общие выводы для каждой цифры. Это цифровые контакты. Вы можете включить или выключить цифру, переключив цифровой pin.


Я использую 4-разрядный 7-сегментный дисплей марки 5641AH, но приведенные ниже схемы подключения также будут работать с 5461AS.
Вот схема, показывающая распиновку этих дисплеев:


Цифровые контакты D1, D2, D3 и D4 должны быть подключены к токоограничивающим резисторам, поскольку они являются общими клеммами цифр. Соединения показаны ниже:


Эта простая программа выведет число «4.999» на дисплей:

void setup() <
byte numDigits = 4;
byte digitPins[] = ;
byte segmentPins[] = ;

bool resistorsOnSegments = true;
bool updateWithDelaysIn = true;
byte hardwareConfig = COMMON_CATHODE;
sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
sevseg.setBrightness(90);
>

void loop() <
sevseg.setNumber(4999, 3);
sevseg.refreshDisplay();
>

В приведенном выше коде мы устанавливаем количество цифр в строке 5 с помощью byte numDigits = 4; ,

Поскольку в многоразрядных дисплеях используются цифровые контакты, нам также необходимо определить, какие контакты Arduino будут подключаться к цифровым контактам. Использование byte digitPins [] = ; в строке 6 вывод Arduino 10 в качестве первого разряда, Arduino 11 в качестве второго разряда и так далее.

Чтобы напечатать числа с десятичной точкой, мы устанавливаем второй параметр в sevseg.setNumber (4999, 3); до трех, что ставит его на три знака после запятой справа от цифры.

ДИСПЛЕЙ ТЕМПЕРАТУРЫ
Этот пример считывает температуру с термистора и отображает ее на четырехзначном дисплее.
Подключите схему следующим образом:


!Если у вас есть вопросы по использованию термистора или вы просто хотите узнать о них больше, ознакомьтесь с нашим другим руководством по использованию термистора с Arduino.

Как только все подключится, загрузите этот код в Arduino:

int ThermistorPin = 0;
int Vo;
float R1 = 10000;
float logR2, R2, T;
float c1 = 1.009249522e-03, c2 = 2.378405444e-04, c3 = 2.019202697e-07;

void setup() <
byte numDigits = 4;
byte digitPins[] = ;
byte segmentPins[] = ;
bool resistorsOnSegments = true;
byte hardwareConfig = COMMON_CATHODE;

sevseg.begin(hardwareConfig, numDigits, digitPins, segmentPins, resistorsOnSegments);
>

void loop() <
Vo = analogRead(ThermistorPin);
R2 = R1 * (1023.0 / (float)Vo - 1.0);
logR2 = log(R2);
T = (1.0 / (c1 + c2 * logR2 + c3 * logR2 * logR2 * logR2));
T = T - 273.15;
T = (T * 9.0) / 5.0 + 32.0; //Comment out for Celsius

static unsigned long timer = millis();

if (millis() >= timer) <
timer += 300;
sevseg.setNumber(T, 2);
>

Это выведет температуру в градусах Фаренгейта. Чтобы отобразить температуру в градусах Цельсия, закомментируйте строку //Comment out for Celsius.

Переменная температуры «T» выводится на дисплей в строке 35 с sevseg.setNumber (T, 2, false); ,

Надеюсь, этой статьи будет достаточно, чтобы вы начали пользоваться семисегментными дисплеями. Если вы хотите отображать показания с других датчиков, вышеприведенный пример программы можно легко изменить под ваши нужды. Если у вас есть какие-либо вопросы или проблемы по настройке этих скетчей, не стесняйтесь оставлять комментарии ниже.

КДПВ

Случилось так, что по наследству мне досталась целая коробка семисегментных индикаторов с гордой надписью «Комплект часы». Давно хотелось пустить её содержимое в дело, а когда дошли руки — оказалось, что внутри целый зоопарк разномастных индикаторов, разных размеров, цветов, с общим катодом и с общим анодом. По количеству штук так двадцать. И чтобы не пилить «очередные часы» пришла идея сделать, собственно, сабж — максимально универсальный семисегментный дисплей.

Что из этого получилось — под катом.

Disclaimer

Описанные ниже устройства являются довольно нишевыми, сделаны мною just for fun, но примененный подход может быть использован для решения аналогичной задачи универсализации там, где это потребуется. Текст разбавлю пояснениями для начинающих. Основная цель — спроектировать единую плату под все имеющиеся индикаторы и различные идеи их использования.

Статья получилась объемная, так что я разделил hardware и software части. К вашему вниманию часть первая — hardware.

Постановка задачи

Что я понимаю под максимальной универсальностью? Спроектировать модуль, с помощью которого или его комбинаций можно создать любой (или практически любой, в разумных пределах) дисплей для отображение информации с использованием этих самых семисегментных индикаторов. В голову приходит сразу с десяток применений — часы, конечно же, куда без них; туда же таймеры, счетчики чего угодно; термометры; табло для разных игр; дисплеи для отображения цифровой информации — курсов валют, индексов бирж и т.п. В общих чертах задача абсолютно тривиальная, но усложняется зоопарком типов индикаторов. В наличии одноразрядные китайские индикаторы с размером цифры 2.3 дюйма (тип FJ23101, четыре светодиода на сегмент) и 3 дюйма (тип CL-30011, пять светодиодов на сегмент), разных цветов и с различным типом подключения — с общим катодом и с общим анодом. Чтобы покрыть использование всех этих типов пришлось посидеть над схемой и разводкой, которая давала бы возможность без изменения топологии печатной платы управлять разными индикаторами. Поискав вечерок в интернете мне не удалось найти универсальных решений или схем, что и стало поводом для написания данной статьи.

По приведенным примерам использования становится понятно, что модуль должен поддерживать различную разрядность, от одной цифры для простых счетчиков событий, до шести для индексов некоторых финансовых бирж. Я решил ограничиться двумя цифрами для большего трехдюймового размера и тремя для меньшего, с возможностью подключения еще одного модуля в виде slave-а.

При выборе управляющей части долго думать не пришлось, выбор сразу пал на готовые модули ESP-07 на контроллере ESP8266 от Espressif. Дешевизна и простота использования этих модулей, возможность легкого подключения к Интернету, обширная комьюнити разработчиков и элементарность программирования этого контроллера отмели все другие варианты.

Приступим к деталям

Начнем с питания семисегментных индикаторов большого размера, где каждый сегмент представляет собой цепочку из нескольких последовательно включенных светодиодов. Такие дисплеи уже не получится зажечь «цифровыми» уровнями напряжения, так как падение на цепочке светодиодов больше этого значения. Конкретное значение указывается в даташите на дисплей, оно зависит от характеристик светодиодов, цвета и их количества и может варьироваться от 6 до 12 Вольт. Ток через каждый сегмент также превышает допустимые значения тока через отдельный пин для большинства контроллеров и составляет от 20 до 50 мА. Соответственно, нужно использовать напряжение 12 Вольт и коммутирующие ключи для управления сегментами и общими выводами. Также не стоит забывать о динамической индикации — последовательном переключении разрядов с частотой превышающей частоту восприятия глаза человека. Это позволяет значительно снизить энергопотребление практически без потери визуальной яркости дисплея.

Общее питание было решено брать от порта USB, как наиболее универсального стандарта на данный момент. После непродолжительного гугления я выбрал готовый модуль повышающего DC-DC преобразователя на МТ3608. Он компактный, дешевый (<0.5$), регулируемый, с достаточно высоким КПД — всё что нужно для наших целей. От резервного питания отказался, так как под рукой есть Интернет, где можно получить актуальную информацию в любой момент.

Питание цифровой части обеспечит линейный low-dropout стабилизатор LM1117-3.3, классическое решение для нетребовательных применений.

Теперь по транзисторным ключам.

Для управления индикатором с общим катодом на сегменты нужно подавать плюс питания, общий контакт, катод, подключить к земле. Для данных целей удобно использовать микросхемы источников тока (source drivers IC), как пример UDN2981. На картинке ниже подключение индикатора к драйверу и упрощенная схема одной ячейки для лучшего понимания пути прохождения тока. Стоит заметить, что в классической схеме должны быть токоограничивающие резисторы в цепи каждого сегмента, они упущены по причинам использования другого метода ограничения тока — МАХ7219 имеет изменять скважность управляющих импульсов, что в сумме с возможность регулировки напряжения питания индикаторов даст необходимый результат.

Common cathode 7 segment connection

Для индикаторов с общим анодом — наоборот, общий контакт подключается к плюсу питания, а сегменты коммутируются на землю. В плане управления индикаторы с общим анодом более простые, так как не требуют коммутации высокого напряжения, по этой причине они более распространены. Для управления сегментами удобно использовать микросхему-массив составных транзисторов Дарлингтона (Darlington Transistor Arrays), например всеми любимую ULN2803.

Значительным преимуществом перед UDN2981 является стоимость, которая в разы меньше. На картинке ниже подключение индикатора к драйверу и упрощенная схема одной ячейки.

Common anode 7 segment connection

Можно заметить, что верхние части схем очень схожи. Пара драйверов UDN2981 и ULN2803 подобрана неспроста. Относительно ножек вход/выход они pin-to-pin совместимы. Это дает возможность сделать универсальное посадочное место на плате добавив всего несколько перемычек под запайку для ножек питания. Бинго!

Чтобы упростить задачу динамической индикации я решил не изобретать велосипед, не городить 595-е сдвиговые регистры, а взять надежное и проверенное решение — специализированный драйвер семисегментного дисплея MAX7219. Эта микросхема умеет хранить во внутренней памяти до восьми цифр и самостоятельно коммутировать разряды с заранее установленной яркостью. По этой причине и не нужны резисторы последовательно с каждым сегментом. Управляется драйвер по шине SPI. Как по мне, микросхема имеет всего один недостаток — высокую стоимость. Имела. Пришли китайцы и наклепали полный функциональный аналог со стоимостью в несколько центов. Название такое же, правда маркировка отличается, отсутствует оригинальный логотип Maxim. В работе отличий не замечено, временные диаграммы такие же, не греется, отказов пока не было. Но для ответственных применений все-таки рекомендую ставить дорогой оригинал.

MAX7219-MATRIX-KIT

Вот такой набор MAX7219-MATRIX-KIT можно купить на Ali и в локальных магазинах для ардуинщиков по цене в четыре раза ниже оригинального драйвера MAX7219. Да-да, вы меня правильно поняли, набор с матрицей, платой и рассыпухой. Дешевле. В четыре раза. Выбор очевиден же?

Пока всё звучит очень хорошо и просто, берём драйвер дисплея, который всё делает за нас, в зависимости от типа индикатора ставим нужные ключи и вуа-ля! Все почти так и есть, кроме одного «но». MAX7219 рассчитан на работу с дисплеями с общим катодом с напряжением сегмента до 5В и никак иначе. Что это дает в сухом остатке? Перебирая разряды индикаторов драйвер подключает их на землю, поддерживая высокий уровень на катодах остальных разрядов. А теперь вернемся к схемам выше и проанализируем, что будет в случае с индикатором с общим анодом.

Нетрудно понять, что мы получим инверсию — нужный разряд будет выключен, все остальные — активные. Вместо динамической индикации на дисплее будет сплошной засвет от соседних разрядов. Чтобы избежать такой ситуации между контроллером и драйвером нужно добавить микросхему инвертирующую логические уровни. Так как максимальное количество разрядов шесть, гуглим «hex inverter» и тут же находим 74hc04. Отлично, а для общего катода вместо микросхемы сделаем перемычки или можно использовать pin-to-pin совместимую микросхему-буфер 74als34/74as34 (hex noninverter, но обязательно с выходом push-pull, открытый коллектор/сток типа 74hc07/74als35 работать не будет из-за отсутствия подтяжки к питанию).

В итоге имеем финальные схемы подключения индикаторов. Для общего катода все просто — драйвер плюс ключи способные подавать на сегменты повышенное напряжение. В даташите на MAX7219 приводится схема подключения индикаторов размера 2.3 дюйма и все это запитано от 5 Вольт, но мои экземпляры наотрез отказались работать при таком низком напряжении, сегмент начинал слабо светиться при подаче 7.2В (1.8В на светодиод). Катоды подключены напрямую к MAX7219, контроллер может прокачивать через себя от 320мА на каждый канал (>45мА на сегмент), чего с головой достаточно для данных типоразмеров индикаторов.

max7219 with common cathode display

Для общего анода все немного сложнее. Тут уже нужно использовать разнотипные ключи для верхнего и для нижнего плечей плюс инвертирующий буфер для управления разрядами. Инвертирование сигналов для сегментов получаем автоматически при использовании ULN2803.

max7219 with common anode display

Как видим, со стороны драйвера MAX7219 и управляющего всем этим ESP8266 нет никакой разницы какой именно тип индикатора установлен в модуле, модифицировать прошивку не требуется.

Замечу, что при использовании внешних драйверов встроенное в контроллер ограничение тока сегментов (которое задается резистором на входе Iset) корректно работать не будет, поэтому интенсивность будем регулировать напряжением питания при максимальной скважности от MAX7219. Драйвер позволяет устанавливать интенсивность скважностью встроенного ШИМ генератора от 1/32 до 31/32 с шагом 1/16.

Для управляющей части на ESP8266 ничего выдумывать не нужно, берем типовое включение модуля, заводим линии SPI на MAX7219, UART для прошивки на внешний разъем. Дополнительно решил добавить преобразователь протокола UART в virtual COM port через USB, его устанавливать необязательно, но места на плате предостаточно, пускай будет такая возможность. Как преобразователь я выбрал СН340, как максимально простое и бюджетное решение. В версии чипа СН340G преобразователь даже не требует частотозадающего кварца, он уже встроен в конвертер, а из обвеса всего пара конденсаторов, проще не бывает.

ESP8266


Полная схема в хорошем качестве тут.

Со схемой определились, теперь можно приступать к топологии печатной платы. Как я уже упоминал, все эти заморочки именно через плату. Хотелось заказать партию плат на нормальном производстве под все вышеперечисленные устройства и не дорабатывать их по месту напильником и скальпелем. После непродолжительных размышлений на плате вырисовались аж целых восемь посадочных мест под семисегментные индикаторы:

  • По одному для 2.3" и 3" по центру платы — для дисплея с одной цифрой
  • По два для 2.3" и 3" — для дисплея с двумя цифрами
  • Три для 2.3" — соответственно, для дисплея с тремя цифрами

Такая комбинация позволяет расширить разрядность до шести цифр, а так же комбинируя расположение и размер индикаторов изготовить табло для различных, предположим, настольных игр и, конечно же, часы! На контакты продублированы сигналы управления всеми сегментами и выведены линии подключения 3 и 4 разряда для трехдюймовок, и 4, 5 и 6 разряд для двухдюймовок.

Дополнительно, два оставшихся свободных канала MAX7219 подключены к двум цепочкам дискретных светодиодов, расположенных над и под индикаторами. Их, например, можно будет использовать для фоновой подсветки, так сказать эффект ambilight.

Размер платы выбран таким образом, чтобы она не выходила за края индикаторов. В таком случае можно скомбинировать дисплей с одинаковыми расстояниями между цифрами для бо́льших и 6ти-разрядный для меньших индикаторов.

По углам платы расположены четыре отверстия под болт М3 для крепления модуля к несущей конструкции.

Микросхемы, если это было возможно, выбраны в выводных корпусах DIP, так как вопрос миниатюризации для данного устройства не актуален, а на плате они выглядят уже почти стимпанково, на фоне привычных BGA монстров. Это придает особого шарма, как у ламповых усилителей.

Посадочное место под модуль ESP-07 также pin-to-pin совместимо с модулями ESP-12S/E/F.
Плата проектировалась за два вечера, по этой причине использовался простой принцип разводки как у автороутеров — разделение горизонтальных и вертикальных линий на разные слои. В итоге плата получилась двухсторонняя, несложная и визуально красивая.

UDM PCB through view

UDM PCB bottom view


Плата была отправлена в производство как раз в канун китайского Весеннего Фестиваля и карантинных мер в КНР. Рассматривал три популярные площадки для изготовления мелкосерийных прототипов — PCBway, Seeed и JLCpcb. На последней стоимость получилась на 20 долларов дешевле (при партии в 20 шт) и значимым плюсом для меня было то, что фабрика не закрывалась на праздничную неделю. Суммарная стоимость составила 44 доллара, с учетом доставки 21$ и купона на скидку -5$. В пересчете на плату — чуть больше 2 долларов за штуку. Несмотря на разгар эпидемии коронавируса, от отправки gerber-ов на фабрику к моменту получения прошел 21 день. Качество плат на высоте.

UDM PCB

За время пока в Китае изготавливались платы, в местном рекламном агентстве были заказаны основы из прозрачного акрила, куда можно закрепить платы и светорассеиватель. Теперь можно посмотреть, что получилось из задуманного.

Вот так выглядит вариант платы, запаянной под индикаторы с общим катодом. На фото указаны названия микросхем и обведены перемычки под запайку.

UDM Common anode

А вот так — под индикаторы с общим анодом.

UDM Common anode

На фото ниже различные комбинации индикаторов разных размеров. Как вы можете понять, их также можно удвоить, добавив slave-модуль.


Далее осталось только написать скрипт под конкретную реализацию, чем и займемся в следующей части.

В этой статье мы рассмотрим подключение семисегментного дисплея (индикатора) к плате Arduino Uno. Дисплей может отображать цифры от 0 до 9. Вначале рассмотрим общие принципы работы семисегментного дисплея.

Подключение семисегментного дисплея к Arduino Uno: внешний вид конструкции

Семисегментный дисплей (индикатор) получил такое название потому, что он содержит семь светоизлучающих элементов (сегментов). Каждый из этих сегментов содержит светодиод. Светодиоды таким образом скомпонованы в составе дисплея, что каждый из них освещает только свой сегмент (к которому он относится). Семисегментные дисплеи могут быть с общим катодом и общим анодом, как показано на следующем рисунке.

Внутренние схемы соединений семисегментных дисплеев

В семисегментном дисплее с общим катодом (ОК) отрицательные выводы всех светодиодов соединены вместе и образую общую землю. В схеме с общим анодом (ОА) положительные выводы всех светодиодов соединены вместе и они образуют общий вывод напряжения постоянного тока (VCC).

На нашем сайте есть достаточно подробные статьи про устройство семисегментных дисплеев и их программированию – они написаны для микроконтроллеров семейства AVR, но я думаю провести аналогию с Arduino вам будет не трудно:

Необходимые компоненты

  1. Плата Arduino UNO (купить на AliExpress).
  2. Семисегментный дисплей HDSP5503 (2 шт.) – или другой подобный с общим катодом (купить на AliExpress).
  3. Конденсатор 47 пФ, соединенный по питанию (купить на AliExpress).
  4. Напряжение питания 5 В.

Работа схемы

Схема подключения семисегментного дисплея к плате Arduino представлена на следующем рисунке.

В схеме необходимо сделать следующие соединения семисегментного дисплея с платой Arduino:
PIN1 или E к контакту PIN 6 of ARDUINO UNO
PIN2 или D к контакту PIN 5
PIN4 или C к контакту PIN 4
PIN5 или H или DP к контакту PIN 9 /// в этом соединении нет необходимости если мы не будем использовать десятичную точку (decimal point)
PIN6 или B к контакту PIN 3
PIN7 или A к контакту PIN 2
PIN9 или F к контакту PIN 7
PIN10 или G к контакту PIN 8
PIN3 или PIN8 или CC (общий катод) на землю через резистор 100Ω.

Теперь, чтобы лучше понять принцип работы семисегментного дисплея, представим что он как будто подсоединен к порту микроконтроллера, то есть сегмент A соединен с контактом PIN0 микроконтроллера, сегмент B – с контактом PIN1, сегмент А – с контактом PIN3, сегмент А – с контактом PIN4, сегмент А – с контактом PIN5, сегмент А – с контактом PIN6. Общий вывод соединен с землей как показано на следующем рисунке.

Семисегментный дисплей легко проверить используя мультиметр в режиме диода. На каждом сегменте дисплея не должно быть напряжения большего 5 В, иначе дисплей будет необратимо поврежден. Чтобы исключить подобное общий резистор должен быть подключен к общему выводу дисплея как показано на выше приведенной схеме нашего устройства.

Теперь, чтобы на семисегментном дисплее отобразить 0, необходимо подать питающие напряжения как показано на рисунке ниже.

То есть чтобы зажечь светодиоды в сегментах “A, B, C, D, E F” (то есть отобразить на дисплее цифру 0) нам необходимо подать питающее напряжение на контакты PIN0, PIN1, PIN2, PIN3, PIN4 and PIN5.

Теперь, если мы хотим отобразить цифру 1 на дисплее, мы должны подать питающее напряжение на сегменты “B, C”, то есть запитать контакты PIN1, PIN2. Эта ситуация показана на следующем рисунке.

То есть, чтобы отобразить какую либо цифру на дисплее, необходимо подать питание на соответствующие контакты дисплея.

Исходный код программы

В представленной программе мы будем последовательно подавать питание на соответствующие контакты семисегментного дисплея, чтобы по очереди отображать на нем цифры от 0 до 9.

Читайте также: