Не компилируется пример для библиотеки LiquidCrystalRus.h

kinder
Offline
Зарегистрирован: 29.03.2015

Помогите начинающему. Начал читать книгу Виктора Петина: Проекты с использованием контроллера arduino. Книга неплохая, но по неопытности возникли проблемы с первым же практическим примером.

 К книге прилагаются примеры. Первый пример - работа с LCD и русскими символами. Скетч который был в примере не компилируется - выдает ошибки:

In file included from Display.ino:3:0:
D:\Documents and Settings\User\Мои документы\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 D:\Documents and Settings\User\Мои документы\Arduino\libraries\LiquidCrystalRus/LiquidCrystalRus.h:5:0,
                 from Display.ino:3:
D:\Documents and Settings\User\Application Data\Arduino15\packages\arduino\hardware\avr\1.6.2\cores\arduino/Print.h:48:20: error:   overriding 'virtual size_t Print::write(uint8_t)'
     virtual size_t write(uint8_t) = 0;
                    ^
Ошибка компиляции.
 
Библиотеку LiquidCrystalRus  подключил вручную.  Скетч не компилируется. Скачал и установил новую версию IDE 1.6.2 тоже не помогло. Думаю проблема с библиотекой. Кто с ней  работал помогите разобраться.
 
 

 

kinder
Offline
Зарегистрирован: 29.03.2015
Прикладываю скетч.
 
// Подключение библиотеки
#include <LiquidCrystalRus.h>
 
// Создаём объект используя конструктор класса LiquidCrystal
// 12 – RS,11 – Enable,5 – D4, 4 – D5,3 – D6,2 - D7
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
 
byte s1[8]={B11111,B11111,B11111,B11111,B11111,B11111,B11111};
byte s2[8]={B00000,B00000,B11111,B11111,B11111,B11111,B11111};
byte s3[8]={B00000,B00000,B00000,B00000,B11111,B11111,B11111};
byte s4[8]={B00011,B00011,B00011,B00011,B00011,B00011,B00011};
 
// начальная установка
void setup()
 {
  // размерность индикатора 
  lcd.begin(16, 4);
  // Начальное сообщение
  lcd.setCursor(0, 0);
  lcd.print("Демо к книге");
  lcd.setCursor(0, 1);
  lcd.print("Arduino");
  lcd.setCursor(0, 2);
  lcd.print("Возможности");
  lcd.setCursor(0, 3);
  lcd.print("WH1604");
  lcd.cursor();
  
  delay(10000);
 }
