Arduino lcd begin ошибка

Добрый день ГУРУ.Подскажите новичку. Повторяю игрушку с сайта АРДУИНО. При компиляции скетча выдает ошибку Если строку убрать то ошибки нет. Автору...
  1. Добрый день ГУРУ.Подскажите новичку. Повторяю игрушку с сайта АРДУИНО. При компиляции скетча выдает ошибку Если строку убрать то ошибки нет. Автору программы дает ссылку на библиотеку. И пишет что это помогает. Скачал и подключил. Но ошибка так и осталось . А если я убираю эту строку ошибки нет

    #include <LiquidCrystal.h>
    #include <Wire.h>
    #include <Servo.h>
    #include <LiquidCrystal_I2C.h>
    #define TOT_TARGETS 4
    #define TOT_SENSORS 4
    #define PIN_TARGET 7

    LiquidCrystal_I2C lcd(0x27, 16, 2 );
    Servo Targets[ TOT_TARGETS];  //Сервопривод
    int targetSensor[]  =  { A0, A1, A2, A3};   // Датчикb фоторезисторов
    int readingSensor[ TOT_SENSORS] ;
    int targetTimer[]  =  { 0 , 0 , 0 , 0 } ;
    int score =  0;
    int timer =  100;
    unsigned long interval =  100; // time we need to wait
    unsigned long previousMillis =  0;  // millis()  returns an unsigned long.

    void setup() {
    Serial.begin( 9600);

    lcd.backlight();
    lcd.clear();
    lcd.begin();
    lcd.setCursor( 0, 0 );
    lcd.print(«SCORE: 0»);
    lcd.setCursor( 0, 1);
    lcd.print(«TIMER: 0»);

    //attaches the servos from pin 7  to 10
      for (int targetNumber =  0 ;  targetNumber < TOT_TARGETS;  targetNumber++)
      {
    Targets[ targetNumber] .attach( targetNumber + PIN_TARGET);
    Targets[ targetNumber] .write(0 ) ;
      }
    }

    void loop()  {

    lcd.clear();
    lcd.setCursor( 0, 0); // (Column,Row)
    lcd.print(«SCORE: «);
    lcd.setCursor( 12, 0);
    lcd.print( score);
    lcd.setCursor( 0, 1); // (Column,Row)
    lcd.print(«TIME: «);
    lcd.setCursor( 12, 1);
    lcd.print(timer);

    unsigned long currentMillis =  millis() ;  // grab current time

    // check if «interval» time has passed (100 milliseconds)
      if ((unsigned long)(currentMillis previousMillis) >= interval) {

        for (int targetsensorNumber = 0; targetsensorNumber < TOT_SENSORS; targetsensorNumber++) {
    readingSensor[targetsensorNumber] = analogRead({(targetSensor[targetsensorNumber])});
        }
        previousMillis = millis();
    Serial.print(readingSensor[1]);
    Serial.println(readingSensor[2]);
      }
    villainTarget();
    targetDown();
    ifZero();
    Countdowntimer();

     
    }

    void villainTarget() {

    int target = random(1, 5);
    delay(10);
      if (target == 1) {
    targetTimer[0]++;
    Targets[0].write(90 );
    delay( 10 );
        if (targetTimer[ 0 ]  ==  2 ) {
    targetTimer[ 0]  =  0 ;
    Targets[ 0].write(0);
    delay( 10);
        }
      }  else if ( target ==  2)  {
    targetTimer[ 1]++;
    Targets[ 1 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 1 ]  ==  2)  {
    targetTimer[ 1 ]  =  0;
    Targets[ 1 ] .write(0);
    delay( 10);
        }

      }  else if ( target ==  3)  {
    targetTimer[ 2]++;
    Targets[ 2 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 2 ]  ==  2)  {
    targetTimer[ 2 ]  =  0;
    Targets[ 2 ] .write(0);
    delay( 10);
        }
      }  else if ( target ==  4)  {
    targetTimer[ 3]++;
    Targets[ 3 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 3 ]  ==  2)  {
    targetTimer[ 3 ]  =  0;
    Targets[ 3 ] .write( 0 );
    delay( 10 );
        }
      }
    }

    void targetDown() {
    //Sith Trooper
      if (readingSensor[ 0] >> 450 )  {
    score++;
    Targets[ 0].write( 0 );
    delay( 100 );
      }
    //Sith Trooper
      if (readingSensor[ 1] >> 990 )  {
    score++;
    Targets[ 1].write( 1 );
    delay( 100 );
      }
    // Palpatine
      if (readingSensor[ 2] >> 990 )  {
        score =  score + 5 ;
    Targets[ 2].write( 2 );
    delay( 100 );
      }
    //Sith Trooper
      if (readingSensor[ 3] >> 985 )  {
    score++;
    Targets[ 3].write( 3);
    delay( 100);
      }
    }

    void Countdowntimer()  {
    timer;
    delay( 1000);
    }

    void ifZero()  {
      if ( timer ==  0)  {
        for ( int targetNumber =  0 ;  targetNumber < TOT_TARGETS;  targetNumber++)
        {
    Targets[ targetNumber] .write( 0);
        }
    lcd.clear();
    lcd.print(» YOUR SCORE: «);
    lcd.setCursor( 12, 0);
    lcd.print(score);
    delay(10000);
        score= 0;
        timer =  100;
      }
    }

  2. Ошибку мы из воздуха возьмем?

  3. Компилятору не нравиться вот это «lcd.begin();»

  4. Ну так а ошибку Вы дадите или как?

  5. Это Joker-ошибка. Т.е. любая на твой выбор (или вкус).


    otis и NikitOS нравится это.

  6. no matching function for call to ‘LiquidCrystal_I2C::begin()’
    это то что пишет компилятор

  7. Используйте init() вместо begin(), Также библиотека LiquidCrystal.h здесь не нужна.

  8. Как убрать одну библиотеку и подключить другую. Походу у меня ошибка от того что не та библиотека.

  9. C:Users73B5~1AppDataLocalTemparduino_modified_sketch_964238Tir_v1.ino: In function ‘void ifZero()’:

    Tir_v1:154:2: error: ‘lcd’ was not declared in this scope

      lcd.clear();

      ^~~

    exit status 1
    ‘lcd’ was not declared in this scope
    [/code
    теперь вот эта ошибка. я убрал из папки либратес  библиотеку( вырезал папку) и на это место вставил другую. ( ту что рекомендовал автор )

  10. otis. выложите код после редактирования, судя по ошибке, вы там что-то напортачили

  11. И для кого придумана кнопка установки библиотеки из архива? [​IMG]

  12. otis. Не путайте установку библиотеки в IDE (в среду разработки) и подключение библиотеки к вашему скетчу. Когда вы скачиваете библиотеку из интернета и закидываете её в папку libraries — это установка библиотеки в IDE. Там их может быть любое количество и на любой вкус. А вот если вы хотите использовать библиотеку в скетче, вы об этом сообщаете компилятору через директиву include. В вашем случае это строки

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

    Разберитесь в этом куске вашего кода. Если библиотека не нужна, закомментируйте строку с её объявлением или удалите.

  13. #include <Wire.h>
    #include <Servo.h>
    #include <LiquidCrystal_I2C.h>
    LiquidCrystal_I2C lcd(0x27, 16, 2 );

    #define TOT_TARGETS 4
    #define TOT_SENSORS 4
    #define PIN_TARGET 7

    Servo Targets[ TOT_TARGETS];  //Servo
    int targetSensor[]  =  { A0, A1, A2, A3};  // LDR Sensor
    int readingSensor[ TOT_SENSORS] ;
    int targetTimer[]  =  { 0 , 0 , 0 , 0 } ;
    int score =  0;
    int timer =  100;
    unsigned long interval =  100; // time we need to wait
    unsigned long previousMillis =  0;  // millis()  returns an unsigned long.

    void setup() {
    Serial.begin( 9600);

    lcd.backlight();
    lcd.clear();
    lcd.begin();
    lcd.setCursor( 0, 0 );
    lcd.print(«SCORE: 0»);
    lcd.setCursor( 0, 1);
    lcd.print(«TIMER: 0»);

    //attaches the servos from pin 7  to 10
      for (int targetNumber =  0 ;  targetNumber < TOT_TARGETS;  targetNumber++)
      {
    Targets[ targetNumber] .attach( targetNumber + PIN_TARGET);
    Targets[ targetNumber] .write(0 ) ;
      }
    }

    void loop()  {

    lcd.clear();
    lcd.setCursor( 0, 0); // (Column,Row)
    lcd.print(«SCORE: «);
    lcd.setCursor( 12, 0);
    lcd.print( score);
    lcd.setCursor( 0, 1); // (Column,Row)
    lcd.print(«TIME: «);
    lcd.setCursor( 12, 1);
    lcd.print(timer);

    unsigned long currentMillis =  millis() ;  // grab current time

    // check if «interval» time has passed (100 milliseconds)
      if ((unsigned long)(currentMillis previousMillis) >= interval) {

        for (int targetsensorNumber = 0; targetsensorNumber < TOT_SENSORS; targetsensorNumber++) {
    readingSensor[targetsensorNumber] = analogRead({(targetSensor[targetsensorNumber])});
        }
        previousMillis = millis();
    Serial.print(readingSensor[1]);
    Serial.println(readingSensor[2]);
      }
    villainTarget();
    targetDown();
    ifZero();
    Countdowntimer();

    }

    void villainTarget() {

    int target = random(1, 5);
    delay(10);
      if (target == 1) {
    targetTimer[0]++;
    Targets[0].write(90 );
    delay( 10 );
        if (targetTimer[ 0 ]  ==  2 ) {
    targetTimer[ 0]  =  0 ;
    Targets[ 0].write(0);
    delay( 10);
        }
      }  else if ( target ==  2)  {
    targetTimer[ 1]++;
    Targets[ 1 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 1 ]  ==  2)  {
    targetTimer[ 1 ]  =  0;
    Targets[ 1 ] .write(0);
    delay( 10);
        }

      }  else if ( target ==  3)  {
    targetTimer[ 2]++;
    Targets[ 2 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 2 ]  ==  2)  {
    targetTimer[ 2 ]  =  0;
    Targets[ 2 ] .write(0);
    delay( 10);
        }
      }  else if ( target ==  4)  {
    targetTimer[ 3]++;
    Targets[ 3 ] .write( 90 ) ;
    delay( 10);
        if ( targetTimer[ 3 ]  ==  2)  {
    targetTimer[ 3 ]  =  0;
    Targets[ 3 ] .write( 0 );
    delay( 10 );
        }
      }
    }

    void targetDown() {
    //Sith Trooper
      if (readingSensor[ 0] >> 450 )  {
    score++;
    Targets[ 0].write( 0 );
    delay( 100 );
      }
    //Sith Trooper
      if (readingSensor[ 1] >> 990 )  {
    score++;
    Targets[ 1].write( 1 );
    delay( 100 );
      }
    // Palpatine
      if (readingSensor[ 2] >> 990 )  {
        score =  score + 5 ;
    Targets[ 2].write( 2 );
    delay( 100 );
      }
    //Sith Trooper
      if (readingSensor[ 3] >> 985 )  {
    score++;
    Targets[ 3].write( 3);
    delay( 100);
      }
    }

    void Countdowntimer()  {
    timer;
    delay( 1000);
    }

    void ifZero()  {
      if ( timer ==  0)  {
        for ( int targetNumber =  0 ;  targetNumber < TOT_TARGETS;  targetNumber++)
        {
    Targets[ targetNumber] .write( 0);
        }
    lcd.clear();
    lcd.print(» YOUR SCORE: «);
    lcd.setCursor( 12, 0);
    lcd.print(score);
    delay(10000);
        score= 0;
        timer =  100;
      }
    }

    Всем спасибо. Вопрос закрыт. Добавил нужную библиотеку. И первый раз нажал кнопку «вкладки инструменты и Исправить кодировку и перезагрузить». И о МАГИЯ скетч заработал. В приложение компилированный скетч. Схема есть на https://create.arduino.cc/projecthu…ref=platform&ref_id=424_trending___&offset=69

