ОБНОВЛЕНО 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 комментариев
Здравствуйте
У меня все работает, библиотекой доволен
Хотел бы узнать как можно выводить символы
К примеру:
54*С
Я использую сдвиговой регистр. Так даже библиотеки не нужны.
shiftOut()
Подскажите пожалуйста, а как бы вывести данные с dht11 на 7-сегментный индикатор с применением вашей библиотеки.
А в чём проблема то?
Спасибо! Заработало на IDE 1.6.5.!
Не компилируется. 🙁
Пишет ошибку exit status 1
Использую IDE 1.6.8 Win7 x64
Arduino nano Atmega328
Подскажите, как определить очередность ножек у индикатора ?
По дата-шиту, иначе придётся с помощью батарейки искать нужные выводы.
Доброго дня, адаптирую под экран с анодом. работает все кроме точки (на её месте маска обнуляется и ничего не выводит)
что значит тут цифра 11?
if (dig==dot) { //— Есть точка в этом разряде добавим её маску к маске цифры
pp = 11 * PORTS_COUNT;
portb |= displayDigitsMasks[pp + 0]; …
пробовал заменить на 11 символ в массиве (0b01111111), не оно)
«11» это и есть впринципе индекс точки из массива символов (digits).
Сейчас под рукой, к сожалению, с общим анодом нет, что бы проверить.
Как временное решение, попробуйте
portb |= ~displayDigitsMasks[pp + 0];
portc |= ~displayDigitsMasks[pp + 1];
portd |= ~displayDigitsMasks[pp + 2];
И по-моему лучше инвертировать не маски символов, а именно создание масок в Init()
Если у вас есть время и возможности я бы попробовал дописать код, что бы была возможность использовать и с общим анодом и с общим катодом, а вы бы протестировали.
Скачал с гитхаба, собрал схемку, показывает упорно 3 символа с наложением, при большой задержке видно. Не выводит 1-ый символ. Буду ковырять. Если есть мысли, накидывайте. А за саму задумку огромное спасибо.
UPD. Ура! Заработало!
Вывод: то что на гитхабе от 27 июля не для ОА ни для ОК :))
Или крестик снимите или штаны наденьте 🙂
Убрал инверсию разрядов, всё пашет с ОК.
Ещё раз респект автору.
Всё, допёр до конца, у меня катоды подключены через npn транзистор вот вам и инвертор, так что всё правильно.
Спасибо за комментарии, я уж подумал не ту версию выложил =)
Здравствуйте! Тоже столкнулся с проблемой библиотек.. Не нашёл заточенную под ардуино. Программирует народ в основном на ассемблере, но вникать в структуру, да и вообще заморачиваться только с выводом информации на дисплей индикатора считаю слишком нерационально, на дворе уже 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
Доброго времени суток! Ошибка где-то есть, но не там, где указал Сергей. Мне удалось запустить скеч после инвертирования битовых значений и параметров HIGH/LOW для работы с общим анодом, НО, к сожалению, вывод цифр по разрядам некорректный. \
Значение displayVal(-22, 1) возвращает 2 2 2 2, то же самое, что и -222. Куда копать?
Вы с гитхаба скачивали?