Контакты

7 сегментный индикатор 4 разряда arduino. Arduino и четырехразрядный семисегментный индикатор. Управление семисегментными индикаторами


Схема подключения одноразрядного семисегментного индикатора
Схема подключения многоразрядного семисегментного индикатора

Устройство отображения цифровой информации. Это - наиболее простая реализация индикатора, который может отображать арабские цифры. Для отображения букв используются более сложные многосегментные и матричные индикаторы.

Как говорит его название, состоит из семи элементов индикации (сегментов), включающихся и выключающихся по отдельности. Включая их в разных комбинациях, из них можно составить упрощённые изображения арабских цифр.
Сегменты обозначаются буквами от A до G; восьмой сегмент - десятичная точка (decimal point, DP), предназначенная для отображения дробных чисел.
Изредка на семисегментном индикаторе отображают буквы.

Бывают разных цветов, обычно это белый, красный, зеленый, желтый и голубой цвета. Кроме того, они могут быть разных размеров.

Также, светодиодный индикатор может быть одноразрядным (как на рисунке выше) и многоразрядным. В основном в практике используются одно-, двух-, трех- и четырехразрядные светодиодные индикаторы:

Кроме десяти цифр, семисегментные индикаторы способны отображать буквы. Но лишь немногие из букв имеют интуитивно понятное семисегментное представление.
В латинице : заглавные A, B, C, E, F, G, H, I, J, L, N, O, P, S, U, Y, Z, строчные a, b, c, d, e, g, h, i, n, o, q, r, t, u.
В кириллице : А, Б, В, Г, г, Е, и, Н, О, о, П, п, Р, С, с, У, Ч, Ы (два разряда), Ь, Э/З.
Поэтому семисегментные индикаторы используют только для отображения простейших сообщений.

Всего семисегментный светодиодный индикатор может отобразить 128 символов:

В обычном светодиодном индикаторе девять выводов: один идёт к катодам всех сегментов, а остальные восемь - к аноду каждого из сегментов. Эта схема называется «схема с общим катодом» , существуют также схемы с общим анодом (тогда все наоборот). Часто делают не один, а два общих вывода на разных концах цоколя - это упрощает разводку, не увеличивая габаритов. Есть еще, так называемые «универсальные», но я лично с такими не сталкивался. Кроме того существуют индикаторы со встроенным сдвиговым регистром, благодаря чему намного уменьшается количество задействованных выводов портов микроконтроллера, но они намного дороже и в практике применяются редко. А так как необъятное не объять, то такие индикаторы мы пока рассматривать не будем (а ведь есть еще индикаторы с гораздо большим количеством сегментов, матричные).

Многоразрядные светодиодные индикаторы часто работают по динамическому принципу: выводы одноимённых сегментов всех разрядов соединены вместе. Чтобы выводить информацию на такой индикатор, управляющая микросхема должна циклически подавать ток на общие выводы всех разрядов, в то время как на выводы сегментов ток подаётся в зависимости от того, зажжён ли данный сегмент в данном разряде.

Подключение одноразрядного семисегментного индикатора к микроконтроллеру

На схеме ниже, показано как подключается одноразрядный семисегментный индикатор к микроконтроллеру.
При этом следует учитывать, что если индикатор с ОБЩИМ КАТОДОМ , то его общий вывод подключается к «земле» , а зажигание сегментов происходит подачей логической единицы на вывод порта.
Если индикатор с ОБЩИМ АНОДОМ , то на его общий провод подают «плюс» напряжения, а зажигание сегментов происходит переводом вывода порта в состояние логического нуля .

Осуществление индикации в одноразрядном светодиодном индикаторе осуществляется подачей на выводы порта микроконтроллера двоичного кода соответствующей цифры соответствующего логического уровня (для индикаторов с ОК — логические единицы, для индикаторов с ОА — логические нули).

