Большие цифры для дисплея LCD1602 (2004)
- Войдите на сайт для отправки комментариев
Пнд, 11/09/2017 - 18:15
Решил немного помочь начинающим :)
Написал библиотеку отрисовки больших цифр на дисплее LCD1602 (2004). Когда то видел такой способ отображения в буржуйской книжке по Arduino, код не запомнил и за выходные накидал свою версию.
Библиотеку с примером можно скачать по ссылке
https://github.com/roman2712/LCD1602_bigNumbers_Arduino
К особенностям библиотеки относяться:
1) используются только 3 знакоместа из 8 (0 - 2), остальные доступны пользователю.
2) минимальный обьем используемой памяти
3) простоя работа с библиотекой (Все сводиться к методу printNumber(<цифра>, <позиция в строке>, <номер строки>))
Интересны замечания и предложения от сообщества.
Пример (картинка не моя):

у меня поплотнее есть, время на полэкрана, а не на весь. Долго мучался ;)... поищу... возможно завтра найду. Использую все пользовательские.
.... О! Нашел. Что-то тестовое от старых лет... сорри - не комментировано. Кому интересно разберется. Это была заготовка для чего-то с часами и термометром... уже не помню, для чего.
#include <LiquidCrystal_I2C.h> #define LCD_ADDR 0x27 LiquidCrystal_I2C lcd(LCD_ADDR,16,2); byte BC[8][8] = { { 0B11111, 0B11111, 0B11011, 0B11011, 0B11011, 0B11011, 0B11111, 0B11111 }, { 0B11000, 0B11000, 0B11000, 0B11000, 0B11000, 0B11000, 0B11111, 0B11111 }, { 0B11111, 0B11111, 0B11011, 0B11011, 0B11011, 0B11011, 0B11011, 0B11011 }, { 0B00011, 0B00011, 0B00011, 0B00011, 0B00011, 0B00011, 0B11111, 0B11111 }, { 0B11111, 0B11111, 0B11000, 0B11000, 0B11000, 0B11000, 0B11111, 0B11111 }, { 0B11111, 0B11111, 0B00011, 0B00011, 0B00011, 0B00011, 0B11111, 0B11111 }, { 0B00011, 0B00011, 0B00011, 0B00011, 0B00011, 0B00011, 0B00011, 0B00011 }, { 0B11011, 0B11011, 0B11011, 0B11011, 0B11011, 0B11011, 0B11111, 0B11111 } }; char BD1 [10] = {2,6,5,5,7,4,1,2,0,0}; char BD2 [10] = {7,6,1,3,6,3,7,6,7,3}; uint32_t sm; void setup() { lcd.init(); lcd.backlight(); for (int i=0;i<8;i++) lcd.createChar(i,BC[i]); lcd.setCursor(11,0); for (char i=0;i<4;i++) lcd.print(i); lcd.setCursor(11,1); for (char i=4;i<8;i++) lcd.print(i); lcd.setCursor(0,0); lcd.print(__TIME__); char tt[9]; memcpy(tt,__TIME__,9); tt[2]=0;tt[5]=0; byte h = atoi(tt); byte m = atoi(tt+3); byte s = atoi(tt+6); sm = 1000UL*(s + m*60UL + h*3600UL); lcd.setCursor(0,1); lcd.print(h); lcd.print('-'); lcd.print(m); lcd.print('-'); lcd.print(s); } void loop() { static uint8_t j=0; static uint8_t f=0; static uint32_t om = millis(); uint32_t nm = millis(); if (nm - om > 999) { om = nm; byte h = (sm+nm)/3600000UL; byte m = (sm+nm - h*3600000UL)/60000; byte s = (sm+nm - h*3600000UL-m*60000UL)/1000; byte h1 = h/10; byte h2 = h%10; byte m1 = m/10; byte m2 = m%10; byte s1 = s/10; byte s2 = s%10; lcd.setCursor(0,0); lcd.print(BD1[h1]); lcd.print(BD1[h2]); lcd.print((char)0xa5); lcd.print(BD1[m1]); lcd.print(BD1[m2]); lcd.print((char)(s1+'0')); lcd.print((char)(s2+'0')); lcd.setCursor(0,1); lcd.print(BD2[h1]); lcd.print(BD2[h2]); lcd.print((char)0xa5); lcd.print(BD2[m1]); lcd.print(BD2[m2]); lcd.setCursor(7,0); lcd.print(" Al "); lcd.print("+03.4"); lcd.setCursor(5,1); lcd.print(" 2802 "); lcd.print("+23.7"); } }вот... собрал и экран сфотографировал... может и правда кому пригодится.
Бегущая строка из больших цифр:
http://arduino.ru/forum/programmirovanie/etyud-2-stroki-po-40-simvolov-n...
Переделал первую библиотеку под
дисплей I2C.
Если кому надо пишите.
Под I2C не работала старая
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3F, 16, 2); uint8_t period = 7; // длительность периода const char number[10][2][5] = { "\1\2\1 ", "\1\3\1 ", "\2\1 ", "\3\1\3 ", "\2\4\1 ", "\1\5\3 ", "\2\4\1 ", "\3\5\1 ", "\1 \1 ", "\2\2\1 ", "\1\4\2 ", "\3\5\1 ", "\1\4\2 ", "\1\5\1 ", "\2\4\1 ", " \1 ", "\1\4\1 ", "\1\5\1 ", "\1\4\1 ", "\3\5\1 " }; // ---------------------------------------------------------------------------- // Инициализация LCD_1602 void setup_LCD() { uint8_t pillar[8] = { 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F, 0x1F }; uint8_t upper1[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00 }; uint8_t lower1[8] = { 0x00, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }; uint8_t upper2[8] = { 0x1F, 0x1F, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F }; uint8_t lower2[8] = { 0x1F, 0x00, 0x00, 0x00, 0x00, 0x1F, 0x1F, 0x1F }; lcd.begin(); // серем в lcd_1602 // lcd.noCursor(); // без курсора // lcd.backlight(); // с подсветкой lcd.clear(); // на чистое lcd.createChar(1, pillar); lcd.createChar(2, upper1); lcd.createChar(3, lower1); lcd.createChar(4, upper2); lcd.createChar(5, lower2); return; } void redraw_LCD() { static uint32_t cur_period = 0; uint32_t now_period = (int)(millis() / (1000 * period)); // вычисляем период // засечь смену периода if (cur_period != now_period) { cur_period = now_period; redraw_flag = true; } // если период 0-й, показать погоду в доме // если 1-й или 2-й, то время в доме if (redraw_flag == true) { if (now_period % 3 == 0) { show_Climate(); } else { show_Clock(); } redraw_flag = false; } return; } // ---------------------------------------------------------------------------- // Отображение влажности и температуры void show_Climate() { lcd.setCursor(0, 0); lcd.printf(F("Hum ...... %02d %% "), humidity); #ifdef DEBUG Serial.printf(F("Hum ...... %02d %% \r\n"), humidity); //-- #endif lcd.setCursor(0, 1); lcd.printf(F("Temp ..... %02d C "), temperature); #ifdef DEBUG Serial.printf(F("Temp ..... %02d C \r\n"), temperature); //-- #endif return; } // ---------------------------------------------------------------------------- // Отображение часов void show_Clock() { numprint(hours / 10, 0); numprint(hours % 10, 4); numprint(minutes / 10, 9); numprint(minutes % 10, 13); lcd.setCursor(7, 0); lcd.printf("<>"); lcd.setCursor(7, 1); lcd.printf("<>"); #ifdef DEBUG Serial.printf(F("%02d:%02d\r\n"), hours, minutes); //-- #endif return; } void numprint(byte num, byte poz) { lcd.setCursor(poz, 0); lcd.printf(number[num][0]); lcd.setCursor(poz, 1); lcd.printf(number[num][1]); return; }Не, там вообще либа козырная, мало весит памяти не ест, символы оставляет.
Только править надо для работы с i2c
Сколько пользовательских символов использовал ?
восемь
восемь
А тут всего 3
восемь
А, разве тут соревнование в количестве символов ?
Тогда можно соревноваться и в количестве знакомест на цифру... у меня на одно меньше :-)
Можете написать скетч для Arduino NANO+LCD1602+DS18B20, что бы слева бал тахометр на 4 цифры(2 импульса на один оборот) а справа как у вас два термометра для показания температуры охлождающей жидкости(с округлением до двух знаков) в авто. Термометры с подключением на разные пины. В программировании я не гуд. Собрать и воплотить в жизнь авто могу.
Напишу на возмездной основе. По вопросам: хххххххх
Модератор: Вас уже вроде предупреждали! Все коммерческие предложения, в ветке "Ищу исполнителя".
дисплей I2C.
Если кому надо пишите.
Если можно мне скинь.
На деревню дедушке письмо писать ?
romanspotar@mail.ru
Можно мне тоже библиотеку?
apocrifa@yandex.ru
А что не выложите на github или просто какой-нибудь файлообменник?
Я не автор библиотеки(и не гивер, который плевал на авторские права и все выдает за свое) , чтоб ее выкладывать. Просто интерфейс под свой модуль поправил.
Ну вот мой код большими буквами и цифрами #198
Ну вот мой код большими буквами и цифрами #198
Похвально конечно, но это не совсем библиотека и совместно с LiquidCristal.h работать , вряд ли будет.
Ну а почему тогда не закоммитить в github автора?
Код примера для обновленной библиотеки
#include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); #include "bigNumbers.h" bigNumbers bigNumbers(&lcd); void setup() { lcd.init(); lcd.clear(); bigNumbers.intNumbers(); } void loop() { bigNumbers.printNumber(0, 0); bigNumbers.printNumber(1, 4); bigNumbers.printNumber(2, 8); bigNumbers.printNumber(3, 12); delay(1000); bigNumbers.printNumber(4, 0); bigNumbers.printNumber(5, 4); bigNumbers.printNumber(6, 8); bigNumbers.printNumber(7, 12); delay(1000); bigNumbers.printNumber(10, 0); bigNumbers.printNumber(8, 4); bigNumbers.printNumber(9, 8); bigNumbers.printNumber(10, 12); delay(1000); }Ух ты))) я же эту библу написал))) интересно, её скока народу скачало)))
I2C добавлю в ближайшее время. Я думаю еще стоит добавить поддержку библиотеки экрана с русскими шрифтами.
Там из всех добавления тока переопрнделить в .h файле используем версию библиотеки экрана.
Жду с нетерпением , я только начал изучать Ардуино , и как происходит в скетче сложение из символов в единую картинку для меня китайская грамота , а библиотек кроме этой я не смог найти
I2C добавлю в ближайшее время. Я думаю еще стоит добавить поддержку библиотеки экрана с русскими шрифтами.
Там из всех добавления тока переопрнделить в .h файле используем версию библиотеки экрана.
Ничего там для русских шрифтов изменять не надо. Вроде корректно работает с LCD_1602_RUS.h
И да, все изменения заключаются в изменении конструктора объекта.
Как вариант сделать два конструктора и для обычного подключения и для I2C
Не, ну если красиво выглядит - что не качнуть.
Я сейчас на сверлилку делаю тахометр. Пока жду 7-сегментные дисплеи от нефиг делать цепляю к скетчу те экраны, какие есть в наличии. 4 здоровых цифири на увеличенном 16*2 экране смотрятся феерично.
Итак. Добавил поддержку дисплеев, подключенных по i2с
Смотрим :) https://github.com/roman2712/LCD1602_bigNumbers_Arduino/tree/master/bigNumbers
P.S. Если точнее, то через шаблонную магию с++ (template) реализовал шаблонный класс, что позволяет указать любую библиотеку, аналогичную по функциям библиотеке LiquidCrystal.
Итак. Добавил поддержку дисплеев, подключенных по i2с
Спасибо, попробую.
Итак. Добавил поддержку дисплеев, подключенных по i2с
Работает. Огромное спасибо!
Обнаружил интересную особеность при работе с моим скетчем.
Плата Arduino Pro MIni клон
При первой загрузке цифры отображаются нормально. Перезапуск платы резетом ничего не меняет, скетч работает. Но стоит снять питание с платы и заново включить, в цифрах появляется мусор.
Пример из библиотеки работает нормально. Как думаете, в чем может быть косяк?
Ну нельзя же так подставляться. Вот и я заметил такую особенность. Как только я пострал в унитаз, обнаружил что там говно плавает. Видно канализация плохо работает. Я бачек не смываю, так как это увеличивает расход воды.
В вашем случае контролер дисплея отключается раньше чем МК.
С большой долей вероятности когда вы питание обратно включаете, МК все еще продолжает работать по программе, но так как дисплей надо уже инициировать заново, а этого никто не сделал, так как МК работает по программе идет и в setup не заходит, то появляется мусор на дисплее. Для этих дисплеев это нормальная ситуация.
Подтверждается перезагрузкой по ресету, когда мусор на экране. Если после ресета все хорошо - то значит надо что то решать с питанием. к примеру Brown-Out Detection настроить на 4.3 в. При такой настройке, МК уже точно вырубиться по BOD, а дисплей еще не сброситься.
Я не успел отписаться. В setup пропустил генерацию пользовательских символов. Теперь все нормально
Здравствуйте roman2712@mai ,у меня к вам огромная просьба,я новичок в программировании,подскажите пожалуйста ,этот код счётчика с вашей библиотекой,работает отлично,но он написан под экран 1602.Что нужно дописать что бы его можно было вывести на экран 2004 на две нижние строчки.Помогите пожалуйста.
//Счётчик
//Питание безконтактного концевого от 12 вольт,сигнальный провод заводим на Пин 6 или 13 //Остановка и сброс по нажатию кнопки подключеной на Пин А5 #include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x3f, 16, 2); #define BUTTON_PIN 6 #define SWITCH_PIN 13 #include <bigNumbers.h> bigNumbers <LiquidCrystal_I2C> bigNumbersLcd(&lcd); void printVar(unsigned int n); void setup() { pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(SWITCH_PIN, INPUT_PULLUP); lcd.init(); lcd.setBacklight(255); bigNumbersLcd.intNumbers(); } uint8_t prior_switch = HIGH; uint8_t prior_button = HIGH; uint8_t update_lcd = true; uint32_t counter = 0; void loop() { uint8_t _switch = digitalRead(SWITCH_PIN); if ((_switch == LOW) && (prior_switch == HIGH)) { counter++; update_lcd = true; } prior_switch = _switch; uint8_t button = digitalRead(BUTTON_PIN); if ((button == LOW) && (prior_button == HIGH)) { counter = 0; update_lcd = true; } prior_button = button; if (update_lcd) { update_lcd = false; printVar(counter); } } void printVar(unsigned int n) { if (n >= 10000) { bigNumbersLcd.printNumber(9, 0); bigNumbersLcd.printNumber(9, 4); bigNumbersLcd.printNumber(9, 8); bigNumbersLcd.printNumber(9, 12); } else if (n >= 1000) { bigNumbersLcd.printNumber((n / 1000), 0); bigNumbersLcd.printNumber(((n / 100) % 10), 4); bigNumbersLcd.printNumber(((n / 10) % 10), 8); bigNumbersLcd.printNumber((n % 10), 12); } else if (n >= 100) { bigNumbersLcd.printNumber(10, 0); bigNumbersLcd.printNumber((n / 100), 4); bigNumbersLcd.printNumber(((n / 10) % 10), 8); bigNumbersLcd.printNumber((n % 10), 12); } else if (n >= 10) { bigNumbersLcd.printNumber(10, 0); bigNumbersLcd.printNumber(10, 4); bigNumbersLcd.printNumber((n / 10), 8); bigNumbersLcd.printNumber((n % 10), 12); } else /* n < 10 */ { bigNumbersLcd.printNumber(10, 0); bigNumbersLcd.printNumber(10, 4); bigNumbersLcd.printNumber(10, 8); bigNumbersLcd.printNumber(n, 12); } }5-я строка:
LiquidCrystal_I2C lcd(0x3f, 20, 4);
А дальше попробуйте выводить цифры в виде (значение, позиция Х, позиция У)
Тоесть :
bigNumbersLcd.printNumber(n, 12, 1);
Это если я правильно понимаю.
Правильно понимаете...
Здравствуйте,сижу пробую.
Правильно понимаете...
А библиотека оперирует только 2 строками или можно цифры вывести в центре экрана?
Библиотека оперирует номером знакоместа и номером строки.
т.е. если указать к примеру bigNumbersLcd.printNumber(5, 8, 1)
то это значит напечатать цифру 5. верхний угол которой будет располагаться на 8 знакоместе 1 строки.
т.е. для 4-х строчного дисплея это будет как раз в середине экрана, так как строки у 4-х строчного дисплея нумеруются 0,1,2,3.
Кто может помочь выводить время на 2004 с помощью rtc ds3231 ?
Как делить время на 4 числа ?
Я использовал остаток от деления
Ему ещё и «выводить» нужно помочь, готовь код... ))
Решил немного помочь начинающим :)
Написал библиотеку отрисовки больших цифр на дисплее LCD1602 (2004). Когда то видел такой способ отображения в буржуйской книжке по Arduino, код не запомнил и за выходные накидал свою версию.
Библиотеку с примером можно скачать по ссылке
https://github.com/roman2712/LCD1602_bigNumbers_Arduino
К особенностям библиотеки относяться:
1) используются только 3 знакоместа из 8 (0 - 2), остальные доступны пользователю.
2) минимальный обьем используемой памяти
3) простоя работа с библиотекой (Все сводиться к методу printNumber(<цифра>, <позиция в строке>, <номер строки>))
Интересны замечания и предложения от сообщества.
Пример (картинка не моя):
Моё почтение!
Подскажите пример, как использовать вашу библиотеку в счетчике приращения/убывания, скажем от 0 до 200, с использованием энкодера?
С уважением, Александр.