Семисегментный индикатор. Arduino и четырехразрядный семисегментный индикатор 4 значный индикатор и ардуино

Подключение семисегментного индикатора к 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-ми сегментный светодиодный индикатор. Для начала что это такое. Вот такая вот штука. Это один разряд, так же бывают двух разрядные, трех и четырех разрядные. Видел еще шести разрядные. После каждого разряда стоит десятичная точка. Если разрядов четыре, то чаще всего после второго разряда можно встретить двоеточие для индикации секунд, при выводе времени. Разобравшись с железками давайте перейдем к изучению схемы. Что вообще такое динамическая индикация и зачем она нужна. Так-как индикатор 7-ми сегментный, то для отображения цифры используется всего 7 сегментов. Обозначаются они всегда латинскими буквами A, B, C, D, E, F, G и DP Смотрим картинку. Под каждым сегментом расположен светодиод. Все светодиоды одним концом объеденены. Либо анодами либо катодами, а противоположные концы выведены наружу. Легко заметить что для отображения цифры необходимо использовать 8 выводов. Один общий и семь для сегментов. Если это касается одного разряда, то тут думать не о чем, просто вешаем все на один порт. А если разрядов четыре? Восемь помножим на четыре будет тридцать два. О... Да над таким индикатором 32 мега будет одна корпеть. Так дело не пойдет. Есть два решения. Наша с вами динамическая индикация либо статическая. Что бы дальше разбираться, давайте посмотрим схему включения индикатора.

Данная схема подразумевает динамическую индикацию. Да что я все динамическая да статическая. В чем разница?. Статическая индикация - это когда мы задали каждому разряду по своей цифре и она постоянно горит, а динамическая - это когда мы выводим цифру в первый разряд, потом его гасим и выводим во второй разряд, потом его гасим и выводим в третий разряд и так далее пока не закончатся разряды. После последнего разряда переходим опять к первому и так по кругу. Если это делать медленно то можно будет лицезреть цифровую бегущую строку, а если увеличить скорость к примеру до 50 Гц, то уже мерцания глаз не увидит. Вот таким образом и работает динамическая индикация. Давайте теперь разберем схему. Слева МК ATmega8 за ней на порту D висит микросхема 74ALS373. Зачем она нужна? Дело в том что индикатор это просто 8 светодиодов собранных в некую матрицу. То есть индикатор можно представить в виде линейки из 8 светодиодов. А как известно светодиоды кушают по отношению к МК ого го сколько. Конечно не возбраняется подключение напрямую, но лучше поставить между МК и индикатором какой-нибудь ретранслятор. Вот для этих целей я и решил использовать 8-и разрядный буфер с защелкой. Почему именно его. С учетом того что индикатор я использую с общим анодом, то есть для задачи цифры активный уровень 0, то можно было бы смело использовать микросхему ULN2003A(7 транзисторных сборок по схеме Дарлингтона) и не париться с буфером, но... Но в том что ULN2003A имеет на борту только NPN транзисторы и я могу использовать индикатор только с общим анодом, а если нужно поставить с общим катодом? Вот тут и поможет буфер, так как что я туда напишу, то и будет на выходе. Хочешь 0, хочешь 1. Управляющие ножки подключены в режиме транслятора. То есть буфер выводит на выход тоже самое что и на входе. Аля псевдо гальваническая развязка. За буфером следуют токоограничивающие резисторы. Помним, это светодиоды и без резисторов сгорят. Номинал резисторов нужно подбирать чуть меньше чем допустимо. Дело в том что динамическая индикация выводит символы с некой частотой и она с родни ШИМу, то есть чем выше частота, тем выше так сказать контрастность. И при максимально комфортной контрастности цифры будут светить чуть тускнее. По этому резисторы нужно брать чуть меньшего номинала. Я использовал 360Ом только потому что у меня такие были в наличии. Далее после резисторов наш индикатор. С другой стороны, где аноды, я подключил первые четыре разряда порта С. Так, со схемой вроде разобрались. Теперь давайте обсудим алгоритм программы. Для того чтобы поочередно включать разряды индикатора, напишем отдельную функцию и будем ее бесконечно вызывать в основном теле программы. Конкретнее, функция будет получать число от 0 до 9999, рабирать его на разряды и потом выводить каждый разряд на своем месте. Если число имеет количество разрядов меньше 4, то пустышки слева будем заполнять нулями. Ровняемся по правому краю. Бегать по разрядам будем слева направо. Чтобы было видно какие-нибудь действия, то мы используя прерывания от счетчика, раз в секунду будем увеличивать выводимое число на единицу. Так задача поставлена, к бою. #define F_CPU 7372800UL // Частота кварца #include #include #include volatile unsigned int test = 9980; // Переменная для вывода на индикатор ISR(TIMER1_COMPA_vect) // Обработчик прерывания по совпадению таймера 1 { test++; // Увеличить выводимое число if(test > 9999) test = 0; // Если вышел за пределы четырех разрядов, обнулить TCNT1H=0x00; // Сброс регистра TCNT1L=0x00; // счета } void dig_out(int num); // Объявление функции вывода на индикатор int main(void) { DDRC = 0x0F; // Настройка портов DDRD = 0xFF; // для работы с индикатором Порт С для разрядов, Порт D для цифр TCCR1A=0x00; // Настройка таймера TCCR1B=0x04; TCNT1H=0x00; TCNT1L=0x00; OCR1AH=0x70; OCR1AL=0x80; TIMSK=0x10; sei(); // Разрешение прерываний while(1) { dig_out(test); //Постоянно вызываем функцию вывода текущего числа } } void dig_out(int num) // Функция для вывода на индикатор 4-х разрядов { unsigned char i = 0; // Переменная счетчика unsigned char raz = 1; // Номер разряда unsigned char dig_num = {0x40, 0x79, 0x24, 0x30, 0x19, 0x12, 0x02, 0x78, 0x00, 0x10}; // Коды цифр для индикатора с общим анодом unsigned char dig = {0, 0, 0, 0}; // Массив для значения разряда if(num { dig =0; dig =0; dig =0; } if(num // Для заполнения нулями левых разрядов { dig =0; dig =0; } if(num // Для заполнения нулями левых разрядов { dig =0; } while(num > 999) // Получение количества тысяч { dig++; num -= 1000; } while(num > 99) // Получение количества сотен { dig++; num -= 100; } while(num > 9) // Получение числа десятков { dig++; num -= 10; } dig = num; // Получения количества единиц while(raz // Крутимся пока не заполним все 4 разряда { PORTC = raz; // Выбираем разряд PORTD = dig_num]; // Выводим цифру raz = raz// Сдвигаемся на следующий разряд i++; // Увеличиваем индекс следующей цифры _delay_ms(1); // Задержка 1 мс } } Вот и весь код. Расписывать его не буду так как он имеет комментарии к каждой строке. Ниже можно скачать архив с проектом под AtmelStudio6.2 Если все же возникнут вопросы, то милости просим на форум. Ну и для самых привередливых ниже видео все этой балалайки))).