Библиотека:

Для работы с символьными графическими дисплеями предлагаем воспользоваться библиотекой 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 секунды
}

LCD

Autoscroll
Blink
Cursor
CustomCharacter
Display
HelloWorld
Scroll
SerialDisplay
SetCursor
TextDirection
Индикатор прогресса яркости светодиода
Библиотека LiquidCrystalRus с поддержкой кириллицы
Функции библиотеки LiquidCrystal
Визуальный редактор
Экран с I2C
Библиотека i2cdetect

Выводить информацию удобно на экран. Очень популярным решением является текстовый жидкокристаллический экран, знакомый нам по древним звонилкам. Для опытов я использовал простой текстовый экран 16×2 от компании МЭЛТ.

Экран

Я думал, что работать с такими экранами очень сложно, оказалось, что ничего страшного.

Краткое описание дисплея: LCD-дисплей MT-16S2H компании Мэлт служит для вывода текста с подсветкой. По изображению похож на дисплеи старых мобильных телефонов вроде Nokia 3310 или Siemens C35. Экран имеет 16 контактов для подведения питания и взаимодействия с управляющей электроникой. Для управления выводом дисплея возможно использовать только 6 из них. Дисплей выполнен на чипе, совместимом с HD44780, который является де-факто стандартом для LCD-экранов.

