Меню

Lcd init arduino ошибка

  • #1

Заголовок должен отражать суть темы. Переформулируй или тема будет удалена.

Хочу сделать проект с использованием: Дисплей 1602 5 В Синий экран с интерфейсной шиной IIC / I2C и Ардуино уно. Умение почти нет вылезает ошибка Инициализация lcd. Помогите пожалуйста ….

Arduino: 1.8.15 (Windows 10), Плата:»Arduino Uno»

C:UserspcDocumentsArduinosketch_sep27asketch_sep27a.ino: In function ‘void setup()’:

sketch_sep27a:24:5: error: ‘class LiquidCrystal_I2C’ has no member named ‘init’

lcd.init(); // Инициализация lcd

^~~~

Несколько библиотек найдено для «LiquidCrystal_I2C.h»

Используется: C:UserspcDocumentsArduinolibrariesLiquidCrystal_I2C

Не используется: C:UserspcDocumentsArduinolibrariesliquidcrystal_i2c-master

Несколько библиотек найдено для «DHT.h»

Используется: C:UserspcDocumentsArduinolibrariesDHT

Не используется: C:UserspcDocumentsArduinolibrariesDHT-sensor-library-master

exit status 1

‘class LiquidCrystal_I2C’ has no member named ‘init’

Этот отчёт будет иметь больше информации с
включенной опцией Файл -> Настройки ->
«Показать подробный вывод во время компиляции»

  • 2.1 KB
    Просмотры: 6

Решил подключить lcd к esp для будущей постройки управления с мобилы, SCL — D1, SDA — D2, но выдаёт ошибку при компиляций:

Arduino: 1.8.18 (Windows 10), Плата:"Generic ESP8266 Module, 80 MHz, Flash, Disabled (new aborts on oom), Disabled, All SSL ciphers (most compatible), 32KB cache + 32KB IRAM (balanced), Use pgm_read macros for IRAM/PROGMEM, dtr (aka nodemcu), 26 MHz, 40MHz, DOUT (compatible), 1MB (FS:64KB OTA:~470KB), 2, nonos-sdk 2.2.1+100 (190703), v2 Lower Memory, Disabled, None, Only Sketch, 115200"

C:UsersshitsAppDataLocalTemparduino_modified_sketch_578173sketch_jul23a.ino: In function 'void setup()':

sketch_jul23a:7:7: error: 'class LiquidCrystal_I2C' has no member named 'init'

    7 |   lcd.init()

      |       ^~~~

Несколько библиотек найдено для "LiquidCrystal_I2C.h"

 Используется: C:UsersshitsDocumentsArduinolibrariesArduino-LiquidCrystal-I2C-library-master

Не используется: C:UsersshitsDocumentsArduinolibrariesLiquidCrystal_I2C-1.1.1

exit status 1

'class LiquidCrystal_I2C' has no member named 'init'



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

Код самый дефолтный.

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup() {
  // put your setup code here, to run once:
  lcd.init()
  lcd.backlight();
  lcd.print("Hi!");
}

void loop() {
  // put your main code here, to run repeatedly:

}

Offline

Зарегистрирован: 22.12.2018

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

Приобрел Arduino Uno, Arduino LCD 1602 i2c и модуль реалного времени RTC1602

Собрал по гайду на ютубе, нашел скетч и попытался его загрузить. 

Выдало следующую ошибку при компиляции: 

C:UsersextinctDesktopsketch_dec22asketch_dec22a.ino: In function 'void setup()':

sketch_dec22a:98:7: error: 'class LiquidCrystal_I2C' has no member named 'init'

   lcd.init();                      // initialize the lcd 

       ^

exit status 1
'class LiquidCrystal_I2C' has no member named 'init'

Установлены библиотеки LiquidCrystal_I2C (с обычной Liquid Crystal дисплей никак не работает) и RTClib

Вопрос, как исправить ошибку в коде? Заранее спасибо

сам код скетча 

// Date and time functions using a DS1307 RTC connected via I2C and Wire lib

#include <Wire.h>
#include "RTClib.h"
#include <LiquidCrystal_I2C.h>
RTC_DS1307 rtc;
LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display
int progbar=0;

byte p20[8] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
  B10000,
};
byte p40[8] = {
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
  B11000,
};
byte p60[8] = {
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
  B11100,
};
byte p80[8] = {
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
  B11110,
};
byte p100[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};
byte ip20[8] = {
  B00001,
  B00001,
  B00001,
  B00001,
  B00001,
  B00001,
  B00001,
};
byte ip40[8] = {
  B00011,
  B00011,
  B00011,
  B00011,
  B00011,
  B00011,
  B00011,
};
byte ip60[8] = {
  B00111,
  B00111,
  B00111,
  B00111,
  B00111,
  B00111,
  B00111,
};
byte ip80[8] = {
  B01111,
  B01111,
  B01111,
  B01111,
  B01111,
  B01111,
  B01111,
};



void setup () {
  Serial.begin(57600);
  Wire.begin();
  rtc.begin();
  lcd.init();                      // initialize the lcd 
  lcd.backlight();
  lcd.home();

  //Make progress characters
  lcd.createChar(0, p20);
  lcd.createChar(1, p40);
  lcd.createChar(2, p60);
  lcd.createChar(3, p80);
  // lcd.createChar(4, p100);
  lcd.createChar(4, ip20);
  lcd.createChar(5, ip40);
  lcd.createChar(6, ip60);
  lcd.createChar(7, ip80);


  lcd.clear();  




  if (! rtc.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
    // rtc.adjust(DateTime(__DATE__, __TIME__));
  }
}

