Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° U8glib стала стандартным Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Ρ‹ΠΌΠΈ графичСскими дисплСями Π½Π° ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ°Ρ… Arduino, AVR ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠΈΠΊΡ€ΠΎΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€Π°Ρ…. Она позволяСт Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ тСкст, Π³Ρ€Π°Ρ„ΠΈΠΊΡƒ ΠΈ простыС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ Π½Π° экраны с интСрфСйсами I2C, SPI ΠΈΠ»ΠΈ ΠΏΠ°Ρ€Π°Π»Π»Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ΠΌ, поддСрТивая Π±ΠΎΠ»Π΅Π΅ 300 ΠΌΠΎΠ΄Π΅Π»Π΅ΠΉ дисплССв ΠΎΡ‚ Nokia 5110 Π΄ΠΎ SSD1306. НСсмотря Π½Π° появлСниС Π±ΠΎΠ»Π΅Π΅ соврСмСнной U8g2, U8glib остаётся Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎΠΉ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ (ΠΌΠ΅Π½Π΅Π΅ 8 ΠšΠ‘ Flash), Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ Π±Π°ΠΉΡ‚ Π½Π° счСту.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅ Π²Ρ‹ Π½Π°ΠΉΠ΄Ρ‘Ρ‚Π΅ Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π±Π°Π·ΠΎΠ²ΠΎΠ΅ описаниС Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ, Π½ΠΎ ΠΈ практичСскиС ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°, сравнСниС с Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π°ΠΌΠΈ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΈΠΏΠΈΡ‡Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ β€” ΠΎΡ‚ ошибок компиляции Π΄ΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠœΡ‹ Ρ€Π°Π·Π±Π΅Ρ€Ρ‘ΠΌ, ΠΊΠ°ΠΊ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ ΠΊ популярным дисплСям, Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ ΠΈ ΡƒΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ энСргопотрСблСниСм. ОсобоС Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΡƒΠ΄Π΅Π»Π΅Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Π΅ΠΉ ΠΈ Π°Π΄Π°ΠΏΡ‚Π°Ρ†ΠΈΠΈ ΠΏΠΎΠ΄ русскоязычныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹.

1. Π§Ρ‚ΠΎ Ρ‚Π°ΠΊΠΎΠ΅ U8glib ΠΈ для Ρ‡Π΅Π³ΠΎ ΠΎΠ½Π° Π½ΡƒΠΆΠ½Π°

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° U8glib (Universal 8bit Graphics Library) β€” это инструмСнт для управлСния графичСскими дисплСями с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ Π΄ΠΎ 128Γ—128 пиксСлСй, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π½Π½Ρ‹ΠΉ Olivier Giulieri. Π•Ρ‘ ΠΊΠ»ΡŽΡ‡Π΅Π²ΠΎΠ΅ прСимущСство β€” ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹Π΅ трСбования ΠΊ рСсурсам: ΠΎΠ½Π° Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π΄Π°ΠΆΠ΅ Π½Π° ATtiny85 (1 ΠšΠ‘ ΠžΠ—Π£) ΠΈ совмСстима с Arduino IDE, PlatformIO, Π° Ρ‚Π°ΠΊΠΆΠ΅ "Π³ΠΎΠ»Ρ‹ΠΌ" AVR Ρ‡Π΅Ρ€Π΅Π· avr-gcc.

ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Π·Π°Π΄Π°Ρ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ U8glib:

  • πŸ“± Π’Ρ‹Π²ΠΎΠ΄ тСкста ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° ΠΌΠΎΠ½ΠΎΡ…Ρ€ΠΎΠΌΠ½Ρ‹Π΅ экраны (OLED, LCD, e-Paper)
  • πŸ”„ Π£ΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΊΠ°Π΄Ρ€Π° для ΠΏΠ»Π°Π²Π½ΠΎΠΉ Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ
  • 🎨 ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΡ… ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ² ΠΈ символов
  • ⚑ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ энСргопотрСблСния (Ρ€Π΅ΠΆΠΈΠΌΡ‹ сна, частичноС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅)

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° построСна Π½Π° ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ΅ "page buffer": экран дСлится Π½Π° страницы ΠΏΠΎ 8 пиксСлСй высотой, Ρ‡Ρ‚ΠΎ позволяСт ΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ. НапримСр, для дисплСя SSD1306 128Γ—64 трСбуСтся всСго 1024 Π±Π°ΠΉΡ‚Π° Π±ΡƒΡ„Π΅Ρ€Π° (ΠΏΡ€ΠΎΡ‚ΠΈΠ² 2 ΠšΠ‘ ΠΏΡ€ΠΈ полноэкранном Π±ΡƒΡ„Π΅Ρ€Π΅ Π² U8g2). Π­Ρ‚ΠΎ ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π½ΠΎ для ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° ATmega328P (ΠΊΠ°ΠΊ Π² Arduino Uno), Π³Π΄Π΅ свободной памяти часто мСньшС 2 ΠšΠ‘.

