ESP8266 Урок 10. I2C. Переходник для LCD 20×4



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

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

Так как наш дисплей не очень хорошо работает с питанием 3,3 вольта и ему просто не хватит контрастности, то питать мы его будем сквозь переходник от независимого источника 5 вольт, в качестве которого мы возьмём обычный DC-DC преобразователь, на вход которого подключим 12 вольт, а выход отрегулируем на 5 вольт. На всякий случай также ограничим немного ток, я ограничил до 1 ампера, благо позволяет мой преобразователь, чтобы при случайном неправильном подключении.

Вот так выглядят наши схематические соединения (дисплей показан уже в работе, в контроллере ESP8266 функционирует уже рабочий код, который мы и будем в данном уроке писать)

 

 

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

Поэтому начнём.

Проект мы, как всегда, заново писать не будем, а сделаем его из проекта прошлого урока с именем I2C_EEPROM и назовём его I2C_LCD2004.

Откроем наш проект в Eclipse и, так как мы UART использовать не будем, то удалим подключение его библиотеки

 

#include «driver/uart.h»

 

Также уберём вот это в user_init

 

// Configure the UART

uart_init(BIT_RATE_115200, BIT_RATE_115200);

 

Вот этот код тоже удаляем

 

ets_delay_us(100000);

os_printf(«\r\n»);

//AT24C_WriteBytes (0x032A, wr_value, 20);

AT24C_ReadBytes(0x032A , rd_value, 20);

for(i=0;i<20;i++)

{

   //os_printf(«%02X «,wr_value[i]);

   os_printf(«%02X «,rd_value[i]);

}

os_printf(«\r\n»);

 

Также удалим пока весь код из бесконечного цикла.

Данные макросы и глобальные переменные тоже удалим

 

#define LED 2

#define I2C_REQUEST_WRITE 0x00

#define I2C_REQUEST_READ 0x01

#define SLAVE_OWN_ADDRESS 0xA0

//——————————————————

uint8_t rd_value[20] = {0};

uint8_t wr_value[20] = {0x14,0x13,0x12,0x11,0x10,

0x0F,0x0E,0x0D,0x0C,0x0B,

0x0A,0x09,0x08,0x07,0x06,

0x05,0x04,0x03,0x02,0x01};

 

Функции AT24C_WriteBytes и AT24C_ReadBytes удалим тоже, писать в шину мы будем не здесь.

Опустим ножки шины в функции user_init()

 

 

Добавим файлы i2c_user.c и i2c_user.h в наш проект в соответствующие папки, как это делать мы давно знаем. Файлы данные будут такого содержания

 

 

 

В файле реализации у нас находится только одна функция, которая отправляет байт в шину, как это делается мы знаем.

 

 

Аналогичным образом также добавим файлы для работы с дисплеем lcd.h и lcd.c пока следующего содержания

 

 

 

Подключим нашу библиотеку в файле main.c

 

 

Также не забываем внести изменения в Makefile, так как сами файлы туда не добавятся (пока).

Вот эти строки вставим после сборки цели main.o

 

 

В сборке цели app_app.a также добавим объектные файлы здесь

 

build/app_app.a: src/main.o src/lcd.o src/i2c_user.o

 

здесь

 

@$(AR) cru build/app_app.a src/main.o src/lcd.o src/i2c_user.o

 

и в цели clean

 

@rm -v src/main.o src/lcd.o src/i2c_user.o build/app_app.a build/app.out build/app.out-0x00000.bin build/app.out-0x10000.bin

 

Попробуем собрать наш проект, если всё нормально, то движемся дальше.

В файле lcd.c добавим парочку глобальных переменных и функцию отправки байта в дисплей, чтобы каждый раз не писать адрес

 

 

В заголовочный файл lcd.h добавим несколько макросов для удобного управления служебными ножками дисплея

 

 

 

Вернёмся в файл lcd.c и добавим там функцию передачи половины байта в дисплей

 

 

Также добавим функцию передачи целого байта с флагом, обозначающим то, что именно мы передаём в дисплей — команду или данные

 

 

Добавим также функцию инициализации, которая нам также знакома

 

 

Добавим на данную функцию прототип в заголовочном файле и вызовем её в функции user_init файла main.c

 

 

Квадратики в двух строках у нас погаснут и дисплей очистится

 

 

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

 

 

Если мы теперь соберём код и прошьём контроллер, то мигание прекратится.

Также в функции добавим небольшой символьный массив

 

 

Вернёмся в lcd.c и добавим там для полного счастья ещё функции вывода строки на дисплей и позиционирования курсора после функции sendbyte

 

 

Данные функции нам тоже знакомы и в объяснении не нуждаются.

Не забыв добавить на данные функции прототипы в заголовочном файле, вернёмся в main.c и в функции user_init попробуем что-нибудь вывести на наш дисплей

 

 

Соберём код, прошьём контроллер и посмотрим результат работы нашей программы

 

 

Отлично, теперь посмотрим, как работает наш дисплей в динамике, для этого сначала добавим задержку в 2 секунды и очистим часть нижней строки, где у нас надпись

 

 

А затем в бесконечном цикле будем показывать счётчик в 4 строке (задержка от слишком быстрого перебирания чисел у нас там уже есть)

 

 

Теперь у нас, как только пройдут 2 секунды после вывода четырёх строк на экран, в нижней строке побегут циферки, как мы и видели в начале урока

 

 

Итак, на данном уроке мы лишний раз закрепили свои знания по управлению интерфейсом I2C в микроконтроллере ESP8266, пусть реализованном программно, но тем не менее отлично работающим. Надеюсь, это многим в дальнейшем пригодится для разработки разнообразных устройств под управлением контроллером ESP8266, в которых используется символьный вывод.

Всем спасибо за внимание!

 

 

Предыдущий урок Программирование МК ESP8266 Следующий урок

 

Исходный код

Модуль ESP NodeMCU можно купить здесь: Модуль ESP NodeMCU

Различные модули ЕSP8266 можно приобрести здесь Модули ЕSP8266

Дисплей LCD 20×4 можно приобрести здесь Дисплей LCD 20×4

Дисплей LCD 16×2

Переходник I2C to LCD можно приобрести здесьI2C to LCD1602 2004

 

Смотреть ВИДЕОУРОК (нажмите на картинку)

 

ESP8266 Name

2 комментария на “ESP8266 Урок 10. I2C. Переходник для LCD 20×4
  1. Дмитрий:

    Спасибо! Только вопросик сформировался, как часто сбрасывать пса? А то у Вас в цикле раз в 0,1 сек, а в другом месте раз 1 сек.

1 Отклики /Обратные ссылки для "ESP8266 Урок 10. I2C. Переходник для LCD 20×4"
  1. […] мы сделаем из проекта урока 10 с именем I2C_LCD2004 и назовём его […]

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

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*