Токоограничительные резисторы могут присутствовать в схеме, а могут и не присутствовать. Все зависит от напряжения питания, которое подается на индикатор и технических характеристик индикаторов. Если, к примеру, напряжение подаваемое на сегменты равно 5 вольтам, а они рассчитаны на рабочее напряжение 2 вольта, то токоограничительные резисторы ставить необходимо (чтобы ограничить ток через них для повышенного напряжении питания и не сжечь не только индикатор, но и порт микроконтроллера).
Рассчитать номинал токоограничительных резисторов очень легко, по формуле дедушки Ома .
К примеру, характеристики индикатора следующие (берем из даташита):
— рабочее напряжение — 2 вольта
— рабочий ток — 10 мА (=0,01 А)
— напряжение питания 5 вольт
Формула для расчета:
R= U/I (все значения в этой формуле должны быть в Омах, Вольтах и Амперах)
R= (напряжение питания — рабочее напряжение)/рабочий ток
R= (5-2)/0.01 = 300 Ом

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

На схеме не показано, но между базами транзисторов и выводами порта микроконтроллера необходимо включать резисторы, сопротивление которых зависит от типа транзистора (номиналы резисторов рассчитываются, но можно и попробовать применить резисторы номиналом 5-10 кОм).

Осуществление индикации разрядами осуществляется динамическим путем:
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 1 разряда, затем подается логический уровень на управляющий транзистор первого разряда
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 2 разряда, затем подается логический уровень на управляющий транзистор второго разряда
— выставляется двоичный код соответствующей цифры на выходах порта РВ для 3 разряда, затем подается логический уровень на управляющий транзистор третьего разряда
— итак по кругу
При этом надо учитывать:
— для индикаторов с ОК применяется управляющий транзистор структуры NPN (управляется логической единицей)
— для индикатора с ОА — транзистор структуры PNP (управляется логическим нулем)

Эта статья продолжает цикл моих публикация про организацию динамической индикации на микроконтроллерах PIC и LED индикаторах. Вот ссылки на предыдущие публикации:

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

В каждом из прерываний с интервалом 2 мс (в данном случае от таймера TMR0) подготавливается один этап динамической индикации (ДИ) согласно алгоритму, который состоит из пяти фаз управления регистром и индикатором.

2-я фаза: положительный перепад на выводе 12 регистра (ST_CP) записывает нулевое состояние регистра в выходную защелку. Здесь и далее, до начала индикации, индикатор погашен нулевым потенциалом на сегментах.

3-я фаза: посредством управления выводами регистра 14 (DS – данные) и 11 (SH_CP – тактовый) в него записывается код для управления сегментами.

4-я фаза: положительным перепадом на выводе 12 регистра данные из регистра записываются в выходную защелку, причем, из-за положительных уровней на разрядах индикатор остается погашенным.

5-я фаза: здесь на выводы разрядов индикатора подается требуемый код, и далее происходит собственно индикация.

Если в схеме задействован один 4-х разрядный индикатор, то для правильной работы он должен быть с ОК. Если требуется управлять 8-ю разрядами, то используются 8 портов МК, при этом, остальные 4 порта просто управляют разрядами (в фазе 4 на них должен быть высокий уровень). Стоит отметить, что в этом случае возможно применение индикаторов как с ОК, так и с ОА, подключая к регистру соответственно сегменты или разряды (по причинам, изложенным ниже, ДИ в первом случае предпочтительно организовать посегментную, а во втором – поразрядную).

По этой методике можно подключить два четырехразрядных индикатора к МК PIC16F676, используя один сдвиговый регистр, при этом, останутся для использования целых четыре свободных порта. , например, для такого подключения люди использовали совмещение в некоторых портах МК функций ДИ и аналоговых входов (на мой взгляд, крайне сомнительное решение), что привело к значительному усложнению схемы и к некоторым ограничениям, о чем авторы и предупреждают. Используя мою схему подключения, все решилось бы просто и красиво – входы отдельно, индикация отдельно, плюс еще два порта (включая MCLR) для кнопок.

Для тестирования данного способа управления предлагается следующая простая схема на МК PIC12F629 и индикаторе FYQ3641A, которое выдает на индикаторе попеременно слово «test» и число 1234.

Здесь решено применить посегментную ДИ (в каждый момент включен один сегмент, а на разрядных выводах присутствует код, где в каждом разряде: 0 – если в данном разряде должен гореть данный сегмент и 1 – в противном случае), при котором пиковые токи перекладываются на регистр. Почему? Этому есть две причины: первая – максимальная нагрузочная способность выходов 74HC595 35 мА против 25 мА у контроллеров PIC; вторая и главная – близкий к предельному ток через выходной порт МК теоретически может поднять выходной потенциал оного до уровня переключения входов регистра, что привело бы к ошибкам в работе. А так, в порты МК втекают токи 6-7 мА и на выходах потенциалы заведомо не превышают TTL-уровни.

