- PVSM.RU - https://www.pvsm.ru -

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

Подключение oled дисплея с контроллером SSD1306 к STM32 по I2C - 1Многие, наверное, знают о таких маленьких дешёвых (меньше $3) OLED дисплеях, которые можно найти в огромном ассортименте на ebay или aliexpress. В интернете существует множество различных статей о том, как подключать эти дисплеи к Arduino и другим МК, но для STM32f10x затруднительно найти даже библиотеку. Поэтому я решил написать эту статью.

Данный дисплей имеет разрешение 128х64 пиксела и контроллер SSD1306 и подклчается к микроконтроллеру по интерфейсу I2C.

Для STM32 была найдена библиотека для этого дисплея [1], но она была для серии f4xx — необходимо было модифицировать для f10x.

Исходные файлы модифицированной мной библиотеки можно взять тут [2].

ssd1306_i2c.c
ssd1306_i2c.h
Интерфейс для работы с I2C
ssd1306.c
ssd1306.h
Библиотека для работы с дисплеем. Представляет методы для рисования на дисплее, вывода текста, и вывода всего на oled.
fonts.c
fonts.h
Шрифты для вывода текста на экран. Там есть три шрифта, но можно создать любой свой при помощи этой программы [3] или аналогов

Схема подключения предельно проста:

Vcc +3.3V. Допустимое напряжение — от 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); //вывести символ сh в позиции курсора

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. Готовый проект можно скачать тут: Яндекс.Диск [4].

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

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

Самую последнюю версию библиотеки вы найдёте тут: github.com/SL-RU/sdmplayer/tree/master/src/v002/Hardware [6]

Пример работы библиотеки:

С удовольствием отвечу на ваши вопросы! Удачи!

Автор: SL_RU

Источник [7]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/stm32/202526

Ссылки в тексте:

[1] найдена библиотека для этого дисплея: http://stm32f4-discovery.com/2015/05/library-61-ssd1306-oled-i2c-lcd-for-stm32f4xx/

[2] тут: https://github.com/SL-RU/stm32libs/tree/master/stm32f10x/ssd1306

[3] этой программы: http://www.eran.io/the-dot-factory-an-lcd-font-and-image-generator/

[4] Яндекс.Диск: https://yadi.sk/d/EE3sfUxroJFR8

[5] github.com/SL-RU/stm32libs/tree/master/HAL/ssd1306: https://github.com/SL-RU/stm32libs/tree/master/HAL/ssd1306

[6] github.com/SL-RU/sdmplayer/tree/master/src/v002/Hardware: https://github.com/SL-RU/sdmplayer/tree/master/src/v002/Hardware

[7] Источник: https://habrahabr.ru/post/313490/?utm_source=habrahabr&utm_medium=rss&utm_campaign=sandbox