void loop () {

  digitalClockDisplay();  
  delay(200);
}


void digitalClockDisplay(){
  // digital clock display of the time
  DateTime now = rtc.now();






  lcd.setCursor(5, 0);
  printDigits(now.hour()); // печатает часы

  //рисуем прогресс бар часов

  progbar=map(now.hour(),0,24,0,25);

  //стираем бар если час =0
  if(now.hour()<1  ){
    lcd.setCursor(0,0);
    lcd.print("     ");  
  }

  // отрисовка бара часа в обратном направлении 
  //сначала рисуем квадраты

  for (int i = 0; i<(progbar/5); i++)
  {

    lcd.setCursor(4-i, 0);   
    lcd.write(B11111111);

  }

  //отрисовываем деления в поле символа,
  lcd.setCursor(4-progbar/5, 0);   
  if(progbar%5<4){
    lcd.write(progbar%5+4);
  }
  else{
    lcd.write(B11111111);
  }

  //нарисовали часы и шкалу часов
  //рисуем бегающие двоеточие, привязано к секундам, вывод слева или справа двоеточие зависит от четности секунд

  lcd.setCursor(7, 0);
  if (now.second()%10%2==0){
    lcd.print(": ");
  }
  else
  {
    lcd.print(" :");
  }
  //нарисовали двоеточие


  //рисуем минуты

  lcd.setCursor(9, 0); 
  printDigits(now.minute());
  //стираем бар минут если минуты=0
  if(now.minute()<1  ){
    lcd.setCursor(11,0);
    lcd.print("     ");  
  }
  //рисуем бар минут
  //тут уже отрисовка происходит в прямом направлении

  progbar=map(now.minute(),0,60,0,25);


  for (int i = 0; i<(progbar/5); i++)
  {

    lcd.setCursor(i+11, 0);   
    lcd.write(B11111111);

  }


  lcd.setCursor(progbar/5+11, 0);   
  if(progbar%5<4){
    lcd.write(progbar%5);
  }
  else{
    lcd.write(B11111111);
  }

  //нарисовали минуты


  //рисуем бар минут
  //самый длинный бар в самом низу

  lcd.setCursor(7, 1);
  printDigits(now.second());

  if(now.second()<1  ){
    lcd.setCursor(0,1);
    lcd.print("       ");  
    lcd.setCursor(9,1);
    lcd.print("       ");  
  }


  progbar=map(now.second(),0,60,0,80);


  for (int i = 0; i<(progbar/5); i++)
  {

    lcd.setCursor(i, 1);   
    lcd.write(B11111111);

  }


  lcd.setCursor(progbar/5, 1);   
  if(progbar%5<4){
    lcd.write(progbar%5);
  }
  else{
    lcd.write(B11111111);
  }


  lcd.setCursor(7, 1);
  printDigits(now.second());

}



void printDigits(int digits){
  // utility function for digital clock display: prints preceding colon and leading 0


  if(digits < 10){

    lcd.print('0');
  }

  lcd.print(digits);
}

  1. День добрый.

    Появилась небольшая проблема. Подключил дисплей к конвертеру i2c и пытаюсь вывести элементарный текст из примера. Но он не выводится.

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2);  

    void setup()
    {
      lcd.init();                      // Инициализация lcd          
      lcd.backlight();                  // Включаем подсветку
      // Курсор находится в начале 1 строки
      lcd.print(«Hello world1»);      // Выводим текст
      lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
      lcd.print(«Hello world2»);    // Выводим текст
    }
    int i;
    void loop()
    {
    }

    Методом научного тыка понял как вывести его, а именно добавить в loop повтор вывода.

    void loop()
    {
      lcd.setCursor(0, 0);
      lcd.print(«TExt1»);      // Выводим текст
      lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
      lcd.print(«TExt2»);    // Выводим текст
    }

    Но как я понял, ардуино постоянно перезаписывает текст на экран, а это не то что нужно. Плюс если вставить delay, то ничего не выводится.

    Подскажите пожалуйста, в какую сторону копать?
    Необходимо получить вывод статического текста(1 раз передали на экран, и только в случае чего, перезаписываем).

  2. попробуй после lcd.init(); сделать небольшую паузу.

  3. А разве в библиотеке нет примеров?

  4. Не помогает(Есть, смысл в них тот же.

    //DFRobot.com
    //Compatible with the Arduino IDE 1.0
    //Library version:1.1
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2);  // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
      lcd.init();                      // initialize the lcd

      // Print a message to the LCD.
      lcd.backlight();
      lcd.print(«Hello, world!»);
    }

    void loop()
    {
    }

  5. В дополнение, возился с ним 2 часа. И если я подключаю напрямую проводами (без конвертера i2c), то вот этот код выводит на экран.

    #include <LiquidCrystal.h>

    LiquidCrystal lcd(7, 8, 9, 10, 11 , 12);

    void setup() {
      lcd.begin(16, 2);
      lcd.print(«Hello world1»);      // Выводим текст
      lcd.setCursor(0, 1);              // Устанавливаем курсор в начало 2 строки
      lcd.print(«Hello world2»);    // Выводим текст
    }

    void loop() { }

    Получается у меня косяк либо в конвертере, либо в библиотеке?

    UPD:
    Сам конвертер выглядит вот так.
    [​IMG]
    Я так понимаю что косяк скорее всего в экране, а именно в задействованных пинах. Они вроде у разных экранов по разному используются. Тогда возникает вопрос, где бы мне их поправить?

    Последнее редактирование: 27 окт 2014

  6. /DFRobot.com
    //Compatible with the Arduino IDE 1.0
    //Library version:1.1
    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
    lcd.init(); // initialize the lcd

    // Print a message to the LCD.
    lcd.backlight();
    lcd.print(«Hello, world!»);
    }

    void loop()
    {
    }

    у меня эта же библиотека ,работает нормально

    Последнее редактирование: 27 окт 2014

  7. Случаем никаких ошибок не выдает при компиляции. Может другую библиотеку использовать. При включении дисплей загорается с использованием I2C конвертера. Что отображается?

  8. Этот код будет выполняться, так как экранчик будет постоянно перезаписываться (от этого он довольно тусклый).

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

    Вечером буду дальше ковырять.

  9. Я вставлял delay(1000) для того чтобы он не очень быстро перезаписывался . Убрать delay() тогда будет тускло светиться,Будет оч быстро пытаться обновляться — п даташиту надо задержку для обновления экрана

  10. Да, мне по сути и перезапись постоянная не нужна. Экранчик используется для выбора меню. А если поставить задержку, то ничего выводиться не будет.

  11. Почему не будет. Напиши пример вывода меню. Я пробовал выводить три меню циклически от одной кнопки, нормально работает. Использовал swith() …case

  12. Дело не в меню.

    Вот этот код будет выводить на экран текст.

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
    lcd.init(); // initialize the lcd

    // Print a message to the LCD.
    lcd.backlight();
    }

    void loop()
    {
    lcd.print(«Hello, world!»);
    }

    А вот этот не будет показывать на экране ничего. (по факту должен моргать словом)

    #include <Wire.h>
    #include <LiquidCrystal_I2C.h>

    LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x27 for a 16 chars and 2 line display

    void setup()
    {
    lcd.init(); // initialize the lcd

    // Print a message to the LCD.
    lcd.backlight();
    }

    void loop()
    {
    lcd.clear();
    delay(3000);
    lcd.print(«Hello, world!»);
    delay(3000);
    }

    Вечером могу видео залить

  13. Так, экран заработал.

    Подключил вторую плату i2c и попробовал с ней. Она работает с любой библиотекой.
    Тут выходит 2 варианта. Либо 1 плата кривая, либо у меня руки кривые и когда я паял, что то закосячил.
    Всем спасибо за попытки помочь!

