Как использовать I2C LCD с ESP32 в Arduino IDE (совместимо с ESP8266)

Это руководство показывает, как использовать I2C LCD (жидкокристаллический дисплей) с ESP32 в Arduino IDE. Мы покажем, как подключить дисплей, установить библиотеку и попробовать примеры кода для вывода текста на LCD: статический текст и прокрутка длинных сообщений. Вы также можете использовать это руководство с ESP8266.

I2C LCD дисплей с ESP32

I2C жидкокристаллический дисплей 16x2

Для этого руководства мы будем использовать I2C LCD-дисплей 16x2, но LCD-дисплеи других размеров также должны работать.

I2C LCD дисплей 16x2

Преимущество использования I2C LCD в том, что подключение очень простое. Вам нужно подключить только контакты SDA и SCL.

Кроме того, дисплей оснащен встроенным потенциометром, который можно использовать для регулировки контрастности между фоном и символами на LCD. На «обычном» LCD вам нужно добавить потенциометр в схему для регулировки контрастности.

Потенциометр регулировки контрастности на I2C LCD

Необходимые компоненты

Для выполнения этого руководства вам понадобятся следующие компоненты:

Вы можете использовать приведенные выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Подключение LCD к ESP32

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

I2C LCD дисплей вид сзади

Подключите LCD к ESP32 по следующей схеме. Мы используем стандартные контакты I2C на ESP32 (GPIO 21 и GPIO 22).

Схема подключения ESP32 к I2C LCD

Вы также можете использовать следующую таблицу в качестве справки.

I2C LCD

ESP32

GND

GND

VCC

VIN

SDA

GPIO 21

SCL

GPIO 22

Подключение LCD к ESP8266

Вы также можете подключить LCD к ESP8266 по следующей схеме. Мы используем стандартные контакты I2C на ESP8266 (GPIO 4 и GPIO 5).

Схема подключения ESP8266 к I2C LCD

Вы также можете использовать следующую таблицу в качестве справки.

I2C LCD

ESP8266

GND

GND

VCC

VIN

SDA

GPIO 4 (D2)

SCL

GPIO 5 (D1)

Подготовка Arduino IDE

Перед началом работы над проектом вам нужно установить дополнение ESP32 или ESP8266 в Arduino IDE.

Arduino IDE с ESP32

Следуйте одному из следующих руководств, чтобы подготовить Arduino IDE для работы с ESP32:

Arduino IDE с ESP8266

Чтобы установить дополнение ESP8266 в Arduino IDE, прочитайте следующее руководство: Как установить плату ESP8266 в Arduino IDE.

Установка библиотеки LiquidCrystal_I2C

Существует несколько библиотек, которые работают с I2C LCD. Мы используем эту библиотеку от Marco Schwartz. Следуйте следующим шагам для установки библиотеки:

  1. Нажмите здесь, чтобы скачать библиотеку LiquidCrystal_I2C. У вас должен появиться .zip-файл в папке загрузок.

  2. Распакуйте .zip-файл, и вы должны получить папку LiquidCrystal_I2C-master.

  3. Переименуйте папку из LiquidCrystal_I2C-master в LiquidCrystal_I2C.

  4. Переместите папку LiquidCrystal_I2C в папку libraries вашей установки Arduino IDE.

  5. Наконец, перезапустите Arduino IDE.

Определение адреса LCD

Прежде чем отображать текст на LCD, вам нужно узнать I2C-адрес дисплея. При правильно подключенном LCD к ESP32 загрузите следующий скетч I2C Scanner.

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
*********/

#include <Wire.h>

void setup() {
  Wire.begin();
  Serial.begin(115200);
  Serial.println("\nI2C Scanner");
}

void loop() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for(address = 1; address < 127; address++ ) {
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
      nDevices++;
    }
    else if (error==4) {
      Serial.print("Unknow error at address 0x");
      if (address<16) {
        Serial.print("0");
      }
      Serial.println(address,HEX);
    }
  }
  if (nDevices == 0) {
    Serial.println("No I2C devices found\n");
  }
  else {
    Serial.println("done\n");
  }
  delay(5000);
}

