Підключення oled дисплея з контролером SSD1306 до STM32 за I2C

Багато хто, напевно, знають про таких маленьких дешевих (менше $3) OLED-дисплеях, які можна знайти у величезному асортименті на ebay або aliexpress. В інтернеті існує безліч різних статей про те, як підключати ці дисплеї до Arduino і іншим МК, але для STM32f10x важко знайти навіть бібліотеку. Тому я вирішив написати цю статтю.

Цей дисплей має роздільною здатністю 128х64 пікселів і контролер SSD1306 і подклчается до мікроконтролера по інтерфейсу I2C.



Для STM32 була знайдена бібліотека для цього дисплея, але вона була для серії f4xx — необхідно було модифікувати для f10x.

Вихідні файли модифікованої мною бібліотеки можна взяти тут.
ssd1306_i2c.c
ssd1306_i2c.h
Інтерфейс для роботи з I2C
ssd1306.c
ssd1306.h
Бібліотека для роботи з дисплеєм. Являє методи для малювання на дисплеї, виведення тексту, і виведення всього на oled.
fonts.c
fonts.h
Шрифти для виводу тексту на екран. Там є три шрифту, але можна створити будь-який свій за допомогою програми або аналогів
Схема підключення гранично проста:
Vcc +3.3 V. Допустима напруга — від 3.3 до 5В
GND GND
SCL PB6
SDA PB7
image

Для роботи з бібліотекою потрібно підключити заголовковий файл:

#include "ssd1306.h"

Перед використанням ініціалізувати:

SSD1306_Init();

Тепер можна що-небудь намалювати:

SSD1306_GotoXY(0, 44); //Встановлюємо курсор в позицію 0;44. Спочатку по горизонталі, потім вертикалі.
SSD1306_Puts("Hello, habrahabr!!", &Font_7x10, SSD1306_COLOR_WHITE); //пишемо напис у виставленої позиції шрифтом "Font_7x10" білим кольором. 
SSD1306_DrawCircle(10, 33, 7, SSD1306_COLOR_WHITE); //малюємо білу окружність у позиції 10;33 і радіусом 7 пікселів

Все, що ми намалювали зараз знаходиться в буффере в оперативній пам'яті МК, щоб вивести все на дисплей необхідно викликати:

SSD1306_UpdateScreen();

Після цього наш дисплей оновиться і буде виводити напис і гурток. Після виклику SSD1306_UpdateScreen() буффер в МК не скидається сам, тому нові малюнки будуть поверх попередніх, для скидання можна заповнити всі чорним кольором:

SSD1306_Fill(SSD1306_COLOR_BLACK);

Всі функції бібліотеки:

uint8_t SSD1306_Init(); //Ініціалізація

SSD1306_UpdateScreen(); //Посилаємо дані з буффера в пам'яті дисплею

SSD1306_ToggleInvert(); //інвертує кольори зображення оперативної пам'яті

SSD1306_Fill(SSD1306_COLOR_t Color); //заповнюємо дисплей бажаним кольором

SSD1306_DrawPixel(uint16_t x, uint16_t y, SSD1306_COLOR_t color); //намалювати один піксел

SSD1306_GotoXY(uint16_t x, uint16_t y); //встановити позицію текстового курсора

SSD1306_Putc(char ch, FontDef_t* Font, SSD1306_COLOR_t color); //вивести символ сһ в позиції курсора

SSD1306_Puts(char* str, FontDef_t* Font, SSD1306_COLOR_t color); //вивести рядок str в позиції курсора

SSD1306_DrawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, SSD1306_COLOR_t c); //намалювати лінію

SSD1306_DrawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //прямокутник наррисовать

SSD1306_DrawFilledRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, SSD1306_COLOR_t c); //заповнений прямокутник

SSD1306_DrawTriangle(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2, uint16_t x3, uint16_t y3, SSD1306_COLOR_t color); //трикутник

SSD1306_DrawCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //коло радіуса r

SSD1306_DrawFilledCircle(int16_t x0, int16_t y0, int16_t r, SSD1306_COLOR_t c); //заповнений коло

Доступні шрифти, але ви так само можете додати свої, в тому числі і росіяни:

  • Font_7x10
  • Font_11x18
  • Font_16x26
Дисплей працює досить швидко(FPS близько 14-18) на швидкості I2C 400кГц(450 теж без проблем, але ризикувати не став, а на 500 пригальмовує) і без проблем.

Використовував CooCox IDE. Готовий проект можна скачати тут: Яндекс.Диск.

P. S. з моменту написання статті і до її публікації з пісочниці пройшло досить багато часу(6 місяців), за яке я встиг кілька разів змінити бібліотеку.

Більш нову версію бібліотеки з підтримкою DMA і тестовий проект для Keil і cubeMx можна взяти тут: github.com/SL-RU/stm32libs/tree/master/HAL/ssd1306

Останню версію бібліотеки ви знайдете тут: github.com/SL-RU/sdmplayer/tree/master/src/v002/Hardware

Приклад роботи бібліотеки:


З задоволенням відповім на ваші запитання! Удачі!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.