ESP8266 NodeMCU. SSD1306. U8G
Для роботи з різними дисплеями NodeMCU використовує бібліотеку U8glib. Підтримуються дисплеї які працюють по шині SPI або IIC. В документації до NodeMCU можна перевірити чи підтримується саме ваша модель дисплею: https://nodemcu.readthedocs.io/en/master/en/modules/u8g/ У прикладі використовується графічний OLED дисплей SSD1306 який працює по шині IIC.
Схема підключення: Примітка: NodeMCU дозволяє обрати які GPIO виводи будуть використані для ліній SDA та SCL. NodeMCU треба зібрати з потрібними модулями (сайт для власної збірки NodeMCU: https://nodemcu-build.com). Мають бути включені наступні модулі: I2C, U8G Коли включили U8G, стають доступні опції для вибору моделі дисплею та шрифтів. Щоб обрати шрифти натисніть "Select". З`явиться вікно для вибору шрифтів: Виберіть потрібні і натисніть кнопку "Apply" У самому низу сторінки: В результаті маємо отримати приблизно таку картину: Тепер, коли потрібні модулі обрані, можна натиснути "Start your build". Детально про збірку і заливку прошивки NodeMCU йшлося у статті ESP8266 NodeMCU Прошивка. Робимо WiFi розетку Зверніть увагу що бібліотека u8glib дозволяє використовувати декілька шрифтів. Але вони мають бути включені під час збірки NodeMCU. Після заливки NodeMCU. Можна залити скрипт і графічні файли (у форматі MONO). Скачати файли прикладу можна тут: https://github.com/avislab/NodeMCUExamples/tree/master/SSD1306_IIC_U8G Розглянемо як працює скрипт прикладу. Спочатку налаштовується шина IIC:
-- IIC init
local sda = 3 -- GPIO14
local scl = 4 -- GPIO12
local sla = 0x3c
i2c.setup(0, sda, scl, i2c.SLOW)
Потім виконується ініціалізація дисплея:
-- Display init
disp = u8g.ssd1306_128x64_i2c(sla)
disp:begin()
Перша частина прикладу - текст на екрані. Обираємо шрифт, виводимо текст на екран, і в кінці затримка на 2 секунди.
-- Set Font
disp:setFont(u8g.font_10x20)
-- Draw a text
disp:firstPage()
repeat
disp:drawStr(0, 16, "I`s just")
disp:drawStr(0, 32, "a test.")
until disp:nextPage() == false
tmr.delay(2000000)
Зверніть увагу на функції disp:firstPage(), disp:nextPage(). Для тих, хто раніше не використовував бібліотеку u8glib такий метод виводу на екран може здатися не зовсім зрозумілим. Що це за Page і навіщо декілька разів виконувати одну і ту ж операцію? Насправді такий метод - це вихід зі складного стану. Такий підхід водночас дає можливість працювати з різними дисплеями з різною організацією пам`яті, і в той же час економить оперативну пам`ять мікроконтролера. Ми не будемо заглиблюватись у технічні тонкощі роботи з пам’ятью різних дисплеїв, це виходить за межі цієї статті. Просто прийміть це як факт. Бібліотека u8glib вимагає саме такого підходу.
Друга частина прикладу - геометричні фігури:
-- Draw
disp:firstPage()
repeat
disp:drawLine(0,0,127,64);
disp:drawLine(0,64,127,0);
disp:drawFrame(10,10,40,40);
disp:drawCircle(100,20,20);
disp:drawTriangle(60,60, 80,55, 70,40);
until disp:nextPage() == false
tmr.delay(2000000)
Остання частина прикладу - використання графічних файлів:
-- Read a picture #1
file.open("example1.MONO", "r")
local xbm_data_t = file.read()
file.close()
-- Draw a picture #1
disp:firstPage()
repeat
disp:drawXBM(26, 0, 76, 64, xbm_data_t)
until disp:nextPage() == false
tmr.delay(2000000)
-- Read a picture #2
file.open("example2.MONO", "r")
local xbm_data_t = file.read()
file.close()
-- Draw a picture #2
disp:firstPage()
repeat
disp:drawXBM(32, 0, 64, 64, xbm_data_t)
until disp:nextPage() == false
Реалізація бібліотеки u8glib для NodeMCU використовує графічні файли у форматі MONO. Можна знайти редактор, який здатен зберігати файли у цьому форматі, або використати on-line конвертор. Наприклад цей: https://www.online-utility.org/image/convert/to/MONO
Важливо вказувати правильний розмір зображення під час виклику функції drawXBM. Якщо розмір вказати не правильно зображення буде спотворено.
Детальніше про функціонал бібліотеки u8glib читайте тут: https://github.com/olikraus/u8glib/wiki/userreference
Скачати приклад можна тут: https://github.com/avislab/NodeMCUExamples/tree/master/SSD1306_IIC_U8G
Відео
Бажаю успіхів.Дивись також:
- ESP8266 NodeMCU Перше знайомство. Робимо WiFi розетку
- ESP8266 NodeMCU. PWM
- ESP8266 NodeMCU. ADC
- ESP8266 NodeMCU. timer, rtc, SNTP, cron
- ESP8266 NodeMCU. файлова система, SD Card
- ESP8266 NodeMCU. UART
- GPS-трекер на базі ESP8266
- GPS-трекер + Дисплей SSD1306
- ESP8266 NodeMCU. SSD1306. U8G
- ESP-01 (ESP8266) upgrade flash memory to 4MB
- ESP8266 NodeMCU. I2C. BME280/
- Метеостанція на ESP8266
Здравствуйте. Я пытаюсь загрузить картинку (по инструкции конвертировал в MONO) из примера - мне выдает ошибку `drawXBM` (string expected, got nil) В описании говориться, что file.read() возвращает nil а drawXBM требует строчное выражение. Текст и графику показывает нормально
Недавні записи
- Деякі думки про точність вимірювань в електроприводі
- Датчики Холла 120/60 градусів
- Модуль драйверів напівмосту IGBT транзисторів
- Драйвер IGBT транзисторів на A316J
- AS5600. Варіант встановлення на BLDC мотор
- DC-DC для IGBT драйверів ізольований 2 W +15 -8 вольт
- U-FOC - Векторне керування безколекторними моторами
- FOC - своя реалізація векторного керування. Підбиваю підсумки 2022 року
- Конструктор регуляторів моторів. Підбиваю підсумки 2022 року.
- Чому трифазні мотори стали такими популярними?
Tags
html uart pmsm hih-4000 mpu-9250 soldering dc-dc ethernet mpx4115a foc programmator ssd1306 bmp280 examples java-script raspberry-pi tim servo books eb-500 mongodb nodemcu docker wifi lcd adc max1674 dht11 python ssd1331 mpu-6050 remap rtc piezo solar displays led web css options dma gpio usart sms rfid esp8266 i2c 3d-printer usb pwm bldc atmega sensors barometer rs-232 git websocket motor meteo encoder bluetooth brushless timer watchdog eeprom battery st-link ngnix nvic smd stm32 flask gps capture avr bme280 flash bkp exti
Архіви