LCD 1602 и русские символы

slutsker
Offline
Зарегистрирован: 03.10.2011

добрый день,

имеется LCD экран LCM1602C и Arduino Uno

хотелось бы, чтобы выводилась кириллица, но ничего не выходит

я скаивал соответсвующую библиотеку LiquidCrystalRus, но на экране всё равно русские символы не отображаются 

lcd.print("\243K \343\270c\276\273e\271");

этот код тоже не помогает

вопросы:
1 - может ли быть, что экран не поддерживает вывод кириллицы с LiquidCrystalRus или это исключено и я что-то не так делаю?
2 - как можно управлять пикселами экрана напрямую я бы завел свой алфавит и символы?

 

 

76region
Offline
Зарегистрирован: 08.07.2011

может эта статья Вам поможет http://robocraft.ru/blog/arduino/503.html

Embosser
Offline
Зарегистрирован: 06.09.2011

 1. Скорее всего так и есть. Приобретал на ebay 4 экрана в разное время. Там в-принципе нет кириллицы.

2. Восемь символов без проблем создать через .createChar. Больше не знаю как.

step962
Offline
Зарегистрирован: 23.05.2011

Embosser пишет:

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), или анализ частотный анализ строк, используемых непосредственно в программе.

Embosser
Offline
Зарегистрирован: 06.09.2011

 Шикарно! Век живи - век учись!

ssvs111
ssvs111 аватар
Offline
Зарегистрирован: 11.07.2014

step962 пишет:

...

2. Все русские буквы, имеющиеся в латинском алфавите, отображать латиницей (в верхнем регистре их поболе наберется).

3. Оптимизировать русские фразы так, чтобы в них встречалось как можно меньше кирилличных символов,

не имеющих соответствия в латинице.

4. Генерацию пресловутых 8 символов производить не в начале программы, а перед каждой сменой текстовой информации на дисплее.

...

Отличная мысль. Подъытожив пришел к выводу что можно выводить русские буквы на дисплей в знакогенераторе которого вообще нет руских символов, но с одним ограничением - Формировать фразы на экране так, чтобы одновременно не выводить больше восьми "чисто русских" символов, таких как Й, Ц, У, Г, Ш, Щ, З, Ъ, Ф, Ы и т.д., а остальные брать из английской раскладки

Если поэмы на экран не выводить то это ограничение вовсе не ограничение, хотя это больше применимо к LCD2004.

Для наглядности прилагаю пример (кусок программы для аппарата по продаже и наливу воды), в котором уже есть почти все "чисто русские" символы в верхнем регистре

#include "Wire.h"
#include "LiquidCrystal_I2C.h"

LiquidCrystal_I2C lcd(0x27, 16, 2); //адрес 0x27 дисплей 16х2

uint8_t tochki[8] = {B0, B00000, B0, B0, B0, B0, B10101};
uint8_t bukva_P[8] = {0x1F, 0x11, 0x11, 0x11, 0x11, 0x11, 0x11};
uint8_t bukva_Ya[8] = {B01111, B10001, B10001, B01111, B00101, B01001, B10001};
uint8_t bukva_L[8] = {0x3, 0x7, 0x5, 0x5, 0xD, 0x9, 0x19};
uint8_t bukva_Lm[8] = {0, 0, B01111, B00101, B00101, B10101, B01001};
uint8_t bukva_Mz[8] = {0x10, 0x10, 0x10, 0x1E, 0x11, 0x11, 0x1E};
uint8_t bukva_I[8] = {0x11, 0x13, 0x13, 0x15, 0x19, 0x19, 0x11};
uint8_t bukva_D[8] = {B01111, B00101, B00101, B01001, B10001, B11111, 0x11};
uint8_t bukva_G[8] = {B11111, B10001, B10000, B10000, B10000, B10000, B10000};
uint8_t bukva_IY[8] = {B01110, B00000, B10001, B10011, B10101, B11001, B10001};
uint8_t bukva_Z[8] = {B01110, B10001, B00001, B00010, B00001, B10001, B01110};
uint8_t bukva_ZH[8] = {B10101, B10101, B10101, B11111, B10101, B10101, B10101};
uint8_t bukva_Y[8] = {B10001, B10001, B10001, B01010, B00100, B01000, B10000};
uint8_t bukva_B[8] = {B11110, B10000, B10000, B11110, B10001, B10001, B11110};
uint8_t bukva_CH[8] = {B10001, B10001, B10001, B01111, B00001, B00001, B00001};
uint8_t bukva_IYI[8] = {B10001, B10001, B10001, B11001, B10101, B10101, B11001};
uint8_t bukva_TS[8] = {B10010, B10010, B10010, B10010, B10010, B10010, B11111, B00001};