void loop()
 {
  // выключить дисплей без потери отображаемой на нем информации
  lcd.noDisplay();
  delay(3000);
  // включить дисплей без потери отображаемой на нем информации
  lcd.display();
  delay(3000);  
  //***** Вывод слева-направо  *******
  lcd.clear();                      // очистить экран
  lcd.leftToRight();                // слева-направо
  lcd.cursor();                     // курсор - подчеркивание
  lcd.setCursor(0, 0);              // позиция 0,0
  String text1="Слева-направо";
  for(int i = 0; i < text1.length(); i++)
   {
   lcd.write(text1[i]);             // посимвольный вывод
   delay(300);                      // задержка
   } 
  lcd.noCursor();                   // курсор - спрятан
  lcd.setCursor(0, 1);              // позиция 0,1
  for(int i = 0; i < text1.length(); i++)
   {
   lcd.write(text1[i]);             // посимвольный вывод
   delay(300);                      // задержка
   }  
  //***** Вывод Справа-налево  *******
  lcd.rightToLeft();                // справа-налево
  lcd.blink();                      // курсор - мигающий
  lcd.setCursor(15, 2);             // позиция 15,2
  String text2="овелан-оварпС";
  for(int i = 0; i < text2.length(); i++)
   {
   lcd.write(text2[i]);             // посимвольный вывод
   delay(300);                      // задержка  
   }   
  lcd.clear();
//***** autoscroll слева-направо  *******
  lcd.leftToRight();
  lcd.autoscroll();
  String text3="autoscroll";
  lcd.blink();
  lcd.setCursor(7, 1);
  for(int i = 0; i < text3.length(); i++)
   {
   lcd.write(text3[i]);
   delay(300);  
   } 
  // справо-налево 
  lcd.rightToLeft();
  lcd.setCursor(7, 2);
  for(int i = 0; i < text3.length(); i++)
   {
   lcd.write(text3[i]);
   delay(300);  
   }  
  lcd.noAutoscroll();
  lcd.clear(); 
//***** перемещения курсора  *******
  lcd.leftToRight();
  lcd.cursor();
  lcd.blink();
  for(int i=0;i<10;i++)
   {
   int rand1=(micros()+millis())%1000;  
   lcd.setCursor(rand1%15,rand1%4);
   delay(1000);
   }
  lcd.noBlink();
  for(int i=0;i<10;i++)
   {
   int rand1=(micros()+millis());  
   lcd.setCursor(rand1%15,rand1%4);
   delay(1000);
   }
  delay(1000);
  lcd.home();  
for(int i=0;i<4;i++)
   {
   ;
   }
 lcd.createChar(0, s1);
 lcd.createChar(1, s1);
 lcd.createChar(2, s1);
 lcd.createChar(3, s1);
 lcd.setCursor(0, 0);
 /*lcd.write(0); lcd.write(" ");
 lcd.write(1);lcd.write("");
 lcd.write(2);lcd.write("");
 lcd.write(3);lcd.write("");
 */
 delay(10000);
 
 
}
 
bwn
Offline
Зарегистрирован: 25.08.2014

Для этой библы IDE должно быть ниже 1.0.

Terragot
Offline
Зарегистрирован: 23.02.2015

Попробуй использовать библиотеку <LiquidCrystal.h> я не уверен, но возможно <LiquidCrystalRus.h> у тебя просто на диске нету и IDE не может её найти, возможно данную библиотеку можно где-то скачать.  

 

Terragot
Offline
Зарегистрирован: 23.02.2015

Проверил, в файлах IDE нет библиотеки <LiquidCrystalRus.h> есть только <LiquidCrystal.h> так что придется качать.  

kinder
Offline
Зарегистрирован: 29.03.2015

Библиотеку LiquidCrystalRus.h скачивал отдельно и устанавливал вручную.

kinder
Offline
Зарегистрирован: 29.03.2015

Если для LiquidCrystalRus.h IDE должно быть ниже 1.0. то подскажите пожалуйста какой библиотекой можно вывести русские буквы на LCD. в IDE 1.6.2.  Хотя в книге указывается версия IDE 1.5.   Заранее благодарен.

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

kinder пишет:

Если для LiquidCrystalRus.h IDE должно быть ниже 1.0. то подскажите пожалуйста какой библиотекой можно вывести русские буквы на LCD. в IDE 1.6.2.  Хотя в книге указывается версия IDE 1.5.   Заранее благодарен.

Так и поставьте 1.5, по 1.6 нареканий много по форуму. Ниже 1.0 возможно был неправ.

kinder
Offline
Зарегистрирован: 29.03.2015