Как упоминалось выше, интервал прерываний - 2 мс, что соответствует частоте обновления индикатора в 64 Гц и его свечение достаточно комфортно воспринимается глазом.

Данный способ ДИ, кроме всего прочего, позволил вдвое уменьшить количество токоограничительных резисторов (R2-R5).

Устройство собрано на так называемой «беспаечной» макетной плате.

Индикатор можно заменить на любой из серии 3641А.

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

Программа управления МК написана на языке Си и оттранслирована в среде .

Код в MikroC, проект , HEX-файл в приложении.

Для использования данного способа подключения в коммерческих разработках просьба связаться со мной.

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
DD1 МК PIC 8-бит

PIC12F629

1 В блокнот
DD2 Регистр 74HC595 1 В блокнот
HL Индикатор FYQ3641 1 В блокнот
R1 Резистор

30 кОм

1 В блокнот
R2 Резистор

430 Ом

1 В блокнот
R3 Резистор

430 Ом

1

Наверняка вы уже видели индикаторы - "восьмёрки". Это и есть семисегментный светодиодный индикатор, который служит для отображения цифр от 0 до 9, а также децимальной точки (DP - Decimal point) или запятой.

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

В зависимости от модели сборка может состоять из 1 - 4 семисегментных групп. Например, индикатор АЛС333Б1 состоит из одной семисегментной группы, которая способна отображать всего лишь одну цифру от 0 до 9.

А вот светодиодный индикатор KEM-5162AS уже имеет две семисегментных группы. Он является двухразрядным. Далее на фото показаны разные светодиодные семисегментные индикаторы.

Также существуют индикаторы с 4-мя семисегментными группами - четырёхразрядные (на фото - FYQ-5641BSR-11). Их можно использовать в самодельных электронных часах.

Как обозначаются семисегментные индикаторы на схемах?

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

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

Особенности семисегментных индикаторов.

Несмотря на кажущуюся простоту этой детали и у неё есть особенности.

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

Вот, например, цоколёвка уже знакомого нам 4-ёх разрядного индикатора FYQ-5641BSR-11 .

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

Кроме небольших индикаторов есть большие и даже очень большие. Их можно увидеть в общественных местах, обычно в виде настенных часов, термометров, информеров.

Чтобы увеличить размеры цифр на табло и одновременно сохранить достаточную яркость каждого сегмента, используется несколько светодиодов, включенных последовательно. Вот пример такого индикатора - он умещается на ладони. Это FYS-23011-BUB-21 .

Один его сегмент состоит из 4 светодиодов, включенных последовательно.

Чтобы засветить один из сегментов (A, B, C, D, E, F или G), нужно подать на него напряжение в 11,2 вольта (2,8V на каждый светодиод). Можно и меньше, например, 10V, но яркость тоже уменьшится. Исключение составляет децимальная точка (DP), её сегмент состоит из двух светодиодов. Для неё нужно всего 5 - 5,6 вольт.

Также в природе встречаются двухцветные индикаторы. В них встраиваются, например, красные и зелёные светодиоды. Получается, что в корпус встроено как бы два индикатора, но со светодиодами разного цвета свечения. Если подать напряжение на обе цепи светодиодов, то можно получить жёлтый цвет свечения сегментов. Вот схема соединений одного из таких двухцветных индикаторов (SBA-15-11EGWA).

Если коммутировать выводы 1 (RED ) и 5 (GREEN ) на "+" питания через ключевые транзисторы, то можно менять цвет свечения отображаемых чисел с красного на зелёный. А если же одновременно подключить выводы 1 и 5, то цвет cвечения будет оранжевым. Вот так можно баловаться с индикаторами .

Управление семисегментными индикаторами.

Для управления семисегментными индикаторами в цифровых устройствах используют регистры сдвига и дешифраторы. Например, широко распространённый дешифратор для управления индикаторами серии АЛС333 и АЛС324 - микросхема К514ИД2 или К176ИД2 . Вот пример .

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

Для управления большими семисегментными индикаторами, такими как, FYS-23011-BUB-21 применяются специализированные драйверы, например, микросхема MBI5026 .

Что внутри семисегментного индикатора?