Новые статьи

● Проект 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. Нажатием кнопки запускаем или останавливаем секундомер.

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

В начале двадцатого века с появлением электронных ламп появились первые газоразрядные индикаторы

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


Минус газоразрядных ламп – кушают много электроэнергии. Про долговечность можно и поспорить. У нас в университете до сих пор в лабораторных кабинетах эксплуатируются частотомеры на газоразрядных индикаторах.

Семисегментные индикаторы

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

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

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

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

Виды и обозначение на схеме

Существуют одноразрядные, двухразрядные, трехразрядные и четырехразрядные семисегментные индикаторы. Более четырех разрядов я не встречал.

На схемах семисегментный индикатор выглядит примерно вот так:

В действительности же, помимо основных выводов, каждый семисегментный индикатор также имеет общий вывод с общим анодом (ОА) или общим катодом (ОК)

Внутренняя схема семисегментного индикатора с общим анодом будет выглядеть вот так:


а с общим катодом вот так:


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

Как проверить семисегментный индикатор

У нас имеются в наличии вот такие индикаторы:


Для того, чтобы проверить современный семисегментный индикатор, нам достаточно мультиметра с функцией прозвонки диодов. Для начала ищем общий вывод – это может быть или ОА или ОК. Здесь только методом тыка. Ну а далее проверяем работоспособность остальных сегментов индикатора по схемам выше.

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


Иногда напряжения на мультиметре не хватает для проверки сегмента. Поэтому, берем блок питания , и выставляем на нем 5 Вольт. Чтобы ограничить ток через сегмент, проверяем через резистор на 1-2 Килоома.


Таким же образом проверяем индикатор от китайского приемника