Посмотреть исходный код

После загрузки кода откройте монитор порта (Serial Monitor) на скорости 115200 бод. Нажмите кнопку EN на ESP32. I2C-адрес должен отобразиться в мониторе порта.

Результат I2C сканера в мониторе порта

В данном случае адрес – 0x27. Если вы используете аналогичный дисплей 16x2, вы, вероятно, получите тот же адрес.

Отображение статического текста на LCD

Отображение статического текста на LCD очень просто. Все, что вам нужно сделать, – это выбрать, где вы хотите отобразить символы на экране, а затем отправить сообщение на дисплей.

Вот очень простой пример скетча, который отображает «Hello, World!».

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
*********/

#include <LiquidCrystal_I2C.h>

// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;

// set LCD address, number of columns and rows
// if you don't know your display address, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

void setup(){
  // initialize LCD
  lcd.init();
  // turn on LCD backlight
  lcd.backlight();
}

void loop(){
  // set cursor to first column, first row
  lcd.setCursor(0, 0);
  // print message
  lcd.print("Hello, World!");
  delay(1000);
  // clears the display to print new message
  lcd.clear();
  // set cursor to first column, second row
  lcd.setCursor(0,1);
  lcd.print("Hello, World!");
  delay(1000);
  lcd.clear();
}

Посмотреть исходный код

Скетч отображает сообщение сначала в первой строке, а затем во второй строке.

Статический текст на I2C LCD с ESP32

В этом простом скетче мы показываем вам наиболее полезные и важные функции из библиотеки LiquidCrystal_I2C. Давайте кратко рассмотрим, как работает код.

Как работает код

Сначала вам нужно подключить библиотеку LiquidCrystal_I2C.

#include <LiquidCrystal_I2C.h>

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

int lcdColumns = 16;
int lcdRows = 2;

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

LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

В setup() сначала инициализируйте дисплей с помощью метода init().

lcd.init();

Затем включите подсветку LCD, чтобы вы могли прочитать символы на дисплее.

lcd.backlight();

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

lcd.setCursor(0, 0);

Примечание: 0 соответствует первому столбцу, 1 – второму столбцу и так далее…

Затем вы можете наконец вывести сообщение на дисплей с помощью метода print().

lcd.print("Hello, World!");

Подождите одну секунду, а затем очистите дисплей с помощью метода clear().

lcd.clear();

После этого установите курсор в новую позицию: первый столбец, вторая строка.

lcd.setCursor(0,1);

Затем процесс повторяется.

Итак, вот краткое описание функций для управления дисплеем и записи на него:

  • lcd.init(): инициализирует дисплей

  • lcd.backlight(): включает подсветку LCD

  • lcd.setCursor(int column, int row): устанавливает курсор на указанный столбец и строку

  • lcd.print(String message): отображает сообщение на дисплее

  • lcd.clear(): очищает дисплей

Этот пример хорошо работает для отображения статического текста длиной не более 16 символов.

Отображение прокручиваемого текста на LCD

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

  • Функция прокручивает текст в обеих строках. Поэтому вы не можете иметь фиксированную строку и прокручиваемую строку;

  • Она работает некорректно, если вы пытаетесь отобразить сообщения длиннее 16 символов.

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

Следующий скетч отображает статическое сообщение в первой строке и прокручиваемое сообщение длиннее 16 символов во второй строке.

/*********
  Rui Santos
  Complete project details at https://randomnerdtutorials.com
*********/

#include <LiquidCrystal_I2C.h>

// set the LCD number of columns and rows
int lcdColumns = 16;
int lcdRows = 2;

// set LCD address, number of columns and rows
// if you don't know your display address, run an I2C scanner sketch
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

String messageStatic = "Static message";
String messageToScroll = "This is a scrolling message with more than 16 characters";