Ну и немного вкусненького. Любой электронщик не был бы таковым, если бы не интересовался "внутренностями" радиодеталей. Вот что внутри индикатора АЛС324Б1.

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

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



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


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



Светодиодные сегменты индикатора требуют подключения токоограничивающих резисторов при питании от 5 В на логическом выводе. Значение резистора обычно берется между 330 и 470 Ом. Также рекомендуется использование транзисторов для обеспечения дополнительного тока, поскольку каждый вывод микроконтроллера может выдавать максимум 40 мА. Если включить все сегменты разряда (цифра 8), то потребляемый ток превысит этот предел. На рисунке ниже показана схема подключения четырехразрядного семисегментного индикатора с применением транзисторов токоограничивающих резисторов.



Далее приведены схемы подключения индикатора к выводам Arduino. Здесь использованы биполярные npn-транзисторы BC547. Потенциометр 10 КОм, подключенный ко входу платы A0 позволяет изменять отображаемое на индикаторе значение от 0 до 1023.




На плате Arduino цифровые выходы D2-D8 в данном случае предназначены для управления сегментами от «a» до «g», а цифровые выходы D9-D12 используются для управления разрядами от D0 до D3. Следует заметить, что в данном примере точка не используется, но в скетче, приведенном ниже, есть возможность ее задействовать. Вывод D13 платы Arduino зарезервирован для управления сегментом точки.



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


// биты, представляющие сегменты с A по G (и точки), для чисел 0-9 const int numeral = { //ABCDEFG /dp B11111100, // 0 B01100000, // 1 B11011010, // 2 B11110010, // 3 B01100110, // 4 B10110110, // 5 B00111110, // 6 B11100000, // 7 B11111110, // 8 B11100110, // 9 }; // выводы для точки и каждого сегмента // DP,G,F,E,D,C,B,A const int segmentPins = { 13,8,7,6,5,4,3,2 }; const int nbrDigits= 4; // количество разрядов светодиодного индикатора //разряды 0 1 2 3 const int digitPins = { 9,10,11,12 }; void setup() { for(int i=0; i < 8; i++) { pinMode(segmentPins[i], OUTPUT); // устанавливаем выводы для сегментов и точки на выход } for(int i=0; i < nbrDigits; i++) { pinMode(digitPins[i], OUTPUT); } } void loop() { int value = analogRead(0); showNumber(value); } void showNumber(int number) { if(number == 0) { showDigit(0, nbrDigits-1) ; // отображаем 0 в правом разряде } else { // отображаем значение, соответствующее каждой цифре // крайняя левая цифра 0, правая на единицу меньше, чем число позиций for(int digit = nbrDigits-1; digit >= 0; digit--) { if(number > 0) { showDigit(number % 10, digit) ; number = number / 10; } } } } // Отображаем заданное число на данном разряде 7-сегментного индикатора void showDigit(int number, int digit) { digitalWrite(digitPins, HIGH); for(int segment = 1; segment < 8; segment++) { boolean isBitSet = bitRead(numeral, segment); // isBitSet будет истинным, если данный бит будет 1 // isBitSet = ! isBitSet; // опционально // раскомментируйте опциональную строчку выше для индикатора с общим анодом digitalWrite(segmentPins, isBitSet); } delay(5); digitalWrite(digitPins, LOW); }

Новые статьи

● Проект 7: Матрица 4-разрядная из 7-сегментных индикаторов. Делаем динамическую индикацию

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

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

Матрица 4-разрядная из семисегментных индикаторов состоит из четырех семисегментных индикаторов и предназначена для одновременного вывода на матрицу 4 цифр, также есть возможность вывода десятичной точки. Схема 4-разрядной матрицы на 7-сегментных индикаторах показана на рис. 7.1.

Рис. 7.1. Схема 4-разрядной матрицы на 7-сегментных индикаторах

Для вывода цифры необходимо зажечь нужные светодиоды на контактах A-G и DP и выбрать нужную матрицу подачей LOW на вывод 6, 8, 9 или 12.
Подключим контакты матрицы к плате Arduino и будем выводить цифры на различные разряды матрицы. Для подключения нам понадобятся 12 выводов Arduino. Схема соединений для подключения 4-разрядной матрицы к плате Arduino показана на рис. 7.2. При подключении контактов используются ограничительные резисторы 510 Ом.