В схемах семисегментные индикаторы соединяются с резисторами на каждом выводе

В нашем современном мире семисегментные индикаторы заменяются жидко-кристаллическими индикаторами, которые могут высвечивать абсолютно любую информацию

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

Подключим семисегментный светодиодный индикатор к плате Ардуино и научимся управлять им с помощью библиотеки Led4Digits.h.

В предыдущем уроке подробно описаны к микроконтроллерам. Подключим такой индикатор к плате Ардуино.

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

Я собрал ее на монтажной плате.

Для управления индикаторами я написал библиотеку Led4Digits.h:

И оплатите.

Библиотека позволяет управлять семисегментными индикаторами:

  • размерностью до четырех разрядов;
  • с любыми вариантами полярностей управляющих импульсов (все );
  • работает в параллельном процессе;
  • позволяет выводить на индикатор:
    • сегменты каждого разряда;
    • цифру каждого разряда;
    • целое число 0 … 9999;
  • для вывода целого числа может быть задано число разрядов;
  • есть режим гашения незначащих разрядов.

Загрузить библиотеку Led4Digits.h можете по этой ссылке:

И оплатите. Всего 40 руб. в месяц за доступ ко всем ресурсам сайта!

Как устанавливать написано в .

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

Библиотека управления LED индикаторами для Ардуино Led4Digits.

Вот описание класса. Я привел только public методы и свойства.

class Led4Digits {
public:
byte digit; // коды управления сегментами разрядов
void regen(); // регенерация, метод должен вызываться регулярно
void tetradToSegCod(byte dig, byte tetrad); // преобразования тетрады в коды сегментов
boolean print(unsigned int value, byte digitNum, byte blank); // вывод целого числа



} ;

Конструктор.

Led4Digits (byte typeLed, byte digitPin0, byte digitPin1, byte digitPin2, byte digitPin3,
byte segPinA, byte segPinB, byte segPinC, byte segPinD,
byte segPinE, byte segPinF, byte segPinG, byte segPinH);

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

typeLed Выбор разряда Выбор сегмента Тип схемы
0 -_- -_- Общий анод с ключами выбора разряда
1 _-_ -_- Общий анод
2 -_- _-_ Общий катод
3 _-_ _-_ Общий катод с ключами выбора разряда

digitPin0 … digitPin3 – выводы выбора разрядов. Если digitPin = 255, то разряд отключен. Это позволяет подключать индикаторы с меньшим количеством разрядов. digitPin0 – младший (правый) разряд.

segPinA … segPinH – выводы управления сегментами.

Например,

означает: тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13.

Метод void regen()

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

Например,

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Массив byte digit

Содержит состояние сегментов. digit это младший разряд, младший бит digit это сегмент ”A” младшего разряда. Состояние бита равное 1, означает, что сегмент светится.

Например,

digit = B0000101;

означает, что во втором разряде светятся сегменты ”A” и ”C”.

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

// бегущие сегменты
#include
#include