πŸ“Š Какой дисплСй Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ с U8glib?
  • SSD1306 (OLED)
  • Nokia 5110 (LCD)
  • SH1106
  • PCF8812
  • Π”Ρ€ΡƒΠ³ΠΎΠΉ

2. Установка ΠΈ настройка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

Π£ΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ U8glib ΠΌΠΎΠΆΠ½ΠΎ трСмя способами:

  1. Π§Π΅Ρ€Π΅Π· ΠœΠ΅Π½Π΅Π΄ΠΆΠ΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Arduino IDE: Π²Π²Π΅Π΄ΠΈΡ‚Π΅ Π² поискС U8glib ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ послСднюю Π²Π΅Ρ€ΡΠΈΡŽ (Π½Π° ΠΌΠΎΠΌΠ΅Π½Ρ‚ 2026 Π³ΠΎΠ΄Π° β€” 1.23).
  2. Ручная установка: скачайтС ZIP-Π°Ρ€Ρ…ΠΈΠ² с GitHub ΠΈ распакуйтС Π² ΠΏΠ°ΠΏΠΊΡƒ libraries вашСй Arduino IDE.
  3. Для PlatformIO: Π΄ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ строку lib_deps = olikraus/U8glib@^1.23 Π² platformio.ini.

ПослС установки ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ Ρ€Π°Π±ΠΎΡ‚ΠΎΡΠΏΠΎΡΠΎΠ±Π½ΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ HelloWorld (мСню Π€Π°ΠΉΠ» β†’ ΠŸΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ β†’ U8glib). Если Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ ошибка 'U8GLIB' not found, ΡƒΠ±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ:

  • πŸ“ Папка Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ называСтся U8glib (Π±Π΅Π· вСрсий ΠΈΠ»ΠΈ постфиксов)
  • πŸ”„ Arduino IDE ΠΏΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡ‰Π΅Π½Π° послС установки
  • πŸ› οΈ Π’ ΠΊΠΎΠ΄Π΅ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ: #include

β˜‘οΈ ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π΄ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ запуском

Π’Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΎ: 0 / 5

Для дисплССв с интСрфСйсом I2C (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, SSD1306) потрСбуСтся ΡƒΠΊΠ°Π·Π°Ρ‚ΡŒ адрСс устройства. Π‘Ρ‚Π°Π½Π΄Π°Ρ€Ρ‚Π½Ρ‹ΠΉ адрСс β€” 0x3C, Π½ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ 0x3D. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ адрСс ΠΌΠΎΠΆΠ½ΠΎ скСтчСм I2C_Scanner.

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с Nokia 5110 (PCF8814) ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ рСзистор 10 кОм ΠΌΠ΅ΠΆΠ΄Ρƒ RST ΠΈ +3.3V. Π‘Π΅Π· Π½Π΅Π³ΠΎ дисплСй ΠΌΠΎΠΆΠ΅Ρ‚ Π½Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ!

3. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π°

U8glib прСдоставляСт Π±ΠΎΠ»Π΅Π΅ 50 ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² для рисования ΠΈ управлСния дисплССм. Рассмотрим ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅:

Π€ΡƒΠ½ΠΊΡ†ΠΈΡΠžΠΏΠΈΡΠ°Π½ΠΈΠ΅ΠŸΡ€ΠΈΠΌΠ΅Ρ€
firstPage()НачинаСт отрисовку Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠ°Π΄Ρ€Π°
u8g.firstPage();

do { /* рисованиС */ }

while(u8g.nextPage());