Процесс подключения очень хорошо описан на сайте Амперки — Подключение текстового экрана к Arduino

Основная особенность дисплея — необычная нумерация выходов. Всего их 16, но идут они не по порядку, а весьма нетривиальным способом. И только три из них подписаны: 14, 1 и 16. Но, оказывается, это вполне достаточно. Я помогу вам разобраться.

14 13 12 11 10 9 8 7 6 5 4 3 2 1 16 15

Таблица контактов

Контакт Обозначение Назначение
1 Vss Заземление
2 Vdd Питание 5В
3 Vo Регулировка контрастности (потенциометр)
4 Rs Выбор режим (командный или отображения данных)
5 RW Чтение/Запись
6 En Готовность данных
7 D0 Линия передачи данных 0 (не используется)
8 D1 Линия передачи данных 1 (не используется)
9 D2 Линия передачи данных 2 (не используется)
10 D3 Линия передачи данных 3 (не используется)
11 D4 Линия передачи данных 4
12 D5 Линия передачи данных 5
13 D6 Линия передачи данных 6
14 D7 Линия передачи данных 7
15 A Анод подсветки
16 K Катод подсветки

Вкратце, чтобы самому не забыть. Втыкаем дисплей своими 16 ножками в макетную плату. Подводим к рельсам питания макетки питание +5 В и землю с Arduino.

Фоновая подсветка дисплея — это отдельный контур, не связанный с остальным. Включить её можно подав +5 В на 15-й контакт дисплея и подключив 16-й контакт к земле. Соединив эти два контакта с соответствующими рельсами, можно включить Arduino и увидеть, что дисплей засветился.

Далее необходимо подключить цепь, отвечающую за отображение символов. Для этого предназначены контакты 1, 2 и 3 на дисплее. Перед подключением отключите Arduino от питания.

Первый — это земля. Соедините его с рельсой земли.

Второй — питание. Соедините его с рельсой +5 В.

Третий — контрастность. Для получение максимально контрастного изображения соедините его с рельсой земли. Вы можете подать на этот контакт произвольное напряжение от 0 до 5 В, чем оно выше, тем тусклее будет изображение, но вместе с этим снизится энергопотребление. Для возможности плавной регулировки контрастности можете подать на этот контакт выходной сигнал потенциометра.

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

Подключение шины данных

Для коммуникации между Arduino и экраном необходимо использовать несколько линий взаимодействия:

2 или 3 для командования дисплеем

4 или 8 для передачи данных (кодов символов и команд)

Таким образом занятыми окажутся от 6-ти до 11-ти контактов от обоих устройств. Если вам не требуется считывать с дисплея, что подходит под большинство сценариев использования, для команд понадобится 2 линии.

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

Итак, для подключения дисплея достаточно использовать 6 линий, 6 контактов на Arduino. Рассмотрим именно этот сценарий. Как упоминалось, нам не за чем считывать с дисплея, мы будем в него только писать. Поэтому соединим 5-й контакт дисплея, который отвечает за выбор чтение/запись с рельсой земли. Это означает «всегда писать».

