LCD 1602 и русские символы
- Войдите на сайт для отправки комментариев
Пт, 25/11/2011 - 19:46
добрый день,
имеется LCD экран LCM1602C и Arduino Uno
хотелось бы, чтобы выводилась кириллица, но ничего не выходит
я скаивал соответсвующую библиотеку LiquidCrystalRus, но на экране всё равно русские символы не отображаются
lcd.print("\243K \343\270c\276\273e\271");
этот код тоже не помогает
вопросы:
1 - может ли быть, что экран не поддерживает вывод кириллицы с LiquidCrystalRus или это исключено и я что-то не так делаю?
2 - как можно управлять пикселами экрана напрямую я бы завел свой алфавит и символы?
может эта статья Вам поможет http://robocraft.ru/blog/arduino/503.html
1. Скорее всего так и есть. Приобретал на ebay 4 экрана в разное время. Там в-принципе нет кириллицы.
2. Восемь символов без проблем создать через .createChar. Больше не знаю как.
2. Восемь символов без проблем создать через .createChar. Больше не знаю как.
Там ведь всего-то 32 символа выводится.
Поэтому:
1. Отказаться от нижнего регистра (или от верхнего - дело вкуса).
2. Все русские буквы, имеющиеся в латинском алфавите, отображать латиницей (в верхнем регистре их поболе наберется).
3. Оптимизировать русские фразы так, чтобы в них встречалось как можно меньше кирилличных символов,
не имеющих соответствия в латинице.
4. Генерацию пресловутых 8 символов производить не в начале программы, а перед каждой сменой текстовой информации на дисплее.
5. Извращения ради: создать структурку, в которой будет храниться информация о сгенерированных в данный момент символах и по мере надобности переопределять не все 8 символов, а 1-2-3 новых, которые потребуются при следующем выводе, соответственно затирая информацию об 1-2-3 самых ненужных символах. Какие самые ненужные? Тут вам или таблица частот использования кирилличных букв в помощь (например, http://www.statsoft.ru/home/portal/exchange/textanalysis.htm), или анализ частотный анализ строк, используемых непосредственно в программе.
Шикарно! Век живи - век учись!
...
2. Все русские буквы, имеющиеся в латинском алфавите, отображать латиницей (в верхнем регистре их поболе наберется).
3. Оптимизировать русские фразы так, чтобы в них встречалось как можно меньше кирилличных символов,
не имеющих соответствия в латинице.
4. Генерацию пресловутых 8 символов производить не в начале программы, а перед каждой сменой текстовой информации на дисплее.
...
Отличная мысль. Подъытожив пришел к выводу что можно выводить русские буквы на дисплей в знакогенераторе которого вообще нет руских символов, но с одним ограничением - Формировать фразы на экране так, чтобы одновременно не выводить больше восьми "чисто русских" символов, таких как Й, Ц, У, Г, Ш, Щ, З, Ъ, Ф, Ы и т.д., а остальные брать из английской раскладки
Если поэмы на экран не выводить то это ограничение вовсе не ограничение, хотя это больше применимо к LCD2004.
Для наглядности прилагаю пример (кусок программы для аппарата по продаже и наливу воды), в котором уже есть почти все "чисто русские" символы в верхнем регистре
Русификация для дисплеев LCD 1602 с шиной I2C:
https://github.com/ssilver2007/LCD_1602_RUS
Для обычных дисплеев:
https://github.com/ssilver2007/LiquidCrystal_1602_RUS
Для обычных дисплеев:
https://github.com/ssilver2007/LiquidCrystal_1602_RUS
Господа! Помогите чайнику разобраться.
Пытаюсь заставить дисплей 16/2 печатать русскими буквами.
Скачал 4 разные библиотеки, но при попытке компиляции примеров из этих библиотек выскакивают ошибки, суть которых я не могу понять, а при запуске библиотеки из вышеуказанной ссылки вылетает ещё и ошибка винды (ld.exe обнаружена ошибка. Приложение будет закрыто...)
На других скетчах вылезает вот это:
Arduino: 1.6.7 (Windows XP), Плата:"Arduino/Genuino Uno"
In file included from C:\Documents and Settings\Серёга\Мои документы\Arduino\libraries\LiquidCrystalRus\examples\HelloWorldRus\HelloWorldRus.pde:39:0:
C:\Documents and Settings\Серёга\Мои документы\Arduino\libraries\LiquidCrystalRus/LiquidCrystalRus.h:87:16: error: conflicting return type specified for 'virtual void LiquidCrystalRus::write(uint8_t)'
virtual void write(uint8_t);
^
In file included from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Stream.h:26:0,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/HardwareSerial.h:29,
from C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Arduino.h:224,
from sketch\HelloWorldRus.pde.cpp:1:
C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino/Print.h:48:20: error: overriding 'virtual size_t Print::write(uint8_t)'
virtual size_t write(uint8_t) = 0;
^
exit status 1
Ошибка компиляции.
Это сообщение будет содержать больше информации чем
"Отображать вывод во время компиляции"
включено в Файл > Настройки
Не пойму в чём моя ошибка. Помогите.
Господа! Помогите чайнику разобраться.
Пытаюсь заставить дисплей 16/2 печатать русскими буквами.
Скачал 4 разные библиотеки...>
В дисплеях МЭЛТ гарантированно есть все русские буквы. Чтобы не кувыркаться с библиотеками, я просто вывожу русский текст как коды символов, взятые из символьной таблицы дисплея. Вывод кириллицы в китайских дисплеях, где ее нет, за счет разных хитроумных "приемчиков" - ИМХО чисто спорт.
А как узнать есть ли именно в моём дисплее кирилица?
Из всех опознавательных знаков на нём есть только надписи: "1602А" и "QAPASS".
Где можно глянуть символьную таблицу дисплея? Как вводить в скетч коды символов?
А как узнать есть ли именно в моём дисплее кирилица?
Запросите продавца. Пусть пришлет таблицу символов. Я с китайцами по этому вопросу переписывался, найти у них дисплеи с кириллицей мне не удалось.
Пример того, как я работал с дисплеем, можно найти в "Саге о кнопках". Там в приложениях есть схема, скетч и даже фотка экрана с русскими буквами.
https://github.com/ssilver2007/LCD_1602_RUS
Для обычных дисплеев:
https://github.com/ssilver2007/LiquidCrystal_1602_RUS
Собрался я исполнить оду "К радости" в честь Ssilver2007, но, к сожалению, не покатила библиотека "для дисплеев LCD 1602 с шиной I2C" :(((
Компилятор отказывается компилировать русские буквы в тексте:
"HelloWorld:11: error: converting to execution character set: Illegal byte sequence"
Библиотека LCD_1602_RUS.h подключена в установленом порядке.
С ихими буквами работает.
Может, есть какой маленький изврат для победы над компилятором?
Как то так :(((
Если поэмы на экран не выводить то это ограничение вовсе не ограничение, хотя это больше применимо к LCD2004.
Для наглядности прилагаю пример (кусок программы для аппарата по продаже и наливу воды), в котором уже есть почти все "чисто русские" символы в верхнем регистре
...skip...
Я думал, таким извратом не придется заниматься в XXI веке :(
ОНО мне константы Холлерита напоминает в ранних версиях Фортрана...
Но ведь работает!!!
Respect Ssvs111 и предшественникам.
А как узнать есть ли именно в моём дисплее кирилица?
Из всех опознавательных знаков на нём есть только надписи: "1602А" и "QAPASS".
Где можно глянуть символьную таблицу дисплея? Как вводить в скетч коды символов?
Как-как, выводите всю таблицу , и смотрите что там.
Ценник у них только выше в 5 и более раз, судя по сайту производителя. :(
Ценник у них только выше в 5 и более раз, судя по сайту производителя. :(
Как-как, выводите всю таблицу , и смотрите что там.
Спасибо! Коротко и доходчиво.
Жаль только, что дисплей у меня оказался без кирилицы :(
Какая у вас версия IDE? В версии 1.6.6 и 1.6.7 все компилится без проблем.
https://github.com/ssilver2007/LCD_1602_RUS
Для обычных дисплеев:
https://github.com/ssilver2007/LiquidCrystal_1602_RUS
Собрался я исполнить оду "К радости" в честь Ssilver2007, но, к сожалению, не покатила библиотека "для дисплеев LCD 1602 с шиной I2C" :(((
Компилятор отказывается компилировать русские буквы в тексте:
"HelloWorld:11: error: converting to execution character set: Illegal byte sequence"
Библиотека LCD_1602_RUS.h подключена в установленом порядке.
С ихими буквами работает.
Может, есть какой маленький изврат для победы над компилятором?
Как то так :(((
Еще есть известный уже глюк IDE, при котором макрос L неверно работает при изменении скетча. То есть надо изменить пример, сохранить с новым именем или в новое место. После этого все прекрасно компилится.
"Урррра! Заработало!!!" (С)
Alleluia! Alleluia! Alleluia!
Спасибо, уважаемый Ssilver2007!
PS. ver 1.6.7
Alleluia! Alleluia! Alleluia!
Спасибо, уважаемый Ssilver2007!
PS. ver 1.6.7
Дед Морозов не бывает :(
Добрых волшебников тоже...
Те же грабли, но только в профиль...
Мораль: Не говори "Гоп!", когда прыгнул. Сначала погляди, куда ты попал...
В описании библиотеки же написано, что для экранов без вшитой кириллицы есть существенное ограничение в железе. А именно - возможно использовать только 8 пользовательских символа, выводимых на экран одновременно. Тут два пути - либо искать и использовать экраны с кириллицей (такие есть, но их цена примерно в 5 раз выше, чем у некириллических), либо оптимизировать выводимые сообщения.
Библиотека дает возможность использовать вместо кириллических символов некоторые латинские, похожие по начертанию. Остальные (такие как Ж ж И и Ф Ф и т.п.) должны появлятся на экране в количестве, не превышающем 8 штук. Такое железо.
Ну кто у нас читает описания :)))
Вопрос немного другой.
В двух строках сообщения на LCD вряд-ли будет 8 разных символов на кириллице.
Может, доработать скетч или библиотеку так, чтобы при последующих выводах перегружать (или очищать?) библиотеку символов?
Время это займет пусть несколько сек, но для информационных сообщений такая "задумчивость" не сильно порведит.
Дополнил перед каждым выводом lcd.clear()
и в лупе все стало выводиться без кракозябр...
Шопотом: "Alleluia!"
В двух строках сообщения на LCD вряд-ли будет 8 разных символов на кириллице.
Может, доработать скетч или библиотеку так, чтобы при последующих выводах перегружать (или очищать?) библиотеку символов?
Время это займет пусть несколько сек, но для информационных сообщений такая "задумчивость" не сильно порведит.
Это и сделано у автора 5 поста. О секундах задумчивости и речи нет, для пользователя незаметно. Попробовал сам, все нормально работает. Правда перед выводом готовлю строку типа:
char prints[] = {'O','T','K','\3','\1','\2','E','H','\4','E','\0'}; , мне так удобнее.
Перед каждым выводом просто обновляю знакогенератор.
Вообще, это хорошая и правильная практика - очищать экран перед выводом новых 2-х строк, как это сделано у Олег М.:
lcd.clear();
lcd.setCursor(0,0);
lcd.print(L"АВТОПОЛИВАЛКА ");
lcd.setCursor(0,1);
lcd.print(L"Сенсоры в норме");
А вот что более удобно - так:
char prints[] = {'O','T','K','\3','\1','\2','E','H','\4','E','\0'};
или так:
lcd.print(L"Так же удобнее");
Тут же все очевидно! Кому-то может и левое ухо чесать правой пяткой удобнее.
Автору поста #5 Ssvs111 отдельная благодарность.
Собственно, его скетч толкнул меня в правильном направлениии.
Ураааа!!!!!
ssilver2007 братан, дай бог тебе здоровья тебе и твоим близким . всю голову сломал что да как . оказываеться это IDE выделывалась. сохранил другим файлом и заработало.
Спасибо огромное
Как-как, выводите всю таблицу , и смотрите что там.
По вашему коду у меня не отображалось несколько последних символов. Вначале я насчитал 7 обновлений экрана и у меня возникли подозрения. Погуглив таблицу и написав свой кривой код вывода, убедился что мои подозрения были не напрасны: пропускается самая последняя строка.
В общем, с моими поправками ваш код вывода всех символов выглядит так:
lcd.print(L
"На русском"
);
Большое спасибо за библиотеку.
Но мне необходимо сначала собирать строку в некоторую переменную (например, функцией sprintf) и потом выводить ее. Как мне это сделать в данном случае?
Собирайте строку в переменной типа wchar_t.
Собирайте строку в переменной типа wchar_t.
Не могли бы выложить примерчик, учитывая что мне нужно собирать строку функцией sprintf (чтобы вставлять в строку значения переменных)
sprintf не работает с типом wchar_t. Либо руками выводите пременную, либо пишите свою процедуру для обработки строки в wchar_t.
Вот пример:
Ну вот как-то так:
wchar_t *str;
// Как тут надо сформировать строку str, чтобы вывести на русском Привет
str = L"Привет";
str = L"Привет";
Ну это получается та же константа. Я просто не пойму, как динамически сформировать строку str (из набора строк, например)
напишите конкретно, что вы хотите выполнить. Что вы делаете при работе со string, и тогда можно сказать, что надо делать, заменив на wchar_t.
напишите конкретно, что вы хотите выполнить.
Есть дисплей lcd keypad shield, подключенный к arduino mega. На дисплей выводятся стадии процесса и его меняющиеся параметры (время, темпеатура, давление и т.д). Соответственно, перед выводом на экран возникает необходимость собирать строку из константного текста и переменных значений параметров. Для этого использовал функцию sprintf. Теперь хочу перейти на вывод русифицированного текста.
Как я уже говорил, sprintf не работает с wchar_t. А в библиотеках ардуино к сожалению пока нет поддержки таких функций C как swprintf. Поэтому вам придется или обходится константами для вывода текста, или написать свои функции для обработки wchar_t. Для экрана, где длина строки ограничена 20 символами не должно быть проблемы использовать констатны строк (с точки зрения занимаемой ими памяти).
Такая последовательность для вывода параметра и его значения чем хуже, чем вывод всего в одной строке?
Такая последовательность для вывода параметра и его значения чем хуже, чем вывод всего в одной строке?
Всмысле, насколько трудоемко доработать библиотеку?
Ну в принципе тоже вариант. Спасибо.
А нельзя ли в функцию вашей библиотеки передать строку типа char, а в библиотеке сделать преобразование к wchar_t?
Тип char - однобайтовое кодирование символа.
Тип wchar_t - двухбайтовое кодирование символа.
Строка типа char может содержать только латиницу. Информация по кириллице будет потеряна. Нет. Так сделать нельзя.
про "F" знаю, а "L" что означает?
Расширенный символ — это двухбайтовый многоязыковой код символа. Большинство символов, используемых в современных вычислительных системах по всему миру, включая технические символы и специальные знаки, используемые в издательском деле, могут быть представлены как расширенные символы (в соответствии со спецификацией Юникода). Символы, которые не могут быть представлены как один расширенный символ, могут быть представлены в Юникоде как суррогатная пара. Поскольку каждый расширенный символ может быть представлен как шестнадцатибитный, их использование упрощает программирование с использованием международных кодировок.
Строка расширенных символов представляется как массив wchar_t[] с указателем wchar_t*. Любой символ ASCII может быть представлен как расширенный символ путем добавления к нему префикса "L".
https://msdn.microsoft.com/ru-ru/library/2dax2h36.aspx
Хочу купить этот для меги256. Ценник вроде адекватный за отсутствие гемороя.
Продавец пишет, что РУССКИЙ (Кириллица) 1602.
Продавец известный, наверняка кто-то уже покупал. Поделитесь впечатлениями.
Есть ли проблемы и какие?
У RobotDyn нет дисплеев с поддержкой кириллицы.
Вывод русских букв на нем реализовать можно, но через заднее место: http://ardu.net/ru/indikatory-displei/352-lcd-keypad-shield-modul-arduin...
Вообще, мне за 4 года не удалось найти ни одного синего дисплея с кириллицей. Так что если видишь синий дисплей - 99% что там не будет русских букв.
Т.е. по вашему получается продавец пропихивает тот же дисплей , что и без кириллицы только дороже?
Вы сами его покупали? У продавца 4 разновидности 16*2. По вашему два из них висят до первого отрицательного отзыва? Компания уж больно качественные вещи делает чтобы за очевидный обман заморачиваться. Вам так не кажется?
Связался с продавцом, посмотрим, что ответит.
Позвонил в москву (http://robotdyn.ru/) сказали, что полная аппаратная поддержка всего алфавите.
Можно даже у нас со склада (Екатеринбуерг) покупать. Правда сейчас их в России нет, только в Китае.
Так-что попробую заказать. Посмотрим, что придет.
Сегодня получил от китайцев (реально быстрая доставка, 16 дней в Екатеринбург. Обычно 20)
РУССКИЙ (Кириллица) ЖК клавиатура Щит, 1602 дисплей, для Arduino ЖК-Экран ЗЕЛЕНЫЙ ЭКРАН
Так вот, Кирилица в нем, как я себе это понимаю, прошита.
Код от dimax выводит весь русский алфавит, большие и маленькие буквы.
lcd.print(
"\243K \343\270c\276\273e\271"
); выводит "ЖК дисплей" в примере
hello world!стандартной библиотеки
LiquidCrystal.Еще рабочий вариант вывода
// пример на русском «привет мир»
hd44_word ("ѕpёіeї јёp");
Просто так написать
lcd.print(
"привет"
) - не работает.
Если кто знает куда тыкнуться с преобразованием, сделайте одолжение, черкните пару слов или ссылочку...
Короче! долго мучился, заказал год назад такой же дисплей как в посте serge73
Качайте! http://labkit.ru/html/profit?id=393
А для lcd2004 LCD_1602_RUS.h подойдет?
подойдет. Но все равно надо помнить про 8 уникальных кириллических переопределяемых символа. 80-символьную (20x4) строку на русском вряд ли получтся использовать.