ОБНОВЛЕНО 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 комментариев
"11" это и есть впринципе индекс точки из массива символов (digits).
Сейчас под рукой, к сожалению, с общим анодом нет, что бы проверить.
Как временное решение, попробуйте
portb |= ~displayDigitsMasks[pp + 0];
portc |= ~displayDigitsMasks[pp + 1];
portd |= ~displayDigitsMasks[pp + 2];
И по-моему лучше инвертировать не маски символов, а именно создание масок в Init()
Если у вас есть время и возможности я бы попробовал дописать код, что бы была возможность использовать и с общим анодом и с общим катодом, а вы бы протестировали.
Спасибо за комментарии, я уж подумал не ту версию выложил =)
Вы с гитхаба скачивали?