Подключение ЖК дисплея 16x2 к модулю ESP32 по интерфейсу I2C


В предыдущей статье на нашем сайте мы рассмотрели подключение к модулю ESP32 OLED дисплея с помощью интерфейса SPI, использующего 4 контакта для подключения. В этой же статье мы рассмотрим подключение к модулю ESP32 ЖК дисплея 16x2 с помощью интерфейса I2C, который использует всего 2 контакта для подключения. Таким образом, большее количество контактов модуля ESP32 останутся свободными и их можно использовать для других целей.

Внешний вид проекта подключения ЖК дисплея 16x2 к ESP32 по интерфейсу I2C

Как работает протокол I2C

Протокол I2C расшифровывается как “Inter Integrated Circuits” и был первоначально разработан для соединения находящихся на печатной плате небольших микросхем различного назначения. Также он может обозначаться как IIC или даже TWI (2-wire interface protocol, двухпроводный протокол интерфейса).

I2C является синхронным протоколом связи, что означает что все устройства, использующие его, имеют общую линию синхронизации. Протокол I2C для своей работы использует всего 2 провода: SDA – для приема и передачи данных, SCL – линия синхронизации (clock signal).

Вы можете купить ЖК дисплея 16x2 со встроенным контроллером I2C, либо же вы можете купить контроллер интерфейса I2C в виде отдельного модуля и подключить его к ЖК дисплею 16x2.

Более подробно про протокол I2C вы можете прочитать в статье про его использование в плате Arduino.

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

  1. Модуль ESP32 (купить на AliExpress).
  2. ЖК дисплей 16x2 с модулем I2C (купить на AliExpress).
  3. Макетная плата.
  4. Соединительные провода.

Модуль I2C

Контроллер протокола I2C содержит в своем составе микросхему PCF8574 которая преобразует два контакта протокола I2C в ряд обычных контактов общего назначения (I/O). Также данную микросхему можно использовать в светодиодных досках/панелях, дисплеях, клавиатурах, промышленных контроллерах и т.д. Она содержит 8 контактов ввода/вывода (I/O), 3 контакта (A0, A1, A2) для шины адреса I2C и контакты SDA и SCL.

Также модуль I2C содержит встроенный потенциометр для управления яркостью ЖК дисплея.

Распиновка микросхемы PCF8574 и модуля I2C представлена на следующих рисунках.

Распиновка микросхемы PCF8574

Распиновка модуля I2C

Схема проекта

Схема подключения ЖК дисплея 16x2 к модулю ESP32 по интерфейсу I2C представлена на следующем рисунке.

Схема подключения ЖК дисплея 16x2 к модулю ESP32 по интерфейсу I2C

В схеме необходимо сделать следующие соединения:

  • подключить контакты 1-16 модуля I2C к контактам ЖК дисплея;
  • подключить контакт SDA модуля I2C к контакту SDA (D21) модуля ESP32;
  • подключить контакт SCL модуля I2C к контакту SCL (D22) модуля ESP32.

В схеме на контакт 5v модуля I2C подано напряжение 3.3 v с модуля ESP32 – этого напряжения недостаточно для полноценного питания модуля I2C и поэтому данные на ЖК дисплее будут отображаться не совсем четко. В данном проекте это сделано с демонстрационной целью, с целью упрощения проекта, в общем же случае для полноценного питания модуля I2C необходимо использовать внешнее напряжение 5V.

Внешний вид собранной контструкции проекта

Подключить ЖК дисплей к модулю ESP32 можно и без использования модуля I2C, но в этом случае вам потребуется использовать значительно больше свободных контактов модуля ESP32.

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

Код программы для определения адреса модуля I2C

Перед тем как приступать к написанию основной программы нам необходимо определить I2C адрес нашего модуля I2C.

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

Определенный адрес модуля I2C

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

Также на модуле I2C вы можете увидеть 3 джампера/переключателя, обозначенные A0, A1 и A2. Они используются для изменения адреса модуля. В следующей таблице представлены возможные I2C адреса данного модуля в зависимости от положения этих джамперов.

A0 A1 A2 HEX Address
1 1 1 0x27
0 1 1 0x26
1 0 1 0x25
0 0 1 0x24
1 1 0 0x23
0 1 0 0x22
1 0 0 0x21
0 0 0 0x20

Далее перейдем к рассмотрению основной программы для нашего проекта.

Объяснение программы для модуля ESP32

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом нам необходима библиотека LiquidCrystal_I2C для нашего модуля I2C. Обычная библиотека для работы с ЖК дисплеем (Liquidcrsytal) здесь работать не будет поскольку мы используем подключение дисплея по интерфейсу I2C.

Скачайте эту библиотеку по адресу https://github.com/fdebrabander/Arduino-LiquidCrystal-I2C-library.

Код программы написан таким образом, что все, что вы напишите в окне монитора последовательной связи (serial monitor), будет отображаться на экране ЖК дисплея. Для написания и загрузки программы в модуль мы используем Arduino IDE.

Сначала в программе нам необходимо подключить библиотеку wire для связи по протоколу I2C, которая встроена в Arduino IDE.

Далее подключим библиотеку LiquidCrystal_I2C.h, которую мы скачали ранее.

Далее зададим адрес I2C 0x27 и установим на ЖК дисплее режим 16 столбцов 2 строки.

В функции setup мы инициализируем ЖК дисплей и последовательную связь со скоростью 9600 бод. Также включим фоновую подсветку (backlight) ЖК дисплея – если вы не хотите ее использовать, тогда используйте команду lcd.noBacklight().

Вначале мы выведем на экран ЖК дисплея инструкции что нужно делать пользователю – в данном случае он должен печатать символы в окне монитора последовательной связи (Serial Monitor). Установите в окне монитора последовательной связи опцию "No Line Ending".

Далее в функции loop() мы будем непрерывно проверять поступающие по последовательному порту данные с помощью функции Serial.available(). Если сообщение поступило, то мы будем немного ждать чтобы принять его полностью, и затем выводить его на экран ЖК дисплея с помощью функций lcd.write() и Serial.read().

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

Исходный код программы (скетча)

Видео, демонстрирующее работу проекта

(Проголосуй первым!)
Загрузка...
1 158 просмотров

Добавить комментарий

Ваш адрес email не будет опубликован.