Библиотека:

Для работы с символьными графическими дисплеями предлагаем воспользоваться библиотекой LiquidCrystal которая входит в стандартный набор Arduino IDE и предназначена для работы по 8-битному (4-битному) параллельному интерфейсу. Если Ваш дисплей подключается к Arduino по аппаратной шине I2, то Вам нужно установить библиотеку LiquidCrystal_I2C (большинство функций которой повторяют функции первой библиотеки).

Поддерживаемые дисплеи:

Дисплей Подключение и инициализация
LCD1602 — символьный дисплей (16×02 символов),
с параллельным интерфейсом (синий)
#include <LiquidCrystal.h>
LiquidCrystal lcd( 2 , 3 , 4 , 5 , 6 , 7 [ , 8 , 9 , 10 , 11 ] );
void setup(){ lcd.begin( 16 , 2 ); }

// Пояснение:
LiquidCrystal ОБЪЕКТ ( RS , E , D4 , D5 , D6 , D7 );
void setup(){ ОБЪЕКТ.begin( КОЛ_СТОЛБЦОВ , КОЛ_СТРОК ); }

Подключение дисплея LCD1602 к Arduino

// Если используется 8 проводов шины данных, то указываем их все
LiquidCrystal ОБЪЕКТ ( RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 );

LCD1602 I2C — символьный дисплей (16×02 символов),
с интерфейсом I2C (синий)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd( 0x27 или 0x3F , 16 , 2 );
void setup(){ lcd.init(); }

// Пояснение:
LiquidCrystal_I2C ОБЪЕКТ ( АДРЕС_I2C , КОЛ_СТОЛБЦОВ , КОЛ_СТРОК );
// АДРЕС_I2C может быть либо 0x27, либо 0x3F
Подключение дисплея LCD1602 I2C к Arduino

LCD1602 I2C — символьный дисплей (16×02 символов),
с интерфейсом I2C (зелёный)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd( 0x27 или 0x3F , 16 , 2 );
void setup(){ lcd.init(); }

// Пояснение:
LiquidCrystal_I2C ОБЪЕКТ ( АДРЕС_I2C , КОЛ_СТОЛБЦОВ , КОЛ_СТРОК );
// АДРЕС_I2C может быть либо 0x27, либо 0x3F
Подключение дисплея LCD1602 I2C к Arduino

LCD2004 — символьный дисплей (20×04 символов),
с параллельным интерфейсом (синий)
#include <LiquidCrystal.h>
LiquidCrystal lcd( 2 , 3 , 4 , 5 , 6 , 7 [ , 8 , 9 , 10 , 11 ] );
void setup(){ lcd.begin( 20 , 4 ); }

// Пояснение:
LiquidCrystal ОБЪЕКТ ( RS , E , D4 , D5 , D6 , D7 );
void setup(){ ОБЪЕКТ.begin( КОЛ_СТОЛБЦОВ , КОЛ_СТРОК ); }

Подключение дисплея LCD2004 к Arduino

// Если используется 8 проводов шины данных, то указываем их все
LiquidCrystal ОБЪЕКТ ( RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 );