void setup()
{
  lcd.init();                      // инициализация LCD
  lcd.backlight();                 // включаем подсветку
  lcd.clear();                     // очистка дисплея
}
void loop() {
vnesite (); delay (1000);
avans(); delay (1000);
gotov(); delay (1000);
}
void vnesite () { 
  lcd.clear();
  lcd.createChar(0, bukva_I);  // создаем символы и записываем их в память LCD
  lcd.createChar(1, bukva_D);  lcd.createChar(2, bukva_Mz);
  lcd.createChar(3, bukva_G);  lcd.createChar(4, bukva_Lm);
  lcd.home();  lcd.print(" BHEC");  lcd.write(0);
  lcd.print("TE ");  lcd.write(1);  lcd.print("EH");
  lcd.write(2); lcd.write(3);  lcd.write(0);
  lcd.setCursor (0, 1); lcd.print("    ");
}

void avans() {
  lcd.clear();
  lcd.createChar(0, bukva_L);  lcd.createChar(1, bukva_IY);
  lcd.createChar(2, bukva_Lm);
  lcd.home();  lcd.print("ABAHC  ");
  lcd.setCursor (0, 1);  lcd.print("HA");  lcd.write(0);  
  lcd.print("E"); lcd.write(1);  lcd.print("TE ");
}

void gotov() {
  lcd.clear(); 
  lcd.createChar(0, bukva_L);  lcd.createChar(1, bukva_I);
  lcd.createChar(2, bukva_Z);  lcd.createChar(3, bukva_CH);
  lcd.createChar(4, bukva_P); lcd.createChar(5, bukva_B);
  lcd.home();  lcd.print(" HA"); lcd.write(0); lcd.write(1); lcd.print("B ");
  lcd.write(2);  lcd.print("AKOH"); lcd.write(3); lcd.print("EH");
  lcd.setCursor (0, 1);  lcd.print("    C"); lcd.write(4); lcd.print("AC");
  lcd.write(1); lcd.write(5); lcd.print("O");
}

 

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Русификация для дисплеев LCD 1602 с шиной I2C:

https://github.com/ssilver2007/LCD_1602_RUS

Для обычных дисплеев:

https://github.com/ssilver2007/LiquidCrystal_1602_RUS

supervinni
Offline
Зарегистрирован: 28.02.2016

ssilver2007 пишет:

Для обычных дисплеев:

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
Ошибка компиляции.

Это сообщение будет содержать больше информации чем
"Отображать вывод во время компиляции"
включено в Файл > Настройки

Не пойму в чём моя ошибка. Помогите.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

supervinni пишет:

Господа! Помогите чайнику разобраться.

Пытаюсь заставить дисплей 16/2 печатать русскими буквами.

Скачал 4 разные библиотеки...>


В дисплеях МЭЛТ гарантированно есть все русские буквы. Чтобы не кувыркаться с библиотеками, я просто вывожу русский текст как коды символов, взятые из символьной таблицы дисплея. Вывод кириллицы в китайских дисплеях, где ее нет, за счет разных хитроумных "приемчиков" - ИМХО чисто спорт.

supervinni
Offline
Зарегистрирован: 28.02.2016

А как узнать есть ли именно в моём дисплее кирилица?

Из всех опознавательных знаков на нём есть только надписи: "1602А" и "QAPASS".

Где можно глянуть символьную таблицу дисплея? Как вводить в скетч коды символов?

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

supervinni пишет:

А как узнать есть ли именно в моём дисплее кирилица?


Запросите продавца. Пусть пришлет таблицу символов. Я с китайцами по этому вопросу переписывался, найти у них дисплеи с кириллицей мне не удалось.
Пример того, как я работал с дисплеем, можно найти в "Саге о кнопках". Там в приложениях есть схема, скетч и даже фотка экрана с русскими буквами.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

ssilver2007 пишет:
Русификация для дисплеев LCD 1602 с шиной I2C:
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 подключена в установленом порядке.
С ихими буквами работает.
Может, есть какой маленький изврат для победы над компилятором?