Пробовал 1.5 r2. Эффекта нет. Я думал, что каждая новая версия IDE  только увеличивает возможности и исправляет ошибки. Мне нужно, чтобы я писал в посленей версии IDE. А то получится эта библиотека работает на старой версии, а другая на новой. Это не позволит их совмещать. :-(   Подскажите как вывести русские символы на LCD. Кто как делает?

kinder
Offline
Зарегистрирован: 29.03.2015

Еще одна проблемка. Наверно аппаратная. Не могу запитать подсветку на 2004 LCD от UNO. Откуда брать 5В?

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

В некоторых случаях помогает

#if defined(ARDUINO) && ARDUINO >= 100 //Определение версии IDE
#include "Arduino.h"
#else
#include "WProgram.h"
#endif

но не во всех(((.

А 1.6.* здесь оплевана не знаю как. У многих с ней проблема.

Пять вольт на подсветку и брать от 5В на UNO, ток даташит гляньте, там вроде резистор нужен.

kinder
Offline
Зарегистрирован: 29.03.2015

С подсветкой разобралься. Почему-то на ней КЗ. Взял другой дисплей вроде подсвечивает. Но символы упорно не выводит.

Хотя заливаю скетч с библиотекой LiquidCrystal.h.

Пример скетча.

/* Подключаем библиотеку для работы с LCD */
#include <LiquidCrystal.h>
 
/* Создаём объект LCD-дисплея, используя конструктор класса LiquidCrystal
* с 6ю аргументами. Библиотека по количеству аргументов сама определит,
* что нужно использовать 4-битный интерфейс.
* Указываем, к каким пинам Arduino подключены выводы дисплея:
*   RS, E, DB4, DB5, DB6, DB7
*/
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
 
void setup()
{
 /* Инициализируем дисплей: 2 строки по 16 символов */
 lcd.begin(20, 4);
 /* Выводим на дисплей традиционную фразу (: */
 lcd.print("hello, world!");
}
 
void loop()
{
 /* Устанавливаем курсор в 1 столбец 2й строки. Нумерация идёт с нуля,
  * первым аргументом идёт номер столбца.
  */
 lcd.setCursor(0, 1);
 /* Выводим на дисплей число секунд, прошедших с момента старта Arduino */
 lcd.print(millis() / 1000);
}

По вашим рекомендациям буду откатываться на 1.5 версию.

Подключение уже несколько раз перепроверил. 

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

А что он вообще выводит? Контрастность крутили? Для кириллицы, она еще в знакогенератор должна быть зашита, иначе кракозябры будут.

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

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

kinder
Offline
Зарегистрирован: 29.03.2015

Дисплей просто подсвечивается т.е. работает подсветка. Иногда при включении выводит квадратики, но не во всех ячейках. Никакие символы не выводит. Уже заливал скетч приведенный выше т.е. стандартный и без кирилицы. Результат плачевный. С миром так и не поздоровался. Вспоминаю откуда у меня эти дисплеи. Может с ними что-то не так. Они не новые 100%. Завтра буду искать 100% рабочие.

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

А переменный резистор контрастности там распаян? Без него ничего не увидите.

kinder
Offline
Зарегистрирован: 29.03.2015

Еще вопросик по поводу подсветки. Дисплей у меня АСМ 2004. У него максимальный ток подсветки 600 мА. т.е. теоретически его от USB порта ПК запитать можно не всегда. От чего его запитывать? Ведь схема должна быть с запасом.

kinder
Offline
Зарегистрирован: 29.03.2015

Резистор я припаял. Правда по даташиту 10-20 кОм. У меня был 5кОм. Яркость подсветки подстроить сложно если не выводятся символы. Но вроде она меняется от переменного резистора.

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

kinder пишет:

Еще вопросик по поводу подсветки. Дисплей у меня АСМ 2004. У него максимальный ток подсветки 600 мА. т.е. теоретически его от USB порта ПК запитать можно не всегда. От чего его запитывать? Ведь схема должна быть с запасом.

Тады только отдельный БП или ток до 200-250мА ограничивать.

kinder
Offline
Зарегистрирован: 29.03.2015

Еще раз прогнал резистор от щелчка до щелчка. При определенном положении резистора высветились черные квадратики, но не во всех ячейках (при этом в каждой строке). После чего произошло странное явление. Эти квадратики начали растворяться и экран снова стал монотонным. При этом положение резистора я уже не менял.

kinder
Offline
Зарегистрирован: 29.03.2015

А как ограничить ток? Дайте ссылочку на схемку пожалуйста.

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

Вы бы с ACM2004  и начинали, контроллер там другой. Не факт, что с этими библами будет работать. Сравнивайте систему команд.

kinder
Offline
Зарегистрирован: 29.03.2015

Как я понял контроллеры поддерживаются этой библиотекой.

http://arduino.ru/forum/obshchii/lcd-indikator

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

kinder пишет:

А как ограничить ток? Дайте ссылочку на схемку пожалуйста.

Да обычный резистор. Мощность только посчитайте. Правда будет греть.

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

Хотя, если ток в три раза уменьшить, смысла в этой подсветке не будет. Слишком темно. Лучше или вовсе не включать, или БП с достаточной мощностью. ИМХО.

kinder
Offline
Зарегистрирован: 29.03.2015

А куда ставить резистор? В цепь питания подсветки?

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

Да, последовательно.

kinder
Offline
Зарегистрирован: 29.03.2015

Спасибо.

kinder
Offline
Зарегистрирован: 29.03.2015

Буду завтра добывать новый дисплей. И учиться на нем. Думаю что сам дисплей не совсем хорошо себя чувствует. Или хуже - руки кривые. Чтобы ни было буду исправлять.

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

IDE 1.6.0 несовместима с библиотекой LiquidCrystalRus (именно Rus) - программисты Arduino выкинули из новой версии одну функцию, которая используется в этой библиотеке для обработки кириллицы.

kinder
Offline
Зарегистрирован: 29.03.2015

Сегодня заработала LiquidCrystalRus на версии 1.5.8 , а на 1.6 не хочет.  Помогла статья http://robocraft.ru/blog/arduino/503.html

Правда нужно подключать аж три библиотеки и будут выводиться русские буквы. Выводит как-то кривовато - но хоть как-то. Кто знает подсветка LCD - это светодиоды с резистором?

kinder
Offline
Зарегистрирован: 29.03.2015

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

Вывожу в каждую строчку одинаковую последовательность символов. Корректно выводится только первая строка далее идет какое-то смещение.

#include <LineDriver.h>
#include <LiquidCrystalExt.h>
#include <LiquidCrystalRus.h>
 
LiquidCrystalRus lcd(12, 11, 5, 4, 3, 2);
 
void setup()
{
  lcd.begin(20, 4);
 // Начальное сообщение
  lcd.setCursor(0, 1);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 2);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 3);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 4);
   lcd.print("12345678912345678912");
  lcd.cursor();
  delay(1000);
}
 
void loop()
{
  // выключить дисплей без потери отображаемой на нем информации
  lcd.noDisplay();
  delay(1000);
  // включить дисплей без потери отображаемой на нем информации
  lcd.display();
  delay(50000);  
Vittorio
Offline
Зарегистрирован: 02.02.2015

а почему lcd.setCursor(0, 1); ? Это же 1-й символ и ВТОРАЯ строка (отсчет идет от нуля). По крайней мере, в моей библиотеке LiquidCrystalRus.h это так.

Получается, 4-ю строку ты загружаешь в 5-ю физически (которой нет), вот библиотека (или контроллер дисплея) разраливает это "как могу, так и делаю".

kinder
Offline
Зарегистрирован: 29.03.2015

Извиняюсь это я по всякому пробовал и не тот код вставил.

Вот как реагирует на следующий код:

 void setup()
{
  lcd.begin(20, 4);
 // Начальное сообщение
  lcd.setCursor(0, 0);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 1);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 2);
   lcd.print("12345678912345678912");
   lcd.setCursor(0, 3);
   lcd.print("12345678912345678912");
kinder
Offline
Зарегистрирован: 29.03.2015

При этом, если использовать библиотеку LiquidCrystal, то результат адекватный.

Vittorio
Offline
Зарегистрирован: 02.02.2015

а что вообще делают LineDriver.h и LiquidCrystalExt.h? Без них никак? Похоже, что как раз что-то из них работает в режиме 16х4, а не 20х4.

kinder
Offline
Зарегистрирован: 29.03.2015

Без них скетч вообще не компилируется.

Делаю по этой  статье http://robocraft.ru/blog/arduino/503.html

Как я понимаю стандартно русский язык не поддерживается. Написали для русификации библиотеку LiquidCrystalRus.h. Но она работает не во всех версиях IDE. Поэтому писать код с русскими символами не очень удобно. Подскажите кто чем пользуется для русификации.

Vittorio
Offline
Зарегистрирован: 02.02.2015

LiquidCrystalRus.h прекрасно работает с IDE 1.0.5

IDE 1.6 - вообще глюкалово.

kinder
Offline
Зарегистрирован: 29.03.2015

Я просто начинающий. И чисто интуитивно подозреваю, что 1.0.5. имела какие-то глюки, которые потихоньку исправляют и выпускают новые версии IDE. Вот и получается, что часть кода будет хорошо работать в 1.0.5. а часть например в 1.6.1. Как в таких условиях быть начинающему да и вообще как работать с такими нюансами?

Vittorio
Offline
Зарегистрирован: 02.02.2015

Возьми 1.0.6 - она стабильная и на данный момент в ней меньше всего глюков. А 98% кода будет одинаково работать во всех IDE.

kinder
Offline
Зарегистрирован: 29.03.2015

Спасибо за совет.

 

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

Судя как вы этим заморочились, так вы поэмы писать будете на нем. Берите стандартную латиницу, а недостающие символы сами нарисуйте, вроде 8 штук допускается. И компонуйте из них, что вам требуется. Слов синонимов, в великом и могучем, вдоволь.

kinder
Offline
Зарегистрирован: 29.03.2015

Очень люблю русский язык. Думал что просто подключу библиотеку LiquidCrystalRus.h и будет счастье. А извращаться с 8-ю буквами это в 21 веке не камильфо. Лучше их использовать на какую-то информативную графику. Просто не могу понять, почему нет встроенной поддержки различных языков, если платформа arduino хочет завоевать весь мир, то локализация это первое дело.

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

А те, которые по написанию сходны с латиницей, чем вас не устраивают? Тем более, что дисплеи с зашитой кирллицей в два раза дороже обычных, да и поискать надо.

kinder
Offline
Зарегистрирован: 29.03.2015

Очень люблю русский язык поэтому хочу свои девайсы делать с приятным для себя интерфейсом. Ценное уточнение по поводу встроенной поддержки кириллицы. Когда буду покупать дисплей буду брать с кириллицей. Может подскажите: подсветка на LCD это светодиоды с резистором?

Vittorio
Offline
Зарегистрирован: 02.02.2015

нет, там только светодиод, резистор надо подключать самостоятельно.

kinder
Offline
Зарегистрирован: 29.03.2015

При этом резистор будет греться. Можно ли вместо резистора поставить диод, чтобы на нем упало 0,6В и соответственно подсветка светила слабее.  И будет ли он греться?

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

LiquidCrystalCyr_I2C.h , я такой пользовался, она под I2C, на IDE 1.0 и выше не проверял. Дисплеи с кириллицей на али не смог обнаружить, а в России цена больно не гуманная. Так что я за синонимы))))

kinder
Offline
Зарегистрирован: 29.03.2015

LiquidCrystalCyr_I2C.h для не нужен переходник?

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

kinder пишет:

LiquidCrystalCyr_I2C.h для не нужен переходник?

Я сам паяю, хотя по цене эквивалентны выходят. У I2C плюс, что надо всего два вывода без учета питания.

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

kinder пишет:

При этом резистор будет греться. Можно ли вместо резистора поставить диод, чтобы на нем упало 0,6В и соответственно подсветка светила слабее.  И будет ли он греться?

Можно, грется не будет.