Затем, соединяем Arduino и экран нашими 6-ю линиями коммуникации. Какие именно контакты будут выбраны на Arduino не имеет значения: мы зададим их в программе, но для примера была выбрана такая конфигурация:

4-й контакт дисплея — 4-й контакт Arduino. Это линия адресного сигнала. Известная как A0 или RS. В зависимости от того, 0 она или 1, дисплей понимает имеем ли мы на линии данных команду вроде «передвинуть курсор» или код символа для отображения.

6-й контакт дисплея — 5-й контакт Arduino. Это линия разрешения доступа к данным. Известная, как E или Enable. Когда эта линия становится единицей, дисплей исполняет команду или выводит символ с линии данных.

11-й, 12-й, 13-й, 14-й контакт дисплея — 10-й, 11-й, 12-й, 13-й контакт Arduino соответственно. Это линии данных. Известные как D4, D5, D6, D7.

Программирование

Существует стандартная библиотека LiquidCrystal для работы с текстовыми жидкокристаллическими экранами.

В Arduino IDE выбираем меню Sketch | Import Library | LiquidCrystal. В начало скетча будет вставлена строка.


#include <LiquidCrystal.h>

Это удобно, если вы позабыли правильное написание библиотеки и убережёт от опечаток.

Также в состав Arduino IDE входят несколько примеров работы с библиотекой: File | Examples | LiquidCrystal.

Единственное, что вам нужно сделать — это менять строчку инициализации контактов в соответствии с вашими соединениями.


// в примере
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

// заменить на
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

А ещё лучше использовать константы.


const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

Простейшая программа для вывода «Hello World»


// Подключаем стандартную библиотеку LiquidCrystal
#include <LiquidCrystal.h>
 
// Инициализируем объект-экран, передаём использованные 
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
 
void setup() 
{
    // устанавливаем размер (количество столбцов и строк) экрана
    lcd.begin(16, 2);
    // печатаем первую строку
    lcd.print("Hello world!");
    // устанавливаем курсор в колонку 0, строку 1. То есть на
    // самом деле это вторая строка, т.к. нумерация начинается с нуля
    lcd.setCursor(0, 1);
    // печатаем вторую строку
    lcd.print("Hello Kitty");
}
 
void loop() 
{
}

В данном случае функция loop() нам не требуется, поэтому оставляем её пустой.

Нужно помнить, что фуккция print() не проверяет длину строк, поэтому самостоятельно следите за своими данными.

Рассмотрим поставляемые примеры.

Autoscroll

Бегущая строка. Выводится первая строка, затем вторая.


#include <LiquidCrystal.h>

// используйте свои значения
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
}

void loop() {
  // устанавливаем курсор в позицию (0,0):
  lcd.setCursor(0, 0);
  // выводим цифры от 0 до 9:
  for (int thisChar = 0; thisChar < 10; thisChar++) {
    lcd.print(thisChar);
    delay(500);
  }

  // устанавливаем курсор в (16,1):
  lcd.setCursor(16, 1);
  // включаем автоматическую прокрутку
  lcd.autoscroll();
  // печатаем от 0 до 9:
  for (int thisChar = 0; thisChar < 10; thisChar++) {
    lcd.print(thisChar);
    delay(500);
  }
  // выключаем автоматическую прокрутку
  lcd.noAutoscroll();

  // очищаем экран для следующей итерации
  lcd.clear();
}

Blink

Выводим строку hello, world! и мигающий курсор в виде знакоместа.


#include <LiquidCrystal.h>

// используйте свои значения
const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  // выводим сообщение
  lcd.print("hello, world!");
}

void loop() {
  // Выключаем мигающий курсор
  lcd.noBlink();
  delay(3000);
  // Включаем мигающий курсор
  lcd.blink();
  delay(3000);
}

Cursor

Выводим строку hello, world! и мигающий символ в виде значка подчёркивания.


#include <LiquidCrystal.h>

// используйте свои значения
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  // выводим сообщение
  lcd.print("hello, world!");
}

void loop() {
  // Выключаем курсор
  lcd.noCursor();
  delay(500);
  // Включаем курсор
  lcd.cursor();
  delay(500);
}

CustomCharacter

Выводим собственные символы: сердечко, смайлик. Небольшая анимация человечка.


#include <LiquidCrystal.h>

const int rs = 4, en = 5, d4 = 10, d5 = 11, d6 = 12, d7 = 13;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// сердечко
byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};

// смайлик
byte smiley[8] = {
  0b00000,
  0b00000,
  0b01010,
  0b00000,
  0b00000,
  0b10001,
  0b01110,
  0b00000
};

byte frownie[8] = {
  0b00000,
  0b00000,
  0b01010,
  0b00000,
  0b00000,
  0b00000,
  0b01110,
  0b10001
};

byte armsDown[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b00100,
  0b01110,
  0b10101,
  0b00100,
  0b01010
};

byte armsUp[8] = {
  0b00100,
  0b01010,
  0b00100,
  0b10101,
  0b01110,
  0b00100,
  0b00100,
  0b01010
};

void setup() {
  lcd.begin(16, 2);

  // создаём новый символ сердечка
  lcd.createChar(0, heart);
  // создаём новый символ смайлика
  lcd.createChar(1, smiley);
  // создаём новый символ
  lcd.createChar(2, frownie);
  // создаём новый символ
  lcd.createChar(3, armsDown);
  // создаём новый символ
  lcd.createChar(4, armsUp);

  // устанавливаем курсор в левый верхний угол
  lcd.setCursor(0, 0);

  // выводим сообщение
  lcd.print("I ");
  lcd.write(byte(0)); // when calling lcd.write() '0' must be cast as a byte
  lcd.print(" Arduino! ");
  lcd.write((byte)1);

}