//
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 32; i++) {
if (i == 0) disp.digit= 1;
else if (i == 8) disp.digit= 1;
else if (i == 16) disp.digit= 1;
else if (i == 24) disp.digit= 1;
else {
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
disp.digit = disp.digit << 1;
}
delay(250);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

В массиве digit сдвигается 1 и индикаторы отображают это.

Метод void tetradToSegCod(byte dig, byte tetrad)

Метод позволяет выводить на отдельные разряды цифры и буквы шестнадцатеричного кода. Имеет аргументы:

  • dig – номер разряда 0 … 3;
  • tetrad – десятичный код символа. Код 0 отобразит цифру ”0”, код 1 - цифру ”1”, код 14 - букву ”E”.

Например,

tetrad(2, 7);

выведет цифру “7” в третьем разряде.

Пример программы меняющей символы в каждом разряде по очереди.

// цифры по очереди
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 64; i++) {
disp.tetradToSegCod(i>>4, i);
delay(250);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Метод boolean print(unsigned int value, byte digitNum, byte blank)

Метод выводит на индикаторы целое число. В нем двоичное число преобразуется в двоично-десятичный код для каждого разряда. Имеет аргументы:

  • value – число, которое выводится на индикатор.
  • digitNum – количество разрядов для числа. Не надо путать с количеством разрядов индикатора. Вы можете захотеть вывести число на 2х разрядах, а на остальных двух отобразить символы, используя digit.
  • blank – признак гашения незначащих разрядов. blank=0 означает, что число должно отображаться со всеми нулями. Число ”7” будет выглядеть “0007”. При blank, отличном от 0 незначащие нули будут гаситься.

Если число value превышает допустимое для выбранного количества разрядов (digitNum), то функция отобразит на индикаторе ”---” и вернет false.

Пример программы вывода чисел.

// вывод числа
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
for (int i = 0; i < 12000; i++) {
disp.print(i, 4, 1);
delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Последние два метода не меняют состояния сегмента ”H” – децимальной точки. Чтобы изменить состояние точки можно использовать команды:

digit |= 0x80; // зажечь децимальную точку
digit &= 0x7f; // погасить децимальную точку

Вывод на индикаторы отрицательных чисел (int).

Вывод отрицательных чисел можно производить следующим образом:

  • Проверить знак числа.
  • Если число отрицательное, то напечатать на старшем разряде знак минус и в функции print() изменить знак числа на положительный.
  • Если число положительное, то погасить разряд знака и вывести число функцией print().

Вот программа, которая демонстрирует такой способ. Она выводит числа от -999 до 999.

// вывод отрицательных чисел
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {

for (int i = -999; i < 1000; i++) {

if (i < 0) {
// число отрицательно
disp.digit= B01000000; // знак -
disp.print(i * -1, 3, 1);
}
else {
disp.digit= B00000000; // гашение знака
disp.print(i, 3, 1);
}

delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Вывод на индикаторы дробных чисел, формат float.

Для вывода на индикаторы чисел с плавающей запятой (float) существует много способов с использованием стандартных функций языка C. Это, прежде всего, функция sprint(). Работает очень медленно, требует дополнительных преобразований кодов символов в двоично-десятичные коды, надо из строки выделять точку. С другими функциями те же проблемы.

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

  • Число с плавающей запятой умножается на 10 в степени соответствующей требуемому числу знаков после запятой. Если вам необходимо на индикаторы выводить 1 знак после запятой, умножаете на 10, если 2, то умножаете на 100, 3 знака – на 1000.
  • Далее число с плавающей запятой явно преобразуется в целое (int) и выводится на индикаторы функцией print().
  • В нужном разряде ставится точка.

Например, следующие строки выведут на семисегментные светодиодные индикаторы переменную типа float с двумя знаками после запятой.

float x = 2.12345;

disp.digit |= 0x80; //

Мы умножаем число на 100, а поставив точку в третьем разряде, делим результат на 100.

Вот программа, выводящая на индикаторы числа с плавающей запятой от 0.00 до 99.99.

// вывод чисел с плавающей запятой
#include
#include

// тип индикатора 1; выводы разрядов 5,4,3,2; выводы сегментов 6,7,8,9,10,11,12,13
Led4Digits disp(1, 5,4,3,2, 6,7,8,9,10,11,12,13);

void setup() {
MsTimer2::set(2, timerInterrupt); // прерывание по таймеру 2 мс
MsTimer2::start(); // разрешение прерывания
}

void loop() {
float x = 0;

for (int i = 0; i < 10000; i++) {
x += 0.01;

disp.print((int)(x * 100.), 4, 1);
disp.digit |= 0x80; // зажечь точку третьего разряда

delay(50);
}
}

// обработчик прерывания 2 мс
void timerInterrupt() {
disp.regen(); // регенерация индикатора
}

Как видите, библиотека Led4Digits.h значительно упрощает работу с семисегментыми светодиодными (LED) индикатороми, подключенными к плате Ардуино. Аналога такой библиотеки я не нашел.

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

В отличие от аналогов библиотека Led4Digits.h:

  • Работает параллельным процессом. В основном цикле программа загружает данные в определенные переменные, которые автоматически, отображаются на дисплее. Вывод информации и регенерация индикаторов происходят в прерывании по таймеру, незаметно для основной программы.
  • Цифры дисплея светятся равномерно, без миганий. Это свойство обеспечивается тем, что регенерация происходит в цикле, строго заданном прерыванием по таймеру.
  • Библиотека имеет компактный код, выполняется быстро, минимально нагружает контроллер.

В следующем уроке подключим к плате Ардуино одновременно светодиодный индикатор и матрицу кнопок. Напишем библиотеку для такой конструкции.

Рубрика: . Вы можете добавить в закладки.