Подключаем дисплей к EPS8266
Всем привет! Недавно я копался в своих побрякушках и нашёл пару интересных вещей, которые были куплены где-то в том году.
От нано я сразу откажусь, т.к. впоследствии я хочу написать или приспособить к ESP wifi-deauther, а на дисплей выводить информацию. Так что поехали!
Информация к дисплею
Дисплей китайского происхождения, так что расчитывать на step-by-step инструкцию просто не расчитываю, но почему бы не попробовать?
И первая же ссылка ведёт нас на DataSheet, уже хорошо.
Так, это нас не интерисует, листаем дальше. И... Бинго! Pinout дисплея
У неподготовленного читателя можев возникнуть вопрос: "А к каким пинам ESP это цеплять?". Для этого обратимся к Pinout'у нашего ESP8266, благо найти его можно почти на каждом углу.
Подключаем!
"И чо с этими дш делать? Пиши что куда цеплять и расходимся!" (С)
Собственно, сопоставляем(Дисплей - ESP8266):
- GND - GND
- VCC - 3V
- SCL(Serial CLock) - High Speed CLocK(Пин D5)
- SDA(Serial DAta) - High-speed Master Output/Slave Input(Пин D7)
Это те пины, которые мы не можем переназначить. Если с землёй и питанием всё предельно понятно, то за SCL и SDA попытаюсь немного пояснить.
Всё это дело пашет по I2C и получается следующее:
- Serial Data - Отвечает за передачу данных
- Serial Clock - Отвечает за синхронизацию этой самой передачи данных с доской
Их можно изменить, но т.к. они заранее определены производителем, то их переопределение повлечёт за собою кучу лишних телодвижений и неприятных последствий, которые нам пока не нужны. Тем, кто знал это, я не помог, а всем остальным... Ладно, едем дальше.
Прямо сейчас мы можем просто запитать наш ESP8266 и увидеть
А что вы ещё надеялись увидеть?)
У нас осталось ещё 4 пина, точнее 3 так как один не такой уж жизненно важный. Все эти пины мы определим сами, в коде, по ходу пьессы попытаюсь пояснить за что они отвечают.
А пока отправляемся в Arduino IDE.
Код
Будем делать всё в Arduino IDE, потому что мне лень ставить и настраивать расширения на VSCode эта среда проще в использовании, но из коробки в ней нет поддержки ESP8266. Исправить это можно в настройках(File -> Preferences), добавив в параметр Additions boards manager URLs следующее значение(без ковычек) "http://arduino.esp8266.com/stable/package_esp8266com_index.json" и нажав Ok.
Список платформ обновится. После этого заходим во вкладку Boards Manager и в фильтер пишем "ESP8266", после чего устанавливаем
У меня уже всё установлено, таким же образом, но уже во вкладке Library Manager проверьте установку следующих библиотек:
Они, вроде как, идут из коробки, но не будет лишним проверить.
Приступим к написанию мини-скетча, для вывода текста
//Импорты #include <Adafruit_ST7735.h> #include <Adafruit_GFX.h> //Пины #define CS D8 #define DS D4 #define RST D3 //Создаём объект дисплея Adafruit_ST7735 display = Adafruit_ST7735(CS,DC,RST);
Здесь вы можете изменить пины CS, DS и RST на любые свободные и удобные вам. Дальше будем работать с созданым объектом и выводить текст на дисплей.
void setup() { //Инициализируем дисплей, с нужными параметрами display.initR(INITR_MINI160x80_PLUGIN); //Изначально дисплей инициализируется вертикально //Устанавливаем горизонтально, головой к пинам display.setRotation(3); //Заполняем фон синим цветом display.fillScreen(ST7735_BLUE); //Устанавливаем цвет текста в белый display.setTextColor(ST7735_WHITE); //Ставим курсор в позицию 1-1 display.setCursor(1,1); //Выводим текст display.print("Hello from // ADK Lab"); } void loop() {}
Дам небольшое пояснение к координатам постановки курсора. По «госту» надо ставить курсор в позицию 0-0, но в этом случае первая строка будет впритык к физической границе дисплея, поэтому, чтобы «не царапать глаз об это», я делаю отступ, дабы был минимально-видимый промежуток.
О пинах CS, DS, RST и BLK
CS (Chip Select) - Используется для подключения/отключения к шине SPI для передачи данных
DS (Data/Command) - Используется для того чтобы указать тип передаваемых данных, то бишь по шине передаются данные или команда
RST (ReSeT) - Используется чтобы сбросить дисплей в стартовое состояние
BLK (BLacK) - Используется для управления подсветкой дисплея(включения/отключения)
Подключаем пины. Прошиваем, предварительно выбрав в качестве платформы NodeMCU 1.0(ESP-12E) и указав порт на котором висит ESP8266, и видим наш текст
При прошивке в Linux можно столкнуться с проблемой, точнее с невозможностью записать что-то на мкк. Решается это дело просто, надо вручную разрешить запись в блочный девайс, на котором у вас висит мкк, делается это командой
sudo chmod 777 /dev/ttyUSB<номер usb-порта>
Это решит проблему на один раз, далее придётся разрешать повторно, так что не закрываем терминал. Номер usb-порта можно узнать в Arduino IDE или командой
ls /dev | grep USB
На этом можно было бы и завершить, но почему бы нам не расширить функционал нашей прошивки, например добавить обновление дисплея и вывод своего текста без перепрошивки микроконтроллера. Это и сделаем!
Допиливаем скетч
Во-первых, добавим работу с Serial-портом, с его помощью мы будем отправлять текст на микроконтроллер, а также получать информацию для отладки.
До блока setup добавим определение, это будет скорость Serial-порта, а также сделаем пару импортов, они нам пригодятся чуть дальше.
#include <strings.h> #include <stdlib.h> #define BAUDRATE 921600
Теперь в блоке setup, первой строкой определим Serial-порт
Serial.begin(BAUDRATE);
А в выводимое на дисплей сообщение добавим значение скорости
display.print("// ADK Lab | Display v1\n\nBaudrate: "+String(BAUDRATE));
Можете прошить, дабы проверить результат, мы вас подождём)
А мы теперь напишем обработчик для данных поступающих через Serial-порт
На вход я принимаю строку вида
<режим> <цвет фона> <цвет текста>|<текст>\x03
Т.к. мы хотим обрабатывать многострочный текст, то в качестве окончания будем ловить непечатный символ. Теперь код.
//Переменные String user_input, params, mode, bg, fg, to_print; int idx = 0; void loop() { //Отчистка переменных от мусора memset(&user_input, 0, sizeof(user_input)); memset(¶ms, 0, sizeof(params)); memset(&mode, 0, sizeof(mode)); memset(&bg, 0, sizeof(bg)); memset(&fg, 0, sizeof(fg)); memset(&to_print, 0, sizeof(to_print)); //Читаем буфер до символа \x03 user_input = Serial.readStringUntil('\x03'); //Проверка на не-пустой буфер if (user_input.length() > 2){ //Разделение полученного буфера params = user_input.substring(0,user_input.indexOf("|")); mode = params.substring(0,(idx=params.indexOf(" ",idx+1))); bg = params.substring(idx+1,(idx=params.indexOf(" ",idx+1))); fg = params.substring(idx+1,(idx=params.indexOf(" ",idx+1))); to_print = user_input.substring(user_input.indexOf("|")+1,user_input.length()); //Отправляем лог Serial.println(params+"\nmode: "+mode+"\nbg: "+bg+"\nfg: "+fg+"\nString to print: "+to_print+"\n"); //Делаем сравнения if (mode == "rw"){ display.setCursor(1, 1); if (bg == "black") display.fillScreen(ST7735_BLACK); else if (bg == "blue") display.fillScreen(ST7735_BLUE); if (fg == "white") display.setTextColor(ST7735_WHITE); else if (fg == "red") display.setTextColor(ST7735_RED); } //Выводим текст display.print(to_print); } }
Ничего нового, надо как-то отправить запрос на мкк. Открываем любой другой удобный редактор и фоном ставим на загрузку интерпретатор Python.
Для работы с Serial-портом в Python3 есть встроенная библиотека serial
import serial #Определяем порт port = serial.Serial(input('Enter port: '),921600) #Переменные cm = '' params = ['rw','black','white'] #Справка по параметрам #Mode: #rw - Rewrite #<any> - Add to exist #BackGround colors: #black, blue #Text(foreground) colors: #white, red while True: try: cm = input(": ") except KeyboardInterrupt: exit(0) try: #Переназначение параметров if (cm[0] == '/'): cm = cm.split('=') if (cm[0] == '/mode'): params[0] = cm[1] if (cm[0] == '/bg'): params[1] = cm[1] elif (cm[0] == '/fg'): params[2] = cm[1] continue except Exception as e: print('\nПроизошла ошибка при обработке вашего ввода:',e,'\n') #Отправляем данные + обрабатываем переносы строки и возврат каретки port.write(f'{params[0]} {params[1]} {params[2]}|{cm}\x03'.replace('\\n','\n').replace('\\r','\r').encode())
Запускаем, подцепляемся и пробуем отправить текст
Возможные ошибки:
[Errno 13] could not open port <ваш порт>: [Errno 13] Permission denied
Решение: Вручную разрешите доступ к блочному устройству или закройте программу, которая может сейчас взаимодействовать с мкк
[Errno 5] Input/output error
Решение: Возможно мкк плохо подключен, проверьте его подключение к хосту
Ну, что же, на этом пока всё! Мы разобрали как подключается дисплей к нашему мкк ESP8266 и написали под него простенькую прошивку. В следующих частях разберём работу с WiFi на этом мкк. Всем удачи, добра!
Исходники на PrivateBin(Истекают 10 Мая 2023г):