void loop() {
  // read the potentiometer on A0:
  int sensorReading = analogRead(A0);
  // map the result to 200 - 1000:
  int delayTime = map(sensorReading, 0, 1023, 200, 1000);
  // set the cursor to the bottom row, 5th position:
  lcd.setCursor(4, 1);
  // draw the little man, arms down:
  lcd.write(3);
  delay(delayTime);
  lcd.setCursor(4, 1);
  // draw him arms up:
  lcd.write(4);
  delay(delayTime);
}

Display

Выводим мигающий текст.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  // выключаем дисплей
  lcd.noDisplay();
  delay(500);
  // включаем дисплей
  lcd.display();
  delay(500);
}

HelloWorld

Выводим на первой строке сообщение, а на второй время в секундах с момента запуска.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
}

void loop() {
  // Устанавливаем курсор в позицию столбец 0, ряд 1
  // (напоминаю, что ряд 1 это вторая строка дисплея)
  lcd.setCursor(0, 1);
  // выводим число секунд с запуска скетча
  lcd.print(millis() / 1000);
}

Scroll

Выводим бегущую строку, которая движется вправо и влево.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  lcd.print("hello, world!");
  delay(1000);
}

void loop() {
  // сдвигаем на 13 позиций (длина строки) влево
  for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
    // сдвиг на одну позицию
    lcd.scrollDisplayLeft();
    delay(150);
  }

  // сдвиг на 29 позиций вправо (длина строки + длина дисплея)
  for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
    // сдвиг на одну позицию вправо
    lcd.scrollDisplayRight();
    delay(150);
  }

  // сдвиг на 16 позиций (длина дисплея + длина строки) влево
  // чтобы вернуть текст в центр
  for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    lcd.scrollDisplayLeft();
    delay(150);
  }

  delay(1000);

}

SerialDisplay

Вводим текст в Serial Monitor, чтобы увидеть его на дисплее.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {
  lcd.begin(16, 2);
  Serial.begin(9600);
}

void loop() {
  if (Serial.available()) {
    delay(100);
    // очистим экран
    lcd.clear();
    // считываем все символы
    while (Serial.available() > 0) {
      // выводим символы на экран
      lcd.write(Serial.read());
    }
  }
}

SetCursor

Выводим символы алфавита во все доступные позиции экрана.


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

// мы не меняем эти значения, но вы можете изменить, 
// если хотите в своих примерах
const int numRows = 2;
const int numCols = 16;

void setup() {
  lcd.begin(numCols, numRows);
}

void loop() {
  // проходим в цикле через символы ASCII от 'a' до 'z':
  for (int thisLetter = 'a'; thisLetter <= 'z'; thisLetter++) {
    // проходим все столбцы
    for (int  thisRow = 0; thisRow < numRows; thisRow++) {
      // проходим все ряды
      for (int thisCol = 0; thisCol < numCols; thisCol++) {
        // устанавливаем позицию курсора
        lcd.setCursor(thisCol, thisRow);
        // выводим символ
        lcd.write(thisLetter);
        delay(200);
      }
    }
  }
}

TextDirection

Выводим символы в разных направлениях, используя функции leftToRight() и rightToLeft().


#include <LiquidCrystal.h>

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

int thisChar = 'a';

void setup() {
  lcd.begin(16, 2);
  // включаем курсор
  lcd.cursor();
}

void loop() {
  // изменяем направление на символе 'm':
  if (thisChar == 'm') {
    // идём вправо до следующего символа
    lcd.rightToLeft();
  }
  // меняем направление на 's':
  if (thisChar == 's') {
    // идём влево до следующего символа
    lcd.leftToRight();
  }
  // сбрасываем настройки на 'z':
  if (thisChar > 'z') {
    // идём в (0,0):
    lcd.home();
    // начинаем сначала с позиции 0
    thisChar = 'a';
  }
  // печатаем символ
  lcd.write(thisChar);
  // ждём секунду
  delay(1000);
  // следующий символ
  thisChar++;
}

Индикатор прогресса яркости светодиода

Создадим проект, в котором будем получать данные с потенциометра и выводить получаемые данные на экран в виде индикатора прогресса. Также будем менять яркость светодиода в соответствии с показаниями. Так как показания варьируются от 0 до 1024, необходимо преобразовать значения в пределах от 0 до 256 для светодиода и от 0 до 17 для экрана. Сам индикатор состоит из полностью закрашенного прямоугольника. Если выводить подобные прямоугольники с начала строки, то будет похоже на индикатор прогресса.

Потенциометр подключаем к выводу A0, светодиод к выводу 6. Подключение ЖК-дисплея стандартное, как описано в начале статьи.


// Подключаем стандартную библиотеку LiquidCrystal
#include 

// Инициализируем объект-экран, передаём использованные
// для подключения контакты на Arduino в порядке:
// RS, E, D4, D5, D6, D7
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);

int potPin = A0;       // потенциометр
int ledPin = 6;        // светодиод на выводе с PWM
int potValue = 0;      // значение от потенциометра
int brightness = 0;    // конвертируем в яркость
int progress = 0;      // индикатор прогресса
//int i = 0;             // для цикла

//progress bar character for brightness
byte pBar[8] = {
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
  B11111,
};