LCD2004 I2C — символьный дисплей (20×04 символов),
с интерфейсом I2C (синий)
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd( 0x27 или 0x3F , 20 , 4 );
void setup(){ lcd.init(); }

// Пояснение:
LiquidCrystal_I2C ОБЪЕКТ ( АДРЕС_I2C , КОЛ_СТОЛБЦОВ , КОЛ_СТРОК );
// АДРЕС_I2C может быть либо 0x27, либо 0x3F

#1 Пример

Выводим надпись на дисплей LCD1602 подключённый по шине I2C. Для работы с дисплеем LCD2004 нужно изменить 3 строку на LiquidCrystal_I2C lcd(0x27,20,4);

#include <Wire.h>                     //  Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>        //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2);     //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
                                      //  Если надпись не появилась, замените адрес 0x27 на 0x3F
void setup(){                         //
    lcd.init();                       //  Инициируем работу с LCD дисплеем
    lcd.backlight();                  //  Включаем подсветку LCD дисплея
    lcd.setCursor(0, 0);              //  Устанавливаем курсор в позицию (0 столбец, 0 строка)
    lcd.print("LCD");                 //  Выводим текст "LCD", начиная с установленной позиции курсора
    lcd.setCursor(0, 1);              //  Устанавливаем курсор в позицию (0 столбец, 1 строка)
    lcd.print("www.iarduino.ru");     //  Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора
}                                     //
                                      //
void loop(){}                         //  Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#2 Пример

Выводим надпись на дисплей LCD1602 подключённый по 4-битной параллельной шине. Для работы с дисплеем LCD2004 нужно изменить 5 строку на lcd.begin(20, 4);

#include <LiquidCrystal.h>            //  Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем
LiquidCrystal lcd(2,3,4,5,6,7);       //  Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7)
                                      //  Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7)
void setup(){                         //
    lcd.begin(16, 2);                 //  Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк)
    lcd.setCursor(0, 0);              //  Устанавливаем курсор в позицию (0 столбец, 0 строка)
    lcd.print("LCD2004");             //  Выводим текст "LDC1602", начиная с установленной позиции курсора
    lcd.setCursor(0, 1);              //  Устанавливаем курсор в позицию (0 столбец, 1 строка)
    lcd.print("www.iarduino.ru");     //  Выводим текст "www.iarduino.ru", начиная с установленной позиции курсора
}                                     //
                                      //
void loop(){}                         //  Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#3 Пример

Выводим надпись «Русский язык» на дисплей LCD1602 подключённый по шине I2C:

#include <Wire.h>                     //  Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>        //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2);     //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
                                      //
uint8_t symbol[6][8] = {              //  Объявляем массив из 6 собственных символов (к и й я з ы), каждый символ состоит из 8 байт
        { 0, 0,18,20,24,20,18, 0 },   //  к
        { 0, 0,17,19,21,25,17, 0 },   //  и
        {10, 4,17,19,21,25,17, 0 },   //  й
        { 0, 0,15,17,15, 5, 9, 0 },   //  я
        { 0, 0,14,17, 6,17,14, 0 },   //  з
        { 0, 0,17,17,29,19,29, 0 }};  //  ы
                                      //
void setup(){                         //
    lcd.init();                       //  Инициируем работу с LCD дисплеем
    lcd.backlight();                  //  Включаем подсветку LCD дисплея
    lcd.createChar(1, symbol[0]);     //  Загружаем 1 символ "к" в ОЗУ дисплея
    lcd.createChar(2, symbol[1]);     //  Загружаем 2 символ "и" в ОЗУ дисплея
    lcd.createChar(3, symbol[2]);     //  Загружаем 3 символ "й" в ОЗУ дисплея
    lcd.createChar(4, symbol[3]);     //  Загружаем 4 символ "я" в ОЗУ дисплея
    lcd.createChar(5, symbol[4]);     //  Загружаем 5 символ "з" в ОЗУ дисплея
    lcd.createChar(6, symbol[5]);     //  Загружаем 6 символ "ы" в ОЗУ дисплея
    lcd.setCursor(0, 0);              //  Устанавливаем курсор в позицию (0 столбец, 0 строка)
    lcd.print("Pycc123 4561"); //  Выводим текст "Pycckий языk", где "Pycc" написано латиницей, а "kий языk" - символами из ОЗУ дисплея
}                                     //  Если нужно вывести символ из ОЗУ дисплея, то пишем  и номер символа
                                      //
void loop(){}                         //  Код внутри функции loop выполняется постоянно. Но так как мы выводим статичный текст, нам достаточно его вывести 1 раз при старте, без использования кода loop

#4 Пример

Выводим время прошедшее после старта на дисплей LCD1602 подключённый по шине I2C:

#include <Wire.h>                          //  Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>             //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2);          //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
                                           //
uint8_t  tim_D, tim_H, tim_M, tim_S;       //  Объявляем  переменные для хранения дней, часов, минут и секунд.
uint32_t tim;                              //  Объявляем  переменную для хранения общего количества времени прошедшего после старта.
                                           //  Если надпись не появилась, замените адрес 0x27 на 0x3F
void setup(){                              //
    lcd.init();                            //  Инициируем работу с LCD дисплеем
    lcd.backlight();                       //  Включаем подсветку LCD дисплея
}                                          //
                                           //
