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

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

by Pavelk
Published: Last Updated on Восьмисегментный индикатор 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, для остальных необходимо будем изменить порты и правильно указать диапазоны (в коде в комментах есть пояснение).

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

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

Maxai 24 января 2017 - 10:50

Здравствуйте
У меня все работает, библиотекой доволен
Хотел бы узнать как можно выводить символы
К примеру:
54*С

Reply
Максим Белов 2 января 2017 - 11:00

Я использую сдвиговой регистр. Так даже библиотеки не нужны.

shiftOut()

Reply
Анатолий 20 мая 2016 - 19:44

Подскажите пожалуйста, а как бы вывести данные с dht11 на 7-сегментный индикатор с применением вашей библиотеки.

Reply
Pavelk 21 мая 2016 - 2:00

А в чём проблема то?

Reply
Владимир 20 апреля 2016 - 16:00

Спасибо! Заработало на IDE 1.6.5.!

Reply
Владимр 20 апреля 2016 - 15:03

Не компилируется. 🙁
Пишет ошибку exit status 1
Использую IDE 1.6.8 Win7 x64
Arduino nano Atmega328

Reply
Виталий 28 января 2016 - 17:42

Подскажите, как определить очередность ножек у индикатора ?

Reply
Pavelk 3 февраля 2016 - 2:19

По дата-шиту, иначе придётся с помощью батарейки искать нужные выводы.

Reply
Дима 22 октября 2015 - 18:47

Доброго дня, адаптирую под экран с анодом. работает все кроме точки (на её месте маска обнуляется и ничего не выводит)
что значит тут цифра 11?

if (dig==dot) { //— Есть точка в этом разряде добавим её маску к маске цифры
            pp = 11 * PORTS_COUNT;
            portb |= displayDigitsMasks[pp + 0]; …
          

пробовал заменить на 11 символ в массиве (0b01111111), не оно)

Reply
Pavelk 23 октября 2015 - 1:14

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

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

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

portb |= ~displayDigitsMasks[pp + 0]; 

portc |= ~displayDigitsMasks[pp + 1];

 

portd |= ~displayDigitsMasks[pp + 2];

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

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

Reply
kurdun 20 октября 2015 - 2:45

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

Reply
kurdun 20 октября 2015 - 6:54

UPD. Ура! Заработало!
Вывод: то что на гитхабе от 27 июля не для ОА ни для ОК :))
Или крестик снимите или штаны наденьте 🙂
Убрал инверсию разрядов, всё пашет с ОК.
Ещё раз респект автору.

Reply
kurdun 20 октября 2015 - 7:01

Всё, допёр до конца, у меня катоды подключены через npn транзистор вот вам и инвертор, так что всё правильно.

Reply
Pavelk 23 октября 2015 - 1:15

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

Reply
Сергей 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

Reply
Антон 25 сентября 2015 - 17:30

Доброго времени суток! Ошибка где-то есть, но не там, где указал Сергей. Мне удалось запустить скеч после инвертирования битовых значений и параметров HIGH/LOW для работы с общим анодом, НО, к сожалению, вывод цифр по разрядам некорректный. \
 
Значение displayVal(-22, 1) возвращает 2 2 2 2, то же самое, что и -222. Куда копать?
 
 

Reply
Pavelk 26 сентября 2015 - 0:43

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

 

Reply

Leave a Comment

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.

You may also like