Рис. 7.2. Схема подключения 4-разрядной матрицы к Arduino

Напишем скетч последовательного вывода цифр (0-9) на произвольный регистр матрицы. Для выбора случайного значения из диапазона будем использовать функцию random(). В массиве numbers хранятся значения, соответствующие данным для отображения цифр 0-9 (старший разряд байта соответствует метке сегмента A индикатора, а младший - сегменту G), в массиве pins - значения контактов для сегментов A-G и DP, в массиве pindigits - значения контактов для выбора разряда матрицы. Содержимое скетча показано в листинге 7.1.

// переменная для хранения значения текущей цифры int number=0 ; // семисегментного индикатора int digit=0 ; void setup () { for (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop () { number=(number+1 )%10 ; showNumber(number); // DS for (int i=0 ;i<4 ;i++) digitalWrite(pindigits[i],HIGH); digit=random(0 ,4 ); digitalWrite(pindigits,LOW); delay(3000 ); } void showNumber (int num) { for (int i=0 ;i<7 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // зажечь сегмент // потушить сегмент digitalWrite(pins[i],LOW); } }
Порядок подключения:

1. Подключаем семисегментный индикатор по схеме на рис. 7.3.
2. Загружаем в плату Arduino скетч из листинга 7.2.

// список выводов Arduino для подключения к разрядам a-g // семисегментного индикатора int pins={9 ,13 ,4 ,6 ,7 ,10 ,3 ,5 }; // значения для вывода цифр 0-9 byte numbers = { B11111100, B01100000, B11011010, B11110010, B01100110, B10110110, B10111110, B11100000, B11111110, B11110110}; // переменная для хранения и обработки текущего значения int number=0 ; int number1=0 ; int number2=0 ; // семисегментного индикатора int pindigits={2 ,8 ,11 ,12 }; // переменная для хранения текущего разряда int digit=0 ; // для отмеривания 100 мс unsigned long millis1=0 ; // режим 1 - секундомер работает mode=0 ; const int BUTTON=14 ; // Контакт 14(A0) для подключения кнопки int tekButton = LOW; // Переменная для сохранения текущего состояния кнопки int prevButton = LOW; // Переменная для сохранения предыдущего состояния // к нопки boolean ledOn = false ; // Текущее состояние светодиода (включен/выключен) void setup () { // Сконфигурировать контакт кнопки как вход pinMode (BUTTON, INPUT); // Сконфигурировать контакты как выходы for (int i=0 ;i<8 ;i++) pinMode(pins[i],OUTPUT); for (int i=0 ;i<4 ;i++) {pinMode(pindigits[i],OUTPUT); digitalWrite(pindigits[i],HIGH); } } void loop () { tekButton = debounce(prevButton); if (prevButton == LOW && tekButton == HIGH) // если нажатие... { mode=1 -mode; // изменение режима if (mode==1 ) number=0 ; } if (millis()-millis1>=100 && mode==1 ) {millis1=millis1+100 ; number=number+1 ; if (number==10000 ) number=0 ; } number1=number; for (int i=0 ;i<4 ;i++) { number2=number1%10 ; number1=number1/10 ; showNumber(number2,i); for (int j=0 ;j<4 ;j++) digitalWrite(pindigits[j],HIGH); digitalWrite(pindigits[i],LOW); delay(1 ); } } // функция вывода цифры на семисегментный индикатор void showNumber (int num,int dig) { for (int i=0 ;i<8 ;i++) { if (bitRead(numbers,7 -i)==HIGH) // зажечь сегмент digitalWrite(pins[i],HIGH); else // потушить сегмент digitalWrite(pins[i],LOW); } if (dig==1 ) // десятичная точка для второго разряда digitalWrite(pins,HIGH); } // Функция сглаживания дребезга. Принимает в качестве // аргумента предыдущее состояние кнопки и выдает фактическое. boolean debounce (boolean last) { boolean current = digitalRead(BUTTON); // Считать состояние кнопки, if (last != current) // если изменилось... { d elay (5 ) ; // ж дем 5 м с current = digitalRead(BUTTON); // считываем состояние кнопки return current; // возвращаем состояние кнопки } }

3. Нажатием кнопки запускаем или останавливаем секундомер.



Понравилась статья? Поделитесь ей