void loop(){                               //
//  Получаем время прошедшее после старта: //
    tim   =  millis()   / 1000;            //  Получаем общее количество секунд (максимум 4'294'967 сек ≈ 49,7 дней).
    tim_S =  tim        % 60;              //  Получаем секунды: остаток от деления всех секунд на минуту (60 сек).
    tim   = (tim-tim_S) / 60;              //  Получаем общее количество минут.
    tim_M =  tim        % 60;              //  Получаем минуты: остаток от деления всех минут на час (60 мин).
    tim   = (tim-tim_M) / 60;              //  Получаем общее количество часов.
    tim_H =  tim        % 24;              //  Получаем часы: остаток от деления всех часов на день (24 час).
    tim_D = (tim-tim_H) / 24;              //  Получаем общее количество дней.
//  Выводим время прошедшее после старта:  //
    if (millis()%1000<100){                //  Условие выполняется в течении 100 первых миллисекунд каждой новой секунды.
        delay(100);  lcd.setCursor(0, 0);  //  Устанавливаем курсор в позицию (0 столбец, 0 строка).
                     lcd.print("Days: ");  //  Выводим текст.
        if(tim_D<10){lcd.print( 0      );} //  Выводим 0 перед количеством дней.
                     lcd.print(tim_D   );  //  Выводим количество дней.
                     lcd.setCursor(0, 1);  //  Устанавливаем курсор в позицию (0 столбец, 1 строка)
                     lcd.print("Time: ");  //  Выводим текст.
        if(tim_H<10){lcd.print( 0      );} //  Выводим 0 перед количеством часов.
                     lcd.print(tim_H   );  //  Выводим количество часов.
                     lcd.print(':'     );  //  Выводим символ.
        if(tim_M<10){lcd.print( 0      );} //  Выводим 0 перед количеством минут.
                     lcd.print(tim_M   );  //  Выводим количество минут.
                     lcd.print(':'     );  //  Выводим символ.
        if(tim_S<10){lcd.print( 0      );} //  Выводим 0 перед количеством секунд.
                     lcd.print(tim_S   );  //  Выводим количество секунд.
    }                                      //
}                                          //

Функции, общие для библиотек LiquidCrystal и LiquidCrystal_I2C:

  • begin(cols,rows,[char_size]); – Инициализация дисплея с указанием количества столбцов, строк и размера символа.
  • clear(); – Очистка дисплея с установкой курсора в положение 0,0 (Занимает много времени!).
  • home(); – Установка курсора в положение 0,0 (Занимает много времени!).
  • display(); – Быстрое включение дисплея (без изменения данных в ОЗУ).
  • noDisplay(); – Быстрое выключение дисплея (без изменения данных в ОЗУ).
  • blink(); – Включение мигающего курсора (с частотой около 1 Гц).
  • noBlink(); – Выключение мигающего курсора.
  • cursor(); – Включение подчеркивания курсора.
  • noCursor(); – Выключение подчеркивания курсора.
  • scrollDisplayLeft(); – Прокрутка дисплея влево. Сдвиг координат дисплея на один столбец влево (без изменения ОЗУ).
  • scrollDisplayRight(); – Прокрутка дисплея вправо. Сдвиг координат дисплея на один столбец вправо (без изменения ОЗУ).
  • leftToRight(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец вправо.
  • rightToLeft(); – Указывает в дальнейшем сдвигать положение курсора, после вывода очередного символа, на один столбец влево.
  • noAutoscroll(); – Указывает в дальнейшем выравнивать текст по левому краю от позиции курсора (как обычно).
  • autoscroll(); – Указывает в дальнейшем выравнивать текст по правому краю от позиции курсора.
  • createChar(num,array); – Запись пользовательского символа в CGRAM дисплея под указанным номером.
  • setCursor(col,row); – Установка курсора в позицию указанную номером колонки и строки.
  • print(data); – Вывод текста, символов или цифр на экран дисплея. Синтаксис схож с одноимённой функцией класса Serial.

Функции, реализованные только в библиотеке LiquidCrystal_I2C:

  • init(); – Инициализация дисплея. Должна быть первой командой библиотеки LiquidCrystal_I2C после создания объекта. На самом деле данная функция есть и в библиотеке LiquidCrystal, но в той библиотеке она вызывается автоматически (по умолчанию) при создании объекта.
  • backlight(); – Включение подсветки дисплея.
  • noBacklight(); – Выключение подсветки дисплея.
  • setBacklight(flag); – Управление подсветкой (true — включить / false — выключить), используется вместо функций noBacklight и backlight.

Подключение:

// Для шины I2C:
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd( address , col , row );
void setup(){
lcd.init();
}

Параметр:

  • address: Адрес дисплея на шине I2C — 0x27 или 0x3F
  • col: количество столбцов реализованное у дисплея
  • row: количество строк реализованное у дисплея
// Для параллельной шины из 4 проводов:
#include <LiquidCrystal.h>
LiquidCrystal lcd( RS , E , D4 , D5 , D6 , D7 );
void setup(){
lcd.begin( col , row );
}
Параметр:

  • RS: № вывода Arduino к которому подключён вывод RS
  • E: № вывода Arduino к которому подключён вывод E
  • D0…D3: № выводов Arduino к которым подключены выводы D0-D3
  • D4…D7: № выводов Arduino к которым подключены выводы D4-D7
  • col: количество столбцов реализованное у дисплея
  • row: количество строк реализованное у дисплея
// Для параллельной шины из 8 проводов:
#include <LiquidCrystal.h>
LiquidCrystal lcd( RS , E , D0 , D1 , D2 , D3 , D4 , D5 , D6 , D7 );
void setup(){
lcd.begin( col , row );
}
begin( col , row , [size] );
Инициализация дисплея с указанием размеров экрана и символов.
Параметр:

  • col: количество столбцов реализованное у дисплея
  • row: количество строк реализованное у дисплея
  • size: размер символов, указывается константой:
    LCD_5x8DOTS (по умолчанию), или LCD_5x10DOTS
/* Для шины I2C:                      */
#include <Wire.h>                     //  Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>        //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x3F,20,4);     //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x3F, количество столбцов = 20, количество строк = 4)
                                      //
void setup(){                         //
    lcd.init();                       //  Инициируем работу с LCD дисплеем
    lcd.backlight();                  //  Включаем подсветку LCD дисплея
    ...                               //  Выводим информацию, которая должна отображаться при старте
}                                     //
                                      //
void loop(){}                         //
    ...                               //  Выводим информацию которая должна меняться по алгоритму Вашего кода
}                                     //
/* Для 4 проводной параллельной шины: */
#include <LiquidCrystal.h>            //  Подключаем библиотеку LiquidCrystal для работы с LCD дисплеем
LiquidCrystal lcd(2,3,4,5,6,7);       //  Объявляем объект библиотеки, указывая выводы дисплея (RS,E,D4,D5,D6,D7)
                                      //  Если используется 8 проводов шины данных, то указываем (RS,E,D0,D1,D2,D3,D4,D5,D6,D7)