Как то так :(((

 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

ssvs111 пишет:
Отличная мысль. Подъытожив пришел к выводу что можно выводить русские буквы на дисплей в знакогенераторе которого вообще нет руских символов, но с одним ограничением - Формировать фразы на экране так, чтобы одновременно не выводить больше восьми "чисто русских" символов, таких как Й, Ц, У, Г, Ш, Щ, З, Ъ, Ф, Ы и т.д., а остальные брать из английской раскладки

Если поэмы на экран не выводить то это ограничение вовсе не ограничение, хотя это больше применимо к LCD2004.

Для наглядности прилагаю пример (кусок программы для аппарата по продаже и наливу воды), в котором уже есть почти все "чисто русские" символы в верхнем регистре

...skip...

Я думал, таким извратом не придется заниматься в XXI веке :(
ОНО мне константы Холлерита напоминает в ранних версиях Фортрана...
Но ведь работает!!!

Respect Ssvs111 и предшественникам.

 

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

supervinni пишет:

А как узнать есть ли именно в моём дисплее кирилица?

Из всех опознавательных знаков на нём есть только надписи: "1602А" и "QAPASS".

Где можно глянуть символьную таблицу дисплея? Как вводить в скетч коды символов?

Как-как, выводите всю таблицу , и смотрите что там.

void loop() {
  int currentRow = 0;
  int currentCol = 0;
  for (int letter = 0; letter <= 255; letter++) {
    lcd.setCursor(currentCol, currentRow-1);
    lcd.print(char(letter));
    currentCol++;
      if (currentCol > 16){
        currentCol = 0;
       if (currentRow < 1 ){
        currentRow++;
        }
      else {
        delay(3000);
        lcd.clear();
        currentRow = 0;            
      }
    }
  }       


}

 

JasKo
Offline
Зарегистрирован: 21.11.2015

Duino A.R. пишет:
В дисплеях МЭЛТ гарантированно есть все русские буквы. ....

Ценник у них только выше  в 5 и более раз, судя по сайту производителя. :(

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

JasKo пишет:

Duino A.R. пишет:
В дисплеях МЭЛТ гарантированно есть все русские буквы. ....

Ценник у них только выше  в 5 и более раз, судя по сайту производителя. :(

Да, ценам там до гуманных далеко. Поэтому для всяких отладочных дел и экспериментов, где важнее цифры, чем буквы, использую доступный китай, а для итоговых устройств с русскоязычным меню пришлось раскошелиться.

supervinni
Offline
Зарегистрирован: 28.02.2016

dimax пишет:

Как-как, выводите всю таблицу , и смотрите что там.

Спасибо! Коротко и доходчиво.

Жаль только, что дисплей у меня оказался без кирилицы :(

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Какая у вас версия IDE? В версии 1.6.6 и 1.6.7 все компилится без проблем.

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Олег М. пишет:

ssilver2007 пишет:
Русификация для дисплеев LCD 1602 с шиной I2C:
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 неверно работает при изменении скетча. То есть надо изменить пример, сохранить с новым именем или в новое место. После этого все прекрасно компилится.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

ssilver2007 пишет:
Еще есть известный уже глюк IDE, при котором макрос L неверно работает при изменении скетча. То есть надо изменить пример, сохранить с новым именем или в новое место. После этого все прекрасно компилится.

"Урррра! Заработало!!!" (С)
Alleluia! Alleluia! Alleluia!
Спасибо, уважаемый Ssilver2007!

PS. ver 1.6.7
 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Олег М. пишет:
"Урррра! Заработало!!!" (С)
Alleluia! Alleluia! Alleluia!
Спасибо, уважаемый Ssilver2007!
PS. ver 1.6.7

Дед Морозов не бывает :(
Добрых волшебников тоже...

#include "LCD_1602_RUS.h"

LCD_1602_RUS lcd(0x3F, 16, 2);

void setup()
{
  lcd.init();                      // initialize the lcd
  // Print a message to the LCD.
  lcd.backlight();
}

void loop()
{
  lcd.setCursor(2, 0);
  lcd.print(L"АВТОПОЛИВАЛКА");
  lcd.setCursor(3, 1);
  lcd.print(L"Сенсоры в норме");
  delay(3000);
  
  lcd.setCursor(2, 0);
  lcd.print(L"Статус ОЖИДАНИЕ");
  lcd.setCursor(3, 1);
  lcd.print(L"Влажность 123%");
  delay(3000); 
}

/* Первый проход выводится 
 *   АВТОПОЛИВАЛКА
 *    Сенсоры в нор
 *  
 *  Следующий вывод
 *    Статус ОЖлДАНл
 *     Влажжость 123
 *   
 *   И еще вывод
 *     АВТОЖОДлВАДкАл
 *      Сежсорь в жор
 *      
 * И ТАК ДАЛЕЕ...
 */

Те же грабли, но только в профиль...
Мораль: Не говори "Гоп!", когда прыгнул.  Сначала погляди, куда ты попал...

ssilver2007
Offline
Зарегистрирован: 21.01.2016

В описании библиотеки же написано, что для экранов без вшитой кириллицы есть существенное ограничение в железе. А именно - возможно использовать только 8 пользовательских символа, выводимых на экран одновременно. Тут два пути - либо искать и использовать экраны с кириллицей (такие есть, но их цена примерно в 5 раз выше, чем у некириллических), либо оптимизировать выводимые сообщения.

Библиотека дает возможность использовать вместо кириллических символов некоторые латинские, похожие по начертанию. Остальные (такие как Ж ж И и Ф Ф и т.п.) должны появлятся на экране в количестве, не превышающем 8 штук. Такое железо.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

ssilver2007 пишет:
В описании библиотеки же написано ...skip...

Ну кто у нас читает описания :)))
Вопрос немного другой.
В двух строках сообщения на LCD вряд-ли будет 8 разных символов на кириллице.
Может, доработать скетч или библиотеку так, чтобы при последующих выводах перегружать (или очищать?) библиотеку символов?
Время это займет пусть несколько сек, но для информационных сообщений такая "задумчивость" не сильно порведит.
 

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

Дополнил перед каждым выводом lcd.clear()
 

void loop()
{
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(L"АВТОПОЛИВАЛКА   ");
  lcd.setCursor(0, 1);
  lcd.print(L"Сенсоры в норме");
  delay(3000);
  
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print(L"Статус ОЖИДАНИЕ ");
  lcd.setCursor(0, 1);
  lcd.print(L"Влажность 123% ");
  delay(3000); 
}

и  в лупе все стало выводиться без кракозябр...
Шопотом:  "Alleluia!"

bwn
Offline
Зарегистрирован: 25.08.2014

Олег М. пишет:

В двух строках сообщения на LCD вряд-ли будет 8 разных символов на кириллице.
Может, доработать скетч или библиотеку так, чтобы при последующих выводах перегружать (или очищать?) библиотеку символов?
Время это займет пусть несколько сек, но для информационных сообщений такая "задумчивость" не сильно порведит.
 

Это и сделано у автора 5 поста. О секундах задумчивости и речи нет, для пользователя незаметно. Попробовал сам, все нормально работает. Правда перед выводом готовлю строку типа:
char prints[] = {'O','T','K','\3','\1','\2','E','H','\4','E','\0'}; , мне так удобнее.
Перед каждым выводом просто обновляю знакогенератор.

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Вообще, это хорошая и правильная практика - очищать экран перед выводом новых 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"Так же удобнее");

Тут же все очевидно! Кому-то может и левое ухо чесать правой пяткой удобнее.

Олег М.
Олег М. аватар
Offline
Зарегистрирован: 22.11.2015

bwn пишет:
Это и сделано у автора 5 поста. О секундах задумчивости и речи нет, для пользователя незаметно. Попробовал сам, все нормально работает

Автору поста #5 Ssvs111 отдельная благодарность.
Собственно, его скетч толкнул меня в правильном направлениии.
 

saftik
Offline
Зарегистрирован: 08.04.2015

Ураааа!!!!!

ssilver2007 братан, дай бог тебе здоровья тебе и твоим близким . всю голову сломал что да как . оказываеться это IDE выделывалась. сохранил другим файлом и заработало.
Спасибо огромное 

obstinatus
Offline
Зарегистрирован: 02.05.2016

dimax пишет:

Как-как, выводите всю таблицу , и смотрите что там.

По вашему коду у меня не отображалось несколько последних символов. Вначале я насчитал 7 обновлений экрана и у меня возникли подозрения. Погуглив таблицу и написав свой кривой код вывода, убедился что мои подозрения были не напрасны: пропускается самая последняя строка.

В общем, с моими поправками ваш код вывода всех символов выглядит так:

#include <LiquidCrystal.h>

LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
  // put your setup code here, to run once:  
  lcd.begin(16, 2);
  lcd.clear();
}

void loop() {
  // put your main code here, to run repeatedly:
  int currentRow=0;
  int currentCol=0;
  for (int letter=0; letter <= 255; letter++) {    
//  lcd.setCursor(currentCol, currentRow-1);
    lcd.setCursor(currentCol, currentRow);
    lcd.print(char(letter));
    currentCol++;    

//  if (currentCol > 16){
    if (currentCol > 15){
      currentCol=0;
      if (currentRow < 1) {        
        currentRow++;        
      }
      else {                
        delay(8000);
        lcd.clear();
        currentRow=0;
      }
    }
  }
}

 

max506
Offline
Зарегистрирован: 04.08.2016

ssilver2007 пишет:

lcd.print(L"На русском");

Большое спасибо за библиотеку.

Но мне необходимо сначала собирать строку в некоторую переменную  (например, функцией sprintf) и потом выводить ее. Как мне это сделать в данном случае?

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Собирайте строку в переменной типа wchar_t.

max506
Offline
Зарегистрирован: 04.08.2016

ssilver2007 пишет:

Собирайте строку в переменной типа wchar_t.

Не могли бы выложить примерчик, учитывая что мне нужно собирать строку функцией sprintf (чтобы вставлять в строку значения переменных)

ssilver2007
Offline
Зарегистрирован: 21.01.2016

sprintf не работает с типом wchar_t. Либо руками выводите пременную, либо пишите свою процедуру для обработки строки в wchar_t.

max506
Offline
Зарегистрирован: 04.08.2016

Вот пример:

#include "LiquidCrystal_1602_RUS.h"
 
//LiquidCrystal_1602_RUS lcd(12, 11, 5, 4, 3, 2);
LiquidCrystal_1602_RUS lcd(8, 9, 4, 5, 6, 7 );//For LCD Keypad Shield
 
void setup()
{
  wchar_t  str[20];
 
   // Как тут надо сформировать строку str, чтобы вывести на русском Привет
  
  // set up the LCD's number of columns and rows:
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.setCursor(1, 0);
  lcd.print(str);
}
 
void loop()
{
}

 

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Ну вот как-то так:

 wchar_t  *str;
 
   // Как тут надо сформировать строку str, чтобы вывести на русском Привет
   str = L"Привет";

max506
Offline
Зарегистрирован: 04.08.2016

ssilver2007 пишет:

   str = L"Привет";

Ну это получается та же константа. Я просто не пойму, как динамически сформировать строку str (из набора строк, например)

ssilver2007
Offline
Зарегистрирован: 21.01.2016

напишите конкретно, что вы хотите выполнить. Что вы делаете при работе со string, и тогда можно сказать, что надо делать, заменив на wchar_t.

max506
Offline
Зарегистрирован: 04.08.2016

ssilver2007 пишет:

напишите конкретно, что вы хотите выполнить.

Есть дисплей lcd keypad shield, подключенный к arduino mega. На дисплей выводятся стадии процесса и его меняющиеся параметры (время, темпеатура, давление и т.д). Соответственно, перед выводом на экран возникает необходимость собирать строку из константного текста и переменных значений параметров. Для этого использовал функцию sprintf. Теперь хочу перейти на вывод русифицированного текста.

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Как я уже говорил, sprintf не работает с wchar_t. А в библиотеках ардуино к сожалению пока нет поддержки  таких функций C как swprintf. Поэтому вам придется или обходится константами для вывода текста, или написать свои функции для обработки wchar_t. Для экрана, где длина строки ограничена 20 символами не должно быть проблемы использовать констатны строк (с точки зрения занимаемой ими памяти).

lcd.print(L"Параметр ");
lcd.print(variable);

Такая последовательность для вывода параметра и его значения чем хуже, чем вывод всего в одной строке?

 

max506
Offline
Зарегистрирован: 04.08.2016

ssilver2007 пишет:

 

lcd.print(L"Параметр ");
lcd.print(variable);

Такая последовательность для вывода параметра и его значения чем хуже, чем вывод всего в одной строке?

Всмысле, насколько трудоемко доработать библиотеку?

Ну в принципе тоже вариант. Спасибо.

А нельзя ли в функцию вашей библиотеки передать строку типа char, а в библиотеке сделать преобразование к wchar_t?

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Тип char - однобайтовое кодирование символа.

Тип wchar_t - двухбайтовое кодирование символа.

Строка типа char может содержать только латиницу. Информация по кириллице будет потеряна. Нет. Так сделать нельзя.

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013
lcd.print(L"Параметр ");

про "F" знаю, а "L" что означает?

ssilver2007
Offline
Зарегистрирован: 21.01.2016

Расширенный символ — это двухбайтовый многоязыковой код символа. Большинство символов, используемых в современных вычислительных системах по всему миру, включая технические символы и специальные знаки, используемые в издательском деле, могут быть представлены как расширенные символы (в соответствии со спецификацией Юникода). Символы, которые не могут быть представлены как один расширенный символ, могут быть представлены в Юникоде как суррогатная пара. Поскольку каждый расширенный символ может быть представлен как шестнадцатибитный, их использование упрощает программирование с использованием международных кодировок.

Строка расширенных символов представляется как массив wchar_t[] с указателем wchar_t*. Любой символ ASCII может быть представлен как расширенный символ путем добавления к нему префикса "L".

https://msdn.microsoft.com/ru-ru/library/2dax2h36.aspx

serge73
serge73 аватар
Offline
Зарегистрирован: 08.10.2014

Хочу купить этот для меги256. Ценник вроде адекватный за отсутствие гемороя.

Продавец пишет, что  РУССКИЙ (Кириллица) 1602.

Продавец известный, наверняка кто-то уже покупал. Поделитесь впечатлениями.

Есть ли проблемы и какие?

 

Tomasina
Tomasina аватар
Offline
Зарегистрирован: 09.03.2013

У RobotDyn нет дисплеев с поддержкой кириллицы.
Вывод русских букв на нем реализовать можно, но через заднее место: http://ardu.net/ru/indikatory-displei/352-lcd-keypad-shield-modul-arduin...

Вообще, мне за 4 года не удалось найти ни одного синего дисплея с кириллицей. Так что если видишь синий дисплей - 99% что там не будет русских букв.

serge73
serge73 аватар
Offline
Зарегистрирован: 08.10.2014

Т.е. по вашему получается продавец пропихивает тот же дисплей , что и без кириллицы только дороже?
Вы сами его покупали? У продавца 4 разновидности 16*2. По вашему два из них висят до первого отрицательного отзыва? Компания уж больно качественные вещи делает чтобы за очевидный обман заморачиваться. Вам так не кажется?

Связался с продавцом, посмотрим, что ответит.

serge73
serge73 аватар
Offline
Зарегистрирован: 08.10.2014

Позвонил в москву (http://robotdyn.ru/) сказали, что полная аппаратная поддержка всего алфавите.

Можно даже у нас со склада (Екатеринбуерг) покупать. Правда сейчас их в России нет, только в Китае.

Так-что попробую заказать. Посмотрим, что придет.

serge73
serge73 аватар
Offline
Зарегистрирован: 08.10.2014

Сегодня получил от китайцев (реально быстрая доставка, 16 дней в Екатеринбург. Обычно 20)

РУССКИЙ (Кириллица) ЖК клавиатура Щит, 1602 дисплей, для Arduino ЖК-Экран ЗЕЛЕНЫЙ ЭКРАН

Так вот, Кирилица в нем, как я себе это понимаю, прошита.

Код от dimax выводит весь русский алфавит, большие и маленькие буквы.

lcd.print("\243K \343\270c\276\273e\271"); выводит "ЖК дисплей" в примере hello world! стандартной библиотеки LiquidCrystal.

Еще рабочий вариант вывода

// пример на русском «привет мир» 

hd44_word ("ѕpёіeї јёp");

 

Просто так написать lcd.print("привет") - не работает.

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

 

 

 

puchibaba
Offline
Зарегистрирован: 29.10.2016

Короче! долго мучился, заказал год назад такой же дисплей как в посте serge73
Качайте! 
http://labkit.ru/html/profit?id=393

Yatskov
Offline
Зарегистрирован: 15.11.2016

А для lcd2004 LCD_1602_RUS.h подойдет?

ssilver2007
Offline
Зарегистрирован: 21.01.2016

подойдет. Но все равно надо помнить про 8 уникальных кириллических переопределяемых символа. 80-символьную (20x4) строку на русском вряд ли получтся использовать.