setFont()УстанавливаСт ΡˆΡ€ΠΈΡ„Ρ‚u8g.setFont(u8g_font_6x10)
drawStr()Π’Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ строкуu8g.drawStr(0, 10, "ΠŸΡ€ΠΈΠ²Π΅Ρ‚!")
drawBox()РисуСт Π·Π°ΠΊΡ€Π°ΡˆΠ΅Π½Π½Ρ‹ΠΉ ΠΏΡ€ΡΠΌΠΎΡƒΠ³ΠΎΠ»ΡŒΠ½ΠΈΠΊu8g.drawBox(0, 0, 20, 10)
setContrast()НастраиваСт ΠΊΠΎΠ½Ρ‚Ρ€Π°ΡΡ‚Π½ΠΎΡΡ‚ΡŒ (0–255)u8g.setContrast(128)

ΠŸΡ€ΠΈΠΌΠ΅Ρ€ Π²Ρ‹Π²ΠΎΠ΄Π° тСкста ΠΈ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ Π½Π° SSD1306 128Γ—64:

#include 

U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE); // I2C / TWI

void draw() {

u8g.setFont(u8g_font_unifont);

u8g.drawStr(0, 20, "Π’Π΅ΠΌΠΏΠ΅Ρ€Π°Ρ‚ΡƒΡ€Π°:");

u8g.setPrintPos(80, 20);

u8g.print(23.5);

u8g.print("Β°C");

u8g.drawFrame(0, 0, 128, 15); // Π Π°ΠΌΠΊΠ°

}

void setup() {

u8g.begin();

}

void loop() {

u8g.firstPage();

do { draw(); }

while(u8g.nextPage());

delay(1000);

}

Для Π²Ρ‹Π²ΠΎΠ΄Π° ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ Unicode, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ u8g_font_unifont ΠΈΠ»ΠΈ u8g_font_cyrillic. ΠΠ»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° β€” созданиС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ ΡˆΡ€ΠΈΡ„Ρ‚Π° Ρ‡Π΅Ρ€Π΅Π· U8glib Font Creator.

πŸ’‘

Π§Ρ‚ΠΎΠ±Ρ‹ ΡΡΠΊΠΎΠ½ΠΎΠΌΠΈΡ‚ΡŒ ΠΏΠ°ΠΌΡΡ‚ΡŒ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡˆΡ€ΠΈΡ„Ρ‚Ρ‹ с суффиксом _r (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, u8g_font_6x10_r) β€” ΠΎΠ½ΠΈ хранятся Π² Flash, Π° Π½Π΅ Π² ΠžΠ—Π£.

4. ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ памяти ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ

U8glib автоматичСски управляСт Π±ΡƒΡ„Π΅Ρ€ΠΎΠΌ ΠΊΠ°Π΄Ρ€Π°, Π½ΠΎ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°Ρ… с ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌΠΈ рСсурсами трСбуСтся ручная оптимизация:

  • 🧹 УмСньшСниС Π±ΡƒΡ„Π΅Ρ€Π°: Для дисплССв с Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ΠΌ ≀ 84Γ—48 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Nokia 5110) ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ конструктор с ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ U8G_I2C_OPT_NO_ACK β€” это сокращаСт Π±ΡƒΡ„Π΅Ρ€ Π½Π° 20%.
  • ⚑ ЧастичноС ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅: ΠœΠ΅Ρ‚ΠΎΠ΄ setHiSpeed() ускоряСт Π²Ρ‹Π²ΠΎΠ΄ Π½Π° SSD1306 Π΄ΠΎ 2 Ρ€Π°Π·, Π½ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹.
  • πŸ”„ ΠžΡ‚ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π½Π΅Π½ΡƒΠΆΠ½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ: Π’ Ρ„Π°ΠΉΠ»Π΅ U8glib.h Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΡƒΠΉΡ‚Π΅ строки с Π½Π΅Π½ΡƒΠΆΠ½Ρ‹ΠΌΠΈ Π΄Ρ€Π°ΠΉΠ²Π΅Ρ€Π°ΠΌΠΈ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, //#define U8G_16BIT).

Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ потрСблСния памяти для Arduino Uno:

ДСйствиСFlash (Π±Π°ΠΉΡ‚)ΠžΠ—Π£ (Π±Π°ΠΉΡ‚)
Π‘Π°Π·ΠΎΠ²Ρ‹ΠΉ Π²Ρ‹Π²ΠΎΠ΄ тСкста4210312
+ ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ ΡˆΡ€ΠΈΡ„Ρ‚5830380
+ Анимация (2 ΠΊΠ°Π΄Ρ€Π°)6120512
Π‘ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ (NO_ACK)3980280
⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: ΠŸΡ€ΠΈ использовании setHiSpeed() Π½Π° дисплСях SH1106 Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ сбои ΠΏΡ€ΠΈ частотС I2C Π²Ρ‹ΡˆΠ΅ 400 ΠΊΠ“Ρ†. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΡŒΡ‚Π΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² Wire.begin()!

5. Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ U8glib ΠΈ U8g2: Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ

Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° U8g2 (ΠΏΡ€ΠΈΡˆΠ΅Π΄ΡˆΠ°Ρ Π½Π° смСну U8glib) ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ, Π½ΠΎ Π½Π΅ всСгда ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π°:

ΠšΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΉU8glibU8g2
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Ρ†Π²Π΅Ρ‚Π½Ρ‹Ρ… дисплССв❌ ΠΠ΅Ρ‚βœ… Π”Π° (ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½ΠΎ)
Минимальная Flash-ΠΏΠ°ΠΌΡΡ‚ΡŒ~3.5 ΠšΠ‘~8 ΠšΠ‘
Π¨Ρ€ΠΈΡ„Ρ‚Ρ‹ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ Π½Π°Π±ΠΎΡ€100+ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ², Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Unicode
Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²ΠΊΠΈΠœΠ΅Π΄Π»Π΅Π½Π½Π΅Π΅ (no buffer)БыстрСС (full buffer)
Π‘ΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒΠ›ΡƒΡ‡ΡˆΠ΅ для AVRΠ›ΡƒΡ‡ΡˆΠ΅ для ESP32/ARM

Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ U8glib, Ссли:

  • πŸ”‹ Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚Π΅ Π½Π° ATmega328P ΠΈΠ»ΠΈ ATtiny с ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ < 8 ΠšΠ‘.
  • ⚑ НуТна максимальная ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ со старыми ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°ΠΌΠΈ.
  • πŸ› οΈ Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ дисплСи Π±Π΅Π· ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π² U8g2 (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, PCF8833).

ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° U8g2, Ссли:

  • πŸ–₯️ Π’Π°Ρˆ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»Π»Π΅Ρ€ β€” ESP32, STM32 ΠΈΠ»ΠΈ Raspberry Pi Pico.
  • 🎨 НуТСн Π²Ρ‹Π²ΠΎΠ΄ ΠΊΠΈΡ€ΠΈΠ»Π»ΠΈΡ†Ρ‹ Π±Π΅Π· Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΡ€ΠΎΡˆΠΈΠ²ΠΊΠΈ ΡˆΡ€ΠΈΡ„Ρ‚ΠΎΠ².
  • πŸ”„ ВрСбуСтся плавная анимация с частотой > 10 FPS.
πŸ’‘

Для 90% ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π½Π° Arduino Uno/Nano ΠΎΠΏΡ‚ΠΈΠΌΠ°Π»Π΅Π½ Π²Ρ‹Π±ΠΎΡ€ U8glib β€” ΠΎΠ½Π° экономит Π΄ΠΎ 40% памяти ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с U8g2.

6. Π’ΠΈΠΏΠΈΡ‡Π½Ρ‹Π΅ ошибки ΠΈ ΠΈΡ… Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

Ошибки ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с U8glib часто связаны с Π½Π΅Π²Π΅Ρ€Π½ΠΎΠΉ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ дисплСя ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚Π°ΠΌΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ. Рассмотрим Ρ‚ΠΎΠΏ-5 ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ:

  1. Ошибка компиляции: 'U8GLIB_SSD1306_128X64' does not name a type

    ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π°: НСподходящий конструктор для вашСго дисплСя. РСшСниС: ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ модСль экрана ΠΈ Π²Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½Ρ‹ΠΉ класс (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, U8GLIB_SH1106_128X64 для SH1106). ΠŸΠΎΠ»Π½Ρ‹ΠΉ список β€” Π² Ρ„Π°ΠΉΠ»Π΅ U8glib.h.

  2. Π‘Π΅Π»Ρ‹ΠΉ экран ΠΈΠ»ΠΈ Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹

    ΠŸΡ€ΠΈΡ‡ΠΈΠ½Ρ‹: ΠΠ΅ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠ΅ напряТСниС питания (Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±Ρ‹Ρ‚ΡŒ 3.3V для Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° OLED) ΠΈΠ»ΠΈ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Ρ‘Π½Π½Ρ‹ΠΉ дисплСй. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΠΌΠ΅Ρ‚Ρ€ΠΎΠΌ напряТСниС Π½Π° Π²Ρ‹Π²ΠΎΠ΄Π°Ρ… VCC ΠΈ GND.

  3. ВСкст Π½Π΅ отобраТаСтся

    РСшСниС: Π£Π±Π΅Π΄ΠΈΡ‚Π΅ΡΡŒ, Ρ‡Ρ‚ΠΎ Π²Ρ‹Π·Π²Π°Π½ u8g.firstPage() ΠΈ u8g.nextPage() Π² Ρ†ΠΈΠΊΠ»Π΅. Π‘Π΅Π· Π½ΠΈΡ… Π±ΡƒΡ„Π΅Ρ€ Π½Π΅ отправляСтся Π½Π° дисплСй!