void setup(){                         //
    lcd.begin(16, 2);                 //  Инициируем работу с LCD дисплеем, указывая количество (столбцов, строк)
    ...                               //  Выводим информацию, которая должна отображаться при старте
}                                     //
                                      //
void loop(){}                         //
    ...                               //  Выводим информацию которая должна меняться по алгоритму Вашего кода
}                                     //

Функции управления дисплеем:

display();
Включает дисплей после того как он был выключен функцией noDisplay.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
noDisplay();
Выключает дисплей.
Данные на дисплее не будут отображаться до вызова функции display, но и не сотрутся из памяти ОЗУ, а после вызова функции display, опять будут отображаться.
Примечание: Функция выполняется быстро и без изменений в ОЗУ дисплея.
scrollDisplayLeft();
Сдвигает координаты дисплея на один столбец влево.
Постоянный вызов данной функции создаст эффект бегущей строки.
Координаты сдвигаются как для имеющейся на дисплее информации, так и для той, которая будет выведена после.
Примечание: Функция выполняется без изменений ОЗУ дисплея.
Если вызвать функцию 40 раз подряд, то координата вернётся в изначальную точку
scrollDisplayRight();
Сдвигает координаты дисплея на один столбец вправо.
Постоянный вызов данной функции создаст эффект бегущей строки.
Координаты сдвигаются как для имеющейся на дисплее информации, так и для той, которая будет выведена после.
Примечание: Функция выполняется без изменений ОЗУ дисплея.
Если вызвать функцию 40 раз подряд, то координата вернётся в изначальную точку
clear();
Очистка дисплея с установкой курсора в положение 0,0.
Информация имеющаяся на дисплее безвозвратно сотрётся.
Примечание: Занимает много времени.
backlight();
Включение подсветки дисплея.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
noBacklight();
Выключение подсветки дисплея.
Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.
setBacklight( flag );
Управление подсветкой (вместо функций noBacklight и backlight).
Параметр:

  • flag: значение true — включает, а false — выключает подсветку.

Примечание: Функция реализована только в библиотеке LiquidCrystal_I2C.

/*  Выводим надпись для наблюдения за функциями управления дисплеем: */
    lcd.cursor(0,0);                  //  Устанавливаем курсор в крайний верхний угол дисплея (0 столбец, 0 строка)
    lcd.print("iarduino.ru");         //  Выводим текст "iarduino.ru" (первая буква "i" будет находиться в позиции "0,0", а последняя "u" в позиции "10,0", невидимый курсор в позиции "11,0")
                                      //
    lcd.noDisplay();                  //  Выключаем дисплей (надпись исчезнет с дисплея)
    lcd.display();                    //  Включаем дисплей (надпись появится на дисплее в том же месте)
    lcd.scrollDisplayLeft();          //  Сдвигаем координаты столбцов влево  (на дисплее будет отображаться "arduino.ru" без первой буквы "i", которая выйдет за пределы дисплея, но останется в его ОЗУ)
    lcd.scrollDisplayRight();         //  Сдвигаем координаты столбцов вправо (на дисплее будет отображаться "iarduino.ru" на том же месте, где и была выведена изначально)
    lcd.clear();                      //  Чистим дисплей (надпись безвозвратно исчезнет с дисплея)
    lcd.noBacklight();                //  Отключаем подсветку дисплея
    lcd.backlight();                  //  Включаем  подсветку дисплея
    lcd.setBacklight(0);              //  Отключаем подсветку дисплея
    lcd.setBacklight(1);              //  Включаем  подсветку дисплея

Функции управления курсором:

setCursor( col , row );
Установка курсора в указанную позицию.
Параметр:

  • col: номер столбца (начиная с 0).
  • row: номер строки (начиная с 0)
