Arduino использование 7 или 8 сегментных 4х разрядных индикаторов.

Восьмисегментный индикатор GNQ-5641AS-21

ОБНОВЛЕНО 26.07.2015.  Исправил известные баги. Выложил на Гитхаб.

Понадобилось тут на индикатор GNQ-5641AS и выводить значения.

У него 4 разряда по 8 сегментов (7 — цифра и 1 — точка)
Для того что бы отобразить на нём значение необходимо на катод нужного разряда подать «-» а на необходимые сегменты «+» что бы получилась цифра.
Так как каждый сегмент разряда завязан на одну линию (посмотрите в даташите, станет понятнее), то что бы вывести разные числа в разные разряды,
необходимо зажигать разряды по очереди с соответствующими сегментами.
Т.е. сначала подали «-» на катод первого разряда и выставили нужные сегменты (при этом сегменты остальных разрядов гореть не будут, т.к. у их катодов в это время должен быть «+»)
потом аналогично второго и т.д. Для иллюстрации процесса в примере delay(5); замените на delay(500);
При быстрой смене моргание не заметно, поэтому и получается число целиком.

После поиска готовых библиотек приуныл.
Все готовые либы использовали тормознутый digitalWrite да ещё и в циклах, кроме того слишком было намудрено с выводом плавающей точки.

Представляю свой вариант библиотеки для работы с таким индикатором и ему подобными.
Выводит только целочисленные значения со знаком.
Для отображения плавающей точки необходимо явно задать её положение.
Нет жёстких ограничений на кол-во разрядов, сегментов и символов.
Кастомные символы (например букву C можно прописать в массиве масок символов digits)
Вся работа по выводу идёт напрямую через порты и битовые маски.
Под себя либу можете подкорректировать, я же стараюсь на слабых чипах не прибегать к плавающей точке, вся арифметика — целочисленная.

Подключайте индикатор в какие угодно пины, только порядок правильно пропишите при инициализации либы.
Пины разрядов подключать через резисторы в 100Ом.
Пины сегментов и разрядов на индикаторе смотреть в даташите.

Комменты в коде , надеюсь не переборщил и не слишком тупо 😉
Установка проста — папку из архива разархивировать в папку libraries к папке установки Arduino IDE (Для Ubuntu /usr/share/arduino/libraries Для Винды уже не помню)

СКАЧАТЬ

В Arduino IDE в менюшке примеров появится SegmentsIndicator там этот же пример использования:

#include <SegmentsIndicator.h>

/*
* Первым параметром - количество разрядов + количество сегментов. 
* Если используется стандартный индикатор, то должно стоять 12
* Дальше через запятую пины разрядов в порядке 4, 3, 2, 1
* и пины сегментов  A, B, C, D, E, F, G, DP
* кстати, A3,A5,A2 - значит аналоговое пины
*/
SegmentsIndicator segmentsIndicator(12,   13, 12 , 11, 10, 1, A5, A3, 3, 2, A2, A4, 4);

void setup() 
{
  segmentsIndicator.displayVal(-22, 1); //-- Подготавливаем значение первый параметр - значение, второй - положение точки
}

void loop() 
{
  segmentsIndicator.displayRefresh(); //-- Отображаем значение на индикаторе.
  delay(5); //-- Дадим время разгорется сегментам индикатора
}
У меня этот индикатор с общим катодом, для индикаторов с общим анодом потребуется в либе инвертировать маски символов (digits) а так же поменять значения c HIGH на LOW при конфигурации пинов,
а так же убрать инвертирование разрядов. В общем, читайте комменты в коде, там написано =)

Так же можно использовать несколько 7 сегментных индикаторов вместе: соединив выводы сегментов, а 4 вывода разряда подключить к Ардуинке.
Так же потребуется изменить константы в библиотеке.

Подходит для чипов ATmega168 и ATmega328, для остальных необходимо будем изменить порты и правильно указать диапазоны (в коде в комментах есть пояснение).

В общем как-то так =)

Related posts

Разделение на отдельные пакеты байтового потока данных.

Конвертер картинок для Arduino LCD OLED 128×64 I2C дисплея

Arduino прошивка загрузчика (bootloader) на новый чип Atmega 328P-PU / 168 через Bit-Bang на самой плате Arduino в Ubuntu 14 c помощью avrdude версии 6.1

17 комментариев

