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 16×2

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

Переходник USB to TTL можно приобрести здесь ftdi ft232rl

Многофункциональный переходник JTAG UART FIFO SPI I2C можно приобрести здесь CJMCU FT232H USB к JTAG UART FIFO SPI I2C

Логический анализатор 16 каналов можно приобрести здесь

 

 

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

ESP8266 Name

 

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

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 не будет опубликован. Обязательные поля помечены *

*