home();
Установка курсора в позицию 0,0. Работает как функция setCursor(0,0);
Примечание: Занимает много времени.
blink();
Включение мигающего курсора.
Примечание: Курсор занимает всё поле символа и мигает с частотой около 1 Гц, в той позиции где он был установлен ранее.
noBlink();
Выключение мигающего курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.
cursor();
Включение подчеркивания курсора.
Примечание: Курсор принимает вид символа подчёркивания и находится в той позиции, где он был установлен ранее.
noCursor();
Выключение подчеркивания курсора.
Примечание: Курсор становится невидим, но его позиция сохраняется.
    lcd.setCursor( 0, 1);             //  Устанавливаем курсор на первый символ второй строки (нумерация строк и столбцов начинается с 0)
    lcd.home();                       //  Устанавливаем курсор на первый символ первой строки (как при вызове lcd.setCursor(0,0);)
    lcd.blink();                      //  Делаем курсор видимым (на месте курсора будет мигать прямоугольник)
    lcd.noBlink();                    //  Делаем курсор невидимым (убираем мигающий прямоугольник)
    lcd.cursor();                     //  Делаем курсор видимым (на месте курсора появится знак подчёркивания)
    lcd.noCursor();                   //  Делаем курсор невидимым (убираем знак подчёркивания)
                                      //  Если курсор попадает на место где есть символ, то этот символ не исчезает

Функции указывающие направление и выравнивание:

leftToRight();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец вправо.
Примечание: Если вывести текст «abc» на дисплее отобразится «abc» и текст будет находиться правее от изначального положения курсора.
(Как обычно)
rightToLeft();
Указывает, что после каждого нового символа, положение курсора должно сдвигаться на один столбец влево.
Примечание: Если вывести текст «abc» на дисплее отобразится «cba» и текст будет находиться левее от изначального положения курсора.
(Письменность справа налево)
noAutoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по левому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться первый символ выведенного текста.
(Как обычно)
autoscroll();
Указывает, что в дальнейшем, текст нужно выравнивать по правому краю от изначальной позиции курсора.
Примечание: если установить курсор в позицию 10,0 и вывести текст, то в данной позиции будет находиться курсор.
(Координаты дисплея будут сдвинуты влево, как будто Вы вызвали функцию scrollDisplayLeft столько раз, сколько букв в выведенном тексте)
    lcd.leftToRight();                //  Указываем курсору сдвигаться вправо                           (Как обычно в европейской письменности)
    lcd.clear(); lcd.setCursor(5,0);      lcd.print("ABC");   //  На дисплее увидим: "     ABC        " (После "A" курсор сдвинулся вправо и вывелась "B", далее курсор сдвинулся вправо и вывелась "C")
    lcd.rightToLeft();                //  Указываем курсору сдвигаться влево                            (Как в письменности справа налево)
    lcd.clear(); lcd.setCursor(5,0);      lcd.print("ABC");   //  На дисплее увидим: "   CBA          " (После "A" курсор сдвинулся влево и вывелась "B", далее курсор сдвинулся влево и вывелась "C")
    lcd.noAutoscroll();               //  Устанавливаем выравнивание по левому краю                     (Как обычно)
    lcd.clear(); lcd.setCursor(5,0);      lcd.print("ABC");   //  На дисплее увидим: "     ABC        " (Как обычно)
    lcd.autoscroll();                 //  Устанавливаем выравнивание по правому краю                    (Координаты дисплея будут сдвинуты влево на количество выведенных символов)
    lcd.clear(); lcd.setCursor(5,0);      lcd.print("ABC");   //  На дисплее увидим: "  ABC           " (Координаты дисплея будут сдвинуты на 3 символа влево, так как после каждого символа совершается вызов функции scrollDisplayLeft)

Функции ввода текста и символов:

createChar(num,array);
Запись пользовательского символа в CGRAM дисплея под указанным номером.
Если Вы хотите вывести текст (функцией print) в котором должен находиться установленный Вами символ, укажите слэш и номер под которым был записан этот символ: print(«C1MBO2»).
Параметр:

  • num: номер под которым будет записан символ (от 1 до 7).
  • array: массив представляющий записываемый символ.

Примечание: Массив состоит из нескольких байт, количество которых равно количеству строк в символе. Каждый установленный бит байта соответствует установленному (отображаемому) пикселю символа.

print(data);
Вывод текста, символов или цифр на экран дисплея.
Допускается указывать второй параметр, как у одноимённой функции класса Serial.
Параметр:

  • text: символ, число или строка для вывода на дисплей.

Примечание: Синтаксис схож с одноимённой функцией класса Serial.
В выводимую строку можно вставить код символа в восьмеричной системе, которому должен предшествовать обратный слеш:
print(«Temp=5337C»); // код 337 это символ °.
Можно указывать коды в 16-ричной системе, добавив ‘x’ после слеша: xDF.
Символы с кодами 1 — 7 хранятся в CGRAM дисплея, изображение этих символов можно менять функцией createChar().

#include <Wire.h>                 //  Подключаем библиотеку для работы с шиной I2C
#include <LiquidCrystal_I2C.h>    //  Подключаем библиотеку для работы с LCD дисплеем по шине I2C
LiquidCrystal_I2C lcd(0x27,16,2); //  Объявляем  объект библиотеки, указывая параметры дисплея (адрес I2C = 0x27, количество столбцов = 16, количество строк = 2)
                                  //
uint8_t symbol_d[8] = {0b00000,   //  1 строка символа "д"
                       0b00000,   //  2 строка символа "д"
                       0b00110,   //  3 строка символа "д"
                       0b01010,   //  4 строка символа "д"
                       0b01010,   //  5 строка символа "д"
                       0b01010,   //  6 строка символа "д"
                       0b11111,   //  7 строка символа "д"
                       0b10001};  //  8 строка символа "д"   Весь массив можно записать одной строкой: uint8_t symbol_d[8]={0,0,6,10,10,10,31,17};
                                  //