Для диагностики Π°ΠΏΠΏΠ°Ρ€Π°Ρ‚Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ тСстовый скСтч:

void testDisplay() {

u8g.drawBox(0, 0, 128, 64); // Π—Π°ΠΊΡ€Π°ΡΠΈΡ‚ΡŒ экран

delay(1000);

u8g.drawBox(0, 0, 128, 64); // ΠžΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ экран

u8g.setColorIndex(1); // Π‘Π΅Π»Ρ‹ΠΉ Ρ†Π²Π΅Ρ‚

u8g.drawPixel(64, 32); // Π’ΠΎΡ‡ΠΊΠ° Π² Ρ†Π΅Π½Ρ‚Ρ€Π΅

}

⚠️ Π’Π½ΠΈΠΌΠ°Π½ΠΈΠ΅: Если послС Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ скСтча дисплСй SSD1306 ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ случайныС пиксСли, ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ ΠΏΠΎΠ΄Ρ‚ΡΠ³ΠΈΠ²Π°ΡŽΡ‰ΠΈΠΉ рСзистор Π½Π° Π»ΠΈΠ½ΠΈΠΈ SDA (стандарт β€” 4.7 кОм ΠΊ +3.3V).

7. ΠŸΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹Π΅ Ρ‚Π΅Ρ…Π½ΠΈΠΊΠΈ: анимация ΠΈ взаимодСйствиС

Π‘ U8glib ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ простыС Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹Π΅ интСрфСйсы. ΠŸΡ€ΠΈΠΌΠ΅Ρ€ ΠΏΠ»Π°Π²Π½ΠΎΠ³ΠΎ пСрСмСщСния ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°:

int x = 0;

void loop() {

u8g.firstPage();

do {

u8g.drawBox(x, 30, 10, 10); // ΠšΠ²Π°Π΄Ρ€Π°Ρ‚

x = (x + 1) % 118; // Π”Π²ΠΈΠΆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΊΡ€ΡƒΠ³Ρƒ

} while(u8g.nextPage());

delay(50);

}

Для ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Π½Π°ΠΆΠ°Ρ‚ΠΈΠΉ ΠΊΠ½ΠΎΠΏΠΎΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ прСрывания ΠΈΠ»ΠΈ опрос Π² loop():

#define BUTTON_PIN 2

void setup() {

pinMode(BUTTON_PIN, INPUT_PULLUP);

}

void loop() {

if (digitalRead(BUTTON_PIN) == LOW) {

u8g.drawStr(0, 20, "Кнопка Π½Π°ΠΆΠ°Ρ‚Π°!");

}

// ... отрисовка ...

}

Для слоТных ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² (мСню, Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ) рСкомСндуСтся:

  • πŸ“Š Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΄Π²ΠΎΠΉΠ½ΡƒΡŽ Π±ΡƒΡ„Π΅Ρ€ΠΈΠ·Π°Ρ†ΠΈΡŽ: рисуйтС Π² скрытом Π±ΡƒΡ„Π΅Ρ€Π΅, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΊΠΎΠΏΠΈΡ€ΡƒΠΉΡ‚Π΅ Π½Π° экран.
  • πŸ”„ ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Ρ†ΠΈΠΊΠ»Ρ‹: ΠΈΠ·Π±Π΅Π³Π°ΠΉΡ‚Π΅ Π²Ρ‹Π·ΠΎΠ²Π° drawStr() Π² loop() β€” Π»ΡƒΡ‡ΡˆΠ΅ обновляйтС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·ΠΌΠ΅Π½Ρ‘Π½Π½Ρ‹Π΅ элСмСнты.
  • πŸ› οΈ Для Π³Ρ€Π°Ρ„ΠΈΠΊΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ массив Ρ‚ΠΎΡ‡Π΅ΠΊ ΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ drawLine() вмСсто пиксСлСй.