void setup()
{
  Serial.begin(9600);

  // устанавливаем размер (количество столбцов и строк) экрана
  lcd.begin(16, 2);

  // светодиод
  pinMode(ledPin, OUTPUT);
  // Выводим сообщение в первой строчке
  lcd.print(" LED Brightness");
  // Создаем символы для индикатора прогресса
  lcd.createChar(0, pBar);
}

void loop()
{
  // ощищаем экран
  lcd.clear();
  // выводим сообщение в первой строчке
  lcd.print(" LED Brightness");
  // устанавливаем курсор на второй строчке
  lcd.setCursor(0, 1);
  // считываем показания с потенциометра
  potValue = analogRead(potPin);
  // конвертируем значения в яркость от 0 до 255
  brightness = map(potValue, 0, 1024, 0, 255);
  // меняем яркость светодиода в зависимости от значений от потенциметра
  analogWrite(ledPin, brightness);
  // конвертируем значения яркость в проценты для индикатора от 0 до 17
  progress = map(brightness, 0, 255, 0, 17);
  // выводим индикатор
  for (int i = 0; i < progress; i++)
  {
    lcd.setCursor(i, 1);
    lcd.write(byte(0));
  }
  // пауза
  delay(750);
}

Progressbar

Кириллица

Не все дисплеи имеют кириллицу. Дисплей от Мэлт поддерживает русский язык. Но просто напечатать текст на русском не получится. Так например, букве «Я» соответствует код B1 в шестнадцатиричной системе. Чтобы передать на экран строку «Яndex», необходимо в явном виде с помощью последовательности x## встроить в строку код символа:


lcd.print("xB1ndex");

Можете смешивать в одной строке обычные символы и явные коды как угодно. Единственный нюанс в том, что после того, как компилятор в строке видит последовательность x, он считывает за ним все символы, которые могут являться разрядами шестнадцатиричной системы даже если их больше двух. Из-за этого вы не можете просто использовать символы из диапазона 0-9, a-f следом за двузначным кодом символа: это вызовет ошибку компиляции. Чтобы обойти этот момент, можно использовать тот факт, что две строки записанные рядом склеиваются. Так, если вы хотите написать «Яeee»:


lcd.print("xB1eee"); // ошибка
lcd.print("xB1""eee"); // правильно

Полную таблицу символов с кодами можно найти в документации к экрану.

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


Библиотека LiquidCrystalRus с поддержкой кириллицы

Совсем не обязательно мучиться с байтами, чтобы вывести русский символ. Существует библиотека LiquidCrystalRus, которая поддерживает кириллицу. Исходники лежат на Гитхабе. Скачайте файл LiquidCrystalRus-1.6.0.zip и распакуйте его в папку libraries. У вас получится что-то типа D:ArduinolibrariesLiquidCrystalRus. В папке находятся файлы библиотеки и папка examples, содержащая три скетча. После этого примеры будут доступны из Arduino IDE. Запустите пример File | Examples | LiquidCrystalRus | HelloWorldRus и убедитесь, что экран способен выводить русские символы.


#include <LiquidCrystalRus.h>

// initialize the library with the numbers of the interface pins
LiquidCrystalRus lcd(4, 5, 10, 11, 12, 13);

void setup() {
  // set up the LCD's number of rows and columns: 
  lcd.begin(16, 2);
  // Print a message to the LCD.
  lcd.print("Котёнок по имени!");
  lcd.setCursor(5, 1);
  lcd.print("Гав");
}

void loop() {
  // set the cursor to column 0, line 1
  // (note: line 1 is the second row, since counting begins with 0):
  //lcd.setCursor(0, 1);
  // print the number of seconds since reset:
  //lcd.print(millis()/1000);
}

Функции библиотеки LiquidCrystal

  • autoscroll()
  • begin()
  • blink()
  • clear()
  • createChar()
  • cursor()
  • display()
  • home()
  • leftToRight()
  • LiquidCrystal()
  • noAutoscroll()
  • noBlink()
  • noCursor()
  • noDisplay()
  • print()
  • rightToLeft()
  • scrollDisplayLeft()
  • scrollDisplayRight()
  • setCursor()
  • write()

autoscroll()

Функция autoscroll() включает автоматическую прокрутку экрана жидкокристаллического индикатора и заставляет каждый вывод символа на экран индикатора перемещать предыдущие символы на одно знакоместо. Если текущее направление
вывода символов слева направо (значение по умолчанию) — экран индикатора прокручивается влево; если текущее направление вывода символов справа налево — экран индикатора прокручивается вправо. Это производит эффект вывода каждого нового символа в одно и то же знакоместо на экране жидкокристаллического индикатора.

Синтаксис:


lcd.autoscroll()

Параметр:

  • lcd — переменная типа LiquidCrystal

begin()

Функция begin() определяет размерность (количество символов в ширину и высоту) индикатора.

Синтаксис:


lcd.begin(cols, rows)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • cols — количество символов в строке
  • rows — количество строк

lcd.begin(16, 2);

blink()

Функция blink() выводит на экран жидкокристаллического индикатора мигающий курсор. Если она используется в комбинации с функцией cursor(), результат будет зависеть от конкретного индикатора.

Синтаксис:


lcd.blink()

Параметр:

  • lcd — переменная типа LiquidCrystal

clear()

Функция clear() очищает экран жидкокристаллического индикатора и располагает курсор в верхнем левом углу.

Синтаксис:


lcd.clear()

Параметр:

  • lcd — переменная типа LiquidCrystal

createChar()