uint8_t symbol_i[8] = {0b00000,   //  1 строка символа "и"
                       0b00000,   //  2 строка символа "и"
                       0b10001,   //  3 строка символа "и"
                       0b10011,   //  4 строка символа "и"
                       0b10101,   //  5 строка символа "и"
                       0b11001,   //  6 строка символа "и"
                       0b10001,   //  7 строка символа "и"
                       0b00000};  //  8 строка символа "и"   Весь массив можно записать одной строкой: uint8_t symbol_i[8]={0,0,17,19,21,25,17,0};
void setup(){                     //
    lcd.init();                   //  Инициируем работу с LCD дисплеем
    lcd.backlight();              //  Включаем подсветку LCD дисплея
    lcd.createChar(1,symbol_d);   //  Загружаем в память дисплея первый символ
    lcd.createChar(2,symbol_i);   //  Загружаем в память дисплея второй символ
    lcd.clear();                  //  Чистим экран
    lcd.setCursor(0,0);           //  Устанавливаем курсор в крайний верхний угол
    lcd.print("Pa12o");         //  Выводим текст "Paдиo" при этом символы 'P', 'a' , 'o' пишем латиницей,
}                                 //  а символы 'д', 'и' выводим из памяти дисплея, указывая их номера
                                  //
void loop(){                      //
    lcd.setCursor(0,1);  lcd.print("                ");                          // стираем всю нижнюю строку
    lcd.setCursor(0,1);  lcd.print("i"); lcd.print("arduino"); lcd.print(".ru"); // выводим текст "i" "arduino" ".ru" в нижней строке
    delay(2000);                                                                 // ждём 2 секунды
    lcd.setCursor(0,1);  lcd.print("                ");                          // стираем всю нижнюю строку
    lcd.setCursor(0,1);  lcd.print(12.345);                                      // выводим число 12.34 (выводится 2 знака после запятой)
    delay(2000);                                                                 // ждём 2 секунды
    lcd.setCursor(0,1);  lcd.print("                ");                          // стираем всю нижнюю строку
    lcd.setCursor(0,1);  lcd.print(12, HEX);                                     // выводим число 12 в виде шестнадцатиричного числа
    delay(2000);                                                                 // ждём 2 секунды
    lcd.setCursor(0,1);  lcd.print("                ");                          // стираем всю нижнюю строку
    lcd.setCursor(0,1);  lcd.print(1);                                           // выводим число 1
    delay(2000);                                                                 // ждём 2 секунды
}

0 / 0 / 0

Регистрация: 02.03.2016

Сообщений: 90

1

17.03.2021, 10:48. Показов 833. Ответов 3


Начал использовать дисплей LCD 20х4 MT-20S4-v3, MT-20S4A-2YLG-I (фото обратной стороны будет ниже). Когда я пробовал выводить текст и разместил эти строчки в функции void setup(), вывод текста на экран прошел без ошибок. А потом я попробовал выводить текст из переменных, используя функцию void loop() (текст программы ниже), но при выводе на экран появились ошибочные символы в конце первой, второй и четвертой строк. (на картинке подчеркнуты красным цветом), и еще если в функции delay(..) записывать маленькое значение то текст на экране начинает так быстро моргать, что ни чего не видно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
// подключаем библиотеку Wire
#include <Wire.h>
// подключае библиотеку LiquidCrystal_I2C
#include <LiquidCrystal_I2C.h>
 
/* создаем объект-экран, передаём используемый адрес
     и разрешение экрана: */
LiquidCrystal_I2C lcd(0x38, 20, 4);
 
// создаём переменные, которые будем выводить на экран
int tC, PmHg;
 
void setup()
   {
      // инициализируем экран
      lcd.init();
      // вкдючаем подсветку
      lcd.backlight();
    }
 
void loop()
   {
      // очищаем дисплей
      lcd.clear();
      // записываем в переменную tC значение температуры
      tC=10;
      // записываем в переменную значения давления
      PmHg=720;
 
      // устанавливаем курсор и выводим результат на дисплей
      // устанавливаем курсор в колонку 0, строку 0
      lcd.setCursor(0, 0);
      // печатаем первую строку      
      lcd.println("Atmosfernoe");
      /* устанавливаем курсор в колонку 8, строку 1, на самом деле
          это вторая строка, т.к. нумерация начинаеца с нуля */
      lcd.setCursor(0, 1);
      // печатаем вторую строку
      lcd.print("Davlenie = ");
      lcd.print(PmHg);
      lcd.println("mmHg");
      // устанавливаем курсор в колонку 0, строку 2
      lcd.setCursor(0, 2);
      // печатаем третью строку
      lcd.print("Temperatura");
      // устанавливаем курсор в колонку 5, строку 3
      lcd.setCursor(0, 3);
      // печатаем четвертую строку
      lcd.print(" T = ");
      lcd.print(tC);
      lcd.println("x99""C");
      delay(10000);
    }

Миниатюры

LCD, ошибки вывода данных
 

LCD, ошибки вывода данных
 

__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь



0



0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии

А вот еще интересные материалы:

  • Яшка сломя голову остановился исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного исправьте ошибки
  • Ясность цели позволяет целеустремленно добиваться намеченного где ошибка
  • Lc32d44 сервисный режим сброс ошибок
  • Lc1 ошибка самсунг как сбросить