Как ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹Π²ΠΎΠ΄ Π³Ρ€Π°Ρ„ΠΈΠΊΠΈ?

1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΌΠ΅Ρ‚ΠΎΠ΄ drawBitmap() для статичСских ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ β€” ΠΎΠ½ Π² 3 Ρ€Π°Π·Π° быстрСС, Ρ‡Π΅ΠΌ рисованиС пиксСлСй.

2. ΠžΡ‚ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Π³Ρ€Π°Π½ΠΈΡ†: u8g.setClipWindow(0, 0, 128, 64).

3. Для Π°Π½ΠΈΠΌΠ°Ρ†ΠΈΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΈ Π΄ΠΎ 64Γ—48 (Ссли позволяСт дисплСй).

FAQ: ЧастыС вопросы ΠΏΠΎ U8glib

Как вывСсти русскиС символы?

Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΡˆΡ€ΠΈΡ„Ρ‚ u8g_font_cyrillic ΠΈΠ»ΠΈ создайтС свой Ρ‡Π΅Ρ€Π΅Π· U8glib Font Creator. ΠŸΡ€ΠΈΠΌΠ΅Ρ€:

u8g.setFont(u8g_font_cyrillic);

u8g.drawStr(0, 20, "ΠŸΡ€ΠΈΠ²Π΅Ρ‚, ΠΌΠΈΡ€!");

Для ΠΏΠΎΠ»Π½ΠΎΠΉ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Unicode ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° U8g2.

МоТно Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ U8glib Π½Π° ESP32?

ВСхничСски Π΄Π°, Π½ΠΎ Π½Π΅ рСкомСндуСтся. U8glib Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π° для многозадачности ESP32 ΠΈ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²Π°Ρ‚ΡŒ с Wi-Fi. Для ESP32 Π»ΡƒΡ‡ΡˆΠ΅ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ U8g2 ΠΈΠ»ΠΈ TFT_eSPI.

Как ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΌΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ экрана?

ΠœΠ΅Ρ€Ρ†Π°Π½ΠΈΠ΅ Π²Ρ‹Π·Π²Π°Π½ΠΎ ΠΏΠΎΠ»Π½ΠΎΠΉ пСрСрисовкой Π±ΡƒΡ„Π΅Ρ€Π°. РСшСния:

  1. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ setHiSpeed() (Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для SSD1306).
  2. Π£ΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚Π΅ ΠΎΠ±Π»Π°ΡΡ‚ΡŒ обновлСния: u8g.setClipWindow(x, y, w, h).
  3. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚Π΅ Π½Π° U8g2 с ΠΎΠΏΡ†ΠΈΠ΅ΠΉ FULL_BUFFER.
Π“Π΄Π΅ ΡΠΊΠ°Ρ‡Π°Ρ‚ΡŒ Π΄Π°Ρ‚Π°ΡˆΠΈΡ‚Ρ‹ для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… дисплССв?

ΠžΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ Π΄Π°Ρ‚Π°ΡˆΠΈΡ‚Ρ‹:

Как ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ нСсколько дисплССв ΠΊ ΠΎΠ΄Π½ΠΎΠΌΡƒ Arduino?

Для I2C-дисплССв ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Ρ€Π°Π·Π½Ρ‹Π΅ адрСса (ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚Π΅ рСзисторы A0/A1 Π½Π° ΠΌΠΎΠ΄ΡƒΠ»Π΅). ΠŸΡ€ΠΈΠΌΠ΅Ρ€ для Π΄Π²ΡƒΡ… SSD1306:

U8GLIB_SSD1306_128X64 u8g_1(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_0);

U8GLIB_SSD1306_128X64 u8g_2(U8G_I2C_OPT_NONE | U8G_I2C_OPT_DEV_1);

Для SPI задСйствуйтС Ρ€Π°Π·Π½Ρ‹Π΅ ΠΏΠΈΠ½Ρ‹ CS.