Функция createChar() создаёт пользовательский символ (глиф) для использования на жидкокристаллическом дисплее. Поддерживаются до восьми символов 5×8 пикселов (нумерация с 0 до 7). Создание каждого пользовательского символа определяется массивом из восьми байтов — один байт для каждой строки. Пять младших значащих битов каждого байта определяют пикселы в этой строке. Чтобы вывести пользовательский символ на экран, используйте функцию write() с номером символа в качестве параметра.

Синтаксис:


lcd.createChar(num, data)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • num — номер создаваемого символа (0 to 7)
  • data — данные символьных пикселов

Примеры создания собственных символов ниже.

cursor()

Функция cursor() выводит на экран жидкокристаллического индикатора курсор — подчёркивание знакоместа в позиции, в которую будет записан следующий символ.

Синтаксис:


lcd.cursor()

Параметр:

  • lcd — переменная типа LiquidCrystal

display()

Функция display() включает жидкокристаллический индикатор после того, как он был выключен функцией noDisplay(). Эта функция восстанавливает текст (и курсор), который был на дисплее.

Синтаксис:


lcd.display()

Параметр:

  • lcd — переменная типа LiquidCrystal

home()

Функция home() располагает курсор в верхнем левом углу жидкокристаллического индикатора. Используется для определения начального положения при выводе последовательного текста на экран индикатора. Чтобы ещё и очистить экран индикатора, используйте вместо этой функции функцию clear().

Синтаксис:


lcd.home()

Параметр:

  • lcd — переменная типа LiquidCrystal

leftToRight()

Функция leftToRight() устанавливает направление вывода символов на экран жидкокристаллического индикатора слева направо (значение по умолчанию). Это означает, что последующие символы, выводимые на экран индикатора, пойдут слева
направо, но не повлияют на выведенный ранее текст.

Синтаксис:


lcd.leftTorRight();

Параметр:

  • lcd — переменная типа LiquidCrystal

LiquidCrystal()

Конструктор LiquidCrystal() создаёт переменную типа LiquidCrystal. Индикатором можно управлять, используя 4 или 8 линий данных. Для подключения по 4-м линиям пропустите контакты от D0 до D3 и оставьте эти линии неподключёнными. Контакт RW может быть соединён с «землёй» вместо соединения с контактом платы Arduino. Если в вашей схеме так — пропустите этот параметр функции.

Синтаксис:


LiquidCrystal(rs, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) 
LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) 
LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7)

Параметры:

  • rs — номер контакта платы Arduino, который соединяется с контактом RS жидкокристаллического индикатора
  • rw — номер контакта платы Arduino, который соединяется с контактом RW жидкокристаллического индикатора (опционально)
  • enable — номер контакта платы Arduino, который соединяется с контактом ENABLE жидкокристаллического индикатора
  • d0, d1, d2, d3, d4, d5, d6, d7 — номера контактов платы Arduino, которые соединяются соответственно с контактами данных жидкокристаллического инди-катора. D0, D1, D2 И D3 опциональны — если они не задействованы, жидкокристаллический индикатор будет управляться только через 4 линии данных (D4, D5, D6, D7)

noAutoscroll()

Функция noAutoscroll() выключает автоматическую прокрутку экрана жидкокристаллического индикатора.

Синтаксис:


lcd.noAutoscroll()

Параметр:

  • lcd — переменная типа LiquidCrystal

noBlink()

Функция noBlink() выключает мигающий курсор на экране жидкокристаллического индикатора.

Синтаксис:


lcd.noBlink()

Параметр:

  • lcd — переменная типа LiquidCrystal

noCursor()

Функция noCursor() скрывает курсор с экрана жидкокристаллического индикатора.

Синтаксис:


lcd.noCursor()

Параметр:

  • lcd — переменная типа LiquidCrystal

noDisplay()

Функция noDisplay() выключает жидкокристаллический индикатор без потери отображаемой на нем информации.

Синтаксис:


lcd.noDisplay()

Параметр:

  • lcd — переменная типа LiquidCrystal

print()

Функция print() печатает текст на жидкокристаллическом индикаторе.

Синтаксис функции:


lcd.print(data)
lcd.print(data, BASE)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • data — данные для печати (тип char, byte, int, long или string)
  • BASE (опционально) — основание, по которому печатаются числа: BIN для двоичных (основание 2), DEC для десятичных (основание 10), OCT для восьмеричных (основание 8), HEX для шестнадцатеричных (основание 16)

rightToLeft()

Функция rightToLeft() устанавливает направление вывода символов на экран жидкокристаллического индикатора справа налево (значение по умолчанию — слева направо). Это означает, что последующие символы, выводимые на экран индикатора, пойдут справа налево, но не повлияют на выведенный ранее текст.

Синтаксис:


lcd.rightToLeft()

Параметр:

  • lcd — переменная типа LiquidCrystal

scrollDisplayLeft()

Функция scrollDisplayLeft() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо влево.

Синтаксис:


lcd.scrollDisplayLeft()

Параметр:

  • lcd — переменная типа LiquidCrystal

scrollDisplayRight()

Функция scrollDisplayRight() прокручивает информацию на экране индикатора (текст и курсор) на одно знакоместо вправо.

Синтаксис:


lcd.scrollDisplayRight()

Параметр:

  • lcd — переменная типа LiquidCrystal

setCursor()

Функция setCursor() позиционирует курсор жидкокристаллического индикатора, т.е. устанавливает положение, в котором на его экран будет выведен последующий текст.

Синтаксис:


lcd.setCursor(col, row)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • col — номер знакоместа в ряду (начиная с 0 для первого знакоместа)
  • row — номер ряда (начиная с 0 для первого ряда)

write()

Функция write() записывает символ в жидкокристаллический индикатор.

Синтаксис:


lcd.write(data)

Параметры:

  • lcd — переменная типа LiquidCrystal
  • data — символ, записываемый в индикатор

Пример:


#include <LiquidCrystal.h>

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

void setup()
{
    Serial.begin(9600);
}

void loop()
{
    if (Serial.available())
        lcd.write(Serial.read());
}

Собственные символы

Собственные символы рисуются с помощью функции createChar(). Пример, предлагаемый на сайте Arduino:


// Рисуем смайлик
#include <LiquidCrystal.h>

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

byte smiley[8] = {
  B00000,
  B10001,
  B00000,
  B00000,
  B10001,
  B01110,
  B00000,
};

void setup() {
  lcd.createChar(0, smiley);
  lcd.begin(16, 2);  
  lcd.write(byte(0));
}

void loop() {}

Вы можете нарисовать несколько собственных символов и вывести их на экран.


#include  <LiquidCrystal.h>
 
LiquidCrystal lcd(4, 5, 10, 11, 12, 13);
 
// degree centigrade
byte newChar1[8] = {
  B01000,
  B10100,
  B01000,
  B00011,
  B00100,
  B00100,
  B00011,
  B00000
};
 
// degree fahrenheit
byte newChar2[8] = {
  B01000,
  B10100,
  B01000,
  B00011,
  B00100,
  B00111,
  B00100,
  B00000
};
 
// arrow right
byte newChar3[8] = {
  B00000,
  B00100,
  B00010,
  B11111,
  B00010,
  B00100,
  B00000,
  B00000
};
 
// arrow left
byte newChar4[8] = {
  B00000,
  B00100,
  B01000,
  B11111,
  B01000,
  B00100,
  B00000,
  B00000
};
 
// diameter sign (ø)
byte newChar5[8] = {
  B00000,
  B01101,
  B10010,
  B10101,
  B01001,
  B10110,
  B00000,
  B00000
};
 
// boldface "h"
byte newChar6[8] = {
  B11000,
  B11000,
  B11110,
  B11111,
  B11011,
  B11011,
  B11011,
  B00000
};
 
// ohm sign
byte newChar7[8] = {
  B00000,
  B01110,
  B10001,
  B10001,
  B10001,
  B01010,
  B11011,
  B00000
};
 
// micro sign
byte newChar8[8] = {
  B00000,
  B00000,
  B00000,
  B10010,
  B10010,
  B10010,
  B11100,
  B10000
};
 
int i = 0;
 
void setup() {
  lcd.createChar(0, newChar1);
  lcd.createChar(1, newChar2);
  lcd.createChar(2, newChar3);
  lcd.createChar(3, newChar4);
  lcd.createChar(4, newChar5);
  lcd.createChar(5, newChar6);
  lcd.createChar(6, newChar7);
  lcd.createChar(7, newChar8);
  lcd.begin(16, 2);
 
  for(int n = 0; n < 8; n++)
  {
    lcd.setCursor(n*2, 0);
    lcd.write(n);
  }
}
 
void loop() {
 
}

Визуальный редактор

Редактор для создания собственных символов для дисплеев HD44780

Щёлкайте по квадратам для генерации кода.

Знакоместо

Результат

byte customChar[8] = {
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000
};

LCD Module Arduino Pin
RS
RW GND
Enable
D4
D5
D6
D7

Код для скетча Arduino

#include <LiquidCrystal.h>

// initialize the library
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
byte customChar[8] = {
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000,
	0b00000
};
void setup()
{
  // create a new custom character
  lcd.createChar(0, customChar);
  
  // set up number of columns and rows
  lcd.begin(16, 2);

  // print the custom char to the lcd
  lcd.write((uint8_t)0);
}

void loop()
{
  
}

Источник генератора: https://omerk.github.io/lcdchargen/

Экран с I2C

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


 LED | Arduino Uno
------------------
 GND | GND 
 VCC | 5V 
 SDA | A4 
 SCL | A5

На других микроконтроллерах сигнальные выводы отличаются (Leonardo: SDA-D2, SCL-D3; MEGA, ADK, DUE: SDA-D20, SCL-D21).

Модуль может поставляться отдельно и его нужно припаять самостоятельно. Но проще сразу приобрести готовый собранный модуль с экраном. Встречаются различные модификации экранов — 4х20, 2х16.

I2C

Купить на AliExpress ЖК-дисплей 1602 Синяя подсветка с адаптером

Стандартная библиотека не подойдёт. Нужно использовать библиотеку с поддержкой I2C LiquidCrystal I2C by Frank de Brabander (GitHub).

После установки библиотеки будут доступны несколько примеров: CustomChars, HelloWorld, SerialDisplay.

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

Библиотека i2cdetect

В примерах важно использовать правильный адрес. Самый типичный пример — использовать адрес 0х27.


// Задаем адрес и размерность дисплея.
LiquidCrystal_I2C lcd(0x27, 20, 4); // для экрана 20х4
LiquidCrystal_I2C lcd(0x27, 16, 2); // для экрана 16х2  

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

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

Дополнительные материалы

Шар судьбы

Реклама

Понравилась статья? Поделить с друзьями:

Читайте также:

  • C10d118 volvo ошибка
  • C10d115 ошибка вольво
  • C10d115 ошибка volvo
  • C10d018 ошибка рено
  • C10d015 ошибка вольво

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

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