Maxai 24 января 2017 - 10:50
Здравствуйте У меня все работает, библиотекой доволен Хотел бы узнать как можно выводить символы К примеру: 54*С
Максим Белов 2 января 2017 - 11:00
Я использую сдвиговой регистр. Так даже библиотеки не нужны. shiftOut()
Анатолий 20 мая 2016 - 19:44
Подскажите пожалуйста, а как бы вывести данные с dht11 на 7-сегментный индикатор с применением вашей библиотеки.
Pavelk 21 мая 2016 - 2:00
А в чём проблема то?
Владимир 20 апреля 2016 - 16:00
Спасибо! Заработало на IDE 1.6.5.!
Владимр 20 апреля 2016 - 15:03
Не компилируется. :( Пишет ошибку exit status 1 Использую IDE 1.6.8 Win7 x64 Arduino nano Atmega328
Виталий 28 января 2016 - 17:42
Подскажите, как определить очередность ножек у индикатора ?
Pavelk 3 февраля 2016 - 2:19
По дата-шиту, иначе придётся с помощью батарейки искать нужные выводы.
Дима 22 октября 2015 - 18:47
Доброго дня, адаптирую под экран с анодом. работает все кроме точки (на её месте маска обнуляется и ничего не выводит) что значит тут цифра 11? if (dig==dot) { //-- Есть точка в этом разряде добавим её маску к маске цифры             pp = 11 * PORTS_COUNT;             portb |= displayDigitsMasks[pp + 0]; ...            пробовал заменить на 11 символ в массиве (0b01111111), не оно)
Pavelk 23 октября 2015 - 1:14

"11" это и есть впринципе индекс точки из массива символов (digits).

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

Как временное решение, попробуйте

portb |= ~displayDigitsMasks[pp + 0]; 

portc |= ~displayDigitsMasks[pp + 1];

 

portd |= ~displayDigitsMasks[pp + 2];

И по-моему лучше инвертировать не маски символов, а именно создание масок в Init()

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

kurdun 20 октября 2015 - 2:45
Скачал с гитхаба, собрал схемку, показывает упорно 3 символа с наложением, при большой задержке видно. Не выводит 1-ый символ. Буду ковырять. Если есть мысли, накидывайте. А за саму задумку огромное спасибо.
kurdun 20 октября 2015 - 6:54
UPD. Ура! Заработало! Вывод: то что на гитхабе от 27 июля не для ОА ни для ОК :)) Или крестик снимите или штаны наденьте :) Убрал инверсию разрядов, всё пашет с ОК. Ещё раз респект автору.
kurdun 20 октября 2015 - 7:01
Всё, допёр до конца, у меня катоды подключены через npn транзистор вот вам и инвертор, так что всё правильно.
Pavelk 23 октября 2015 - 1:15

Спасибо за комментарии, я уж подумал не ту версию выложил =)

Сергей 5 июня 2015 - 17:21
Здравствуйте! Тоже столкнулся с проблемой библиотек.. Не нашёл заточенную под ардуино. Программирует народ в  основном на ассемблере, но вникать в структуру, да и вообще заморачиваться только с выводом информации на дисплей индикатора считаю слишком нерационально, на дворе уже 21 век как ни как! Понимаю объём кода меньше и прозрачность... лучше потратить время на проект, а не на заморочки по выводу. Так что вы дело дельное творите) Тут правда ваш пример на ардуинке ругаться начал (Mega328). Как я понял у вас в примере опечатка есть, два раза - SegmentsIndicator segmentsIndicator.  Исправив, ругается на библиотеки: In file included from Indi.ino:1: C:\Program Files (x86)\Arduino\libraries\SegmentsIndicator/SegmentsIndicator.h:1: error: stray '\357' in program C:\Program Files (x86)\Arduino\libraries\SegmentsIndicator/SegmentsIndicator.h:1: error: stray '\273' in program C:\Program Files (x86)\Arduino\libraries\SegmentsIndicator/SegmentsIndicator.h:1: error: stray '\277' in program In file included from Indi.ino:1: C:\Program Files (x86)\Arduino\libraries\SegmentsIndicator/SegmentsIndicator.h:13:10: error: #include expects "FILENAME" or <FILENAME> C:\Program Files (x86)\Arduino\libraries\SegmentsIndicator/SegmentsIndicator.h:14: error: expected unqualified-id before '<' token
Антон 25 сентября 2015 - 17:30
Доброго времени суток! Ошибка где-то есть, но не там, где указал Сергей. Мне удалось запустить скеч после инвертирования битовых значений и параметров HIGH/LOW для работы с общим анодом, НО, к сожалению, вывод цифр по разрядам некорректный. \   Значение displayVal(-22, 1) возвращает 2 2 2 2, то же самое, что и -222. Куда копать?    
Pavelk 26 сентября 2015 - 0:43

Вы с гитхаба скачивали?

 

Add Comment