// Function to scroll text
// The function acepts the following arguments:
// row: row number where the text will be displayed
// message: message to scroll
// delayTime: delay between each character shifting
// lcdColumns: number of columns of your LCD
void scrollText(int row, String message, int delayTime, int lcdColumns) {
  for (int i=0; i < lcdColumns; i++) {
    message = " " + message;
  }
  message = message + " ";
  for (int pos = 0; pos < message.length(); pos++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(pos, pos + lcdColumns));
    delay(delayTime);
  }
}

void setup(){
  // initialize LCD
  lcd.init();
  // turn on LCD backlight
  lcd.backlight();
}

void loop(){
  // set cursor to first column, first row
  lcd.setCursor(0, 0);
  // print static message
  lcd.print(messageStatic);
  // print scrolling message
  scrollText(1, messageToScroll, 250, lcdColumns);
}

Посмотреть исходный код

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

void scrollText(int row, String message, int delayTime, int lcdColumns) {
  for (int i=0; i < lcdColumns; i++) {
    message = " " + message;
  }
  message = message + " ";
  for (int pos = 0; pos < message.length(); pos++) {
    lcd.setCursor(0, row);
    lcd.print(message.substring(pos, pos + lcdColumns));
    delay(delayTime);
  }
}

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

  • row: номер строки, в которой будет отображаться текст

  • message: сообщение для прокрутки

  • delayTime: задержка между каждым сдвигом символа. Большие значения задержки приведут к более медленному сдвигу текста, а меньшие значения – к более быстрому сдвигу.

  • lcdColumns: количество столбцов вашего LCD

В нашем коде мы используем функцию scrollText() следующим образом:

scrollText(1, messageToScroll, 250, lcdColumns);

Переменная messageToScroll отображается во второй строке (1 соответствует второй строке) с задержкой 250 мс (GIF-изображение ускорено в 1.5 раза).

Прокручиваемый текст на I2C LCD с ESP32

Отображение пользовательских символов

На LCD 16x2 есть 32 блока, в которых можно отображать символы. Каждый блок состоит из 5x8 крошечных пикселей. Вы можете отображать пользовательские символы, определяя состояние каждого маленького пикселя. Для этого вы можете создать переменную типа byte для хранения состояния каждого пикселя.

Чтобы создать свой пользовательский символ, перейдите сюда для генерации переменной byte для вашего символа. Например, сердце:

Генератор пользовательских символов LCD -- сердце

Скопируйте переменную byte в ваш код (перед setup()). Вы можете назвать её heart:

byte heart[8] = {
  0b00000,
  0b01010,
  0b11111,
  0b11111,
  0b11111,
  0b01110,
  0b00100,
  0b00000
};

Затем в setup() создайте пользовательский символ с помощью функции createChar(). Эта функция принимает в качестве аргументов позицию для размещения символа и переменную символа следующим образом:

lcd.createChar(0, heart);

Затем в loop() установите курсор в место, где вы хотите отобразить символ:

lcd.setCursor(0, 0);

Используйте метод write() для отображения символа. Передайте позицию, в которой размещен символ, следующим образом:

lcd.write(0);

Заключение

Подводя итог, в этом руководстве мы показали, как использовать I2C LCD-дисплей с ESP32/ESP8266 в Arduino IDE: как отображать статический текст, прокручиваемый текст и пользовательские символы. Это руководство также работает с платой Arduino, вам нужно лишь изменить назначение контактов для использования контактов I2C на Arduino.

У нас есть другие руководства по ESP32, которые могут быть вам полезны:

Мы надеемся, что это руководство было для вас полезным. Если вам нравится ESP32 и вы хотите узнать больше, мы рекомендуем записаться на курс Learn ESP32 with Arduino IDE.

Спасибо за чтение.

Примечание

Это перевод статьи How to Use I2C LCD with ESP32 on Arduino IDE (ESP8266 compatible) от Random Nerd Tutorials с разрешения автора. Все права на оригинальный контент принадлежат Random Nerd Tutorials.