Освой Arduino играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Библиотека для работы с монохромным OLED-дисплеем. Поддерживаются платы семейств Arduino, ESP32, ESP8266 (не поддерживается ATtiny85). Поддерживаются интерфейсы SPI и Wire (I2C).
Домашняя страница - adafruit/Adafruit_SSD1306: Arduino library for SSD1306 monochrome 128x64 and 128x32 OLEDs
Adafruit_SSD1306 доступна через менеджер библиотек в Arduino IDE. Часто используется в связке с другой библиотекой Adafruit GFX Library для рисования различных фигур.
Один из вариантов подключения (SPI) описан в статье об OLED-экране. Для поддержки русских шрифтов смотрите другую статью.
Для I2C вариант следующий (Uno, Nano):
OLED | Arduino
--------------
GND | GND
VCC | 5V
SCL | A5
SDA | A4
Для ESP32:
OLED | ESP32
------------
GND | GND
VCC | 5V
SCL | D22
SDA | D21
Для работы с библиотекой нужно включить заголовочные файлы.
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
Напишем простой скетч, который выводит строку.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// software SPI:
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 12
#define OLED_RESET 8
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("http://developer.alexanderklimov.ru/");
display.display();
}
void loop() {}
При изучении встроенных примеров библиотеки обнаружил, что конструктор используется другой - с указанием размера дисплея. При этом шрифт стал меньше. Попробуем новый вариант.
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// software SPI:
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 12
#define OLED_RESET 8
// Новый конструктор с указанием размеров экрана
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.setTextSize(1);
display.setTextColor(WHITE);
display.setCursor(0,0);
display.println("Hello Kitty");
display.setTextSize(2);
display.setCursor(0, 10);
display.println("Hello Kitty");
display.display();
}
void loop() {}
Одно маленькое примечание - при использовании нового конструктора библиотека по умолчанию выводит логотип фирмы Adafruit. Чтобы от него избавится, не забывайте вызывать функцию clearDisplay().
Мы можем выводить на экран изображения. Процесс требует определённых затрат. О том как перевести изображение в набор байт с помощью графического редактора GIMP описан в статье компании Амперкот. У компании замечательный логотип для примера и я им воспользовался с небольшими изменениями.
// Arduino Uno Original Port 5
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // OLED display width, in pixels
#define SCREEN_HEIGHT 64 // OLED display height, in pixels
// software SPI:
#define OLED_MOSI 11
#define OLED_CLK 13
#define OLED_DC 9
#define OLED_CS 12
#define OLED_RESET 8
//Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
#define amperkot_logo_width 28
#define amperkot_logo_height 44
static const unsigned char PROGMEM amperkot_logo_bits[] = {
0x60, 0x00, 0x60, 0x00, 0xe0, 0x00, 0x70, 0x00, 0xe0, 0x01, 0x70, 0x00,
0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x7f, 0x00,
0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x7f, 0x00,
0xe0, 0xff, 0x7f, 0x00, 0xf8, 0xff, 0xff, 0x01, 0xf0, 0xff, 0xff, 0x00,
0xf0, 0xff, 0xff, 0x00, 0xf8, 0xff, 0xff, 0x01, 0xe0, 0xff, 0x7f, 0x00,
0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xff, 0x7f, 0x00, 0xe0, 0xcf, 0xff, 0x00,
0xf0, 0x0f, 0xff, 0x00, 0xf8, 0x07, 0xf8, 0x01, 0xf8, 0x07, 0xfc, 0x01,
0xfc, 0x07, 0xfc, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xfe, 0x03, 0xfe, 0x07,
0xfe, 0x03, 0xff, 0x07, 0xfe, 0x03, 0xff, 0x07, 0xfe, 0x83, 0xff, 0x07,
0xfe, 0x81, 0xff, 0x07, 0xff, 0xc0, 0xff, 0x0f, 0xff, 0xc0, 0xff, 0x0f,
0xff, 0xc0, 0xff, 0x0f, 0xff, 0x00, 0xff, 0x0f, 0xff, 0x01, 0xfc, 0x0f,
0xff, 0x07, 0xf0, 0x0f, 0xff, 0xff, 0xf0, 0x0f, 0xff, 0xff, 0xf0, 0x0f,
0xfe, 0xff, 0xf8, 0x0f, 0xfe, 0xff, 0xfc, 0x07, 0xfe, 0x7f, 0xfc, 0x07,
0xfe, 0x7f, 0xfc, 0x07, 0xfe, 0x3f, 0xfe, 0x07, 0xf8, 0x3f, 0xff, 0x01,
0xf8, 0x3f, 0xff, 0x01, 0x80, 0x1f, 0x1f, 0x00
};
void setup() {
display.begin(SSD1306_SWITCHCAPVCC);
display.clearDisplay();
display.drawXBitmap(128 / 2 - amperkot_logo_width / 2, 0,
amperkot_logo_bits, amperkot_logo_width, amperkot_logo_height, 1);
display.display();
display.setTextSize(2);
display.setTextColor(WHITE);
display.setCursor(18, 50);
// Вывод текст с помощью отдельных символов
display.write(65);
display.write(109);
display.write(112);
display.write(101);
display.write(114);
display.write(107);
display.write(111);
display.write(116);
display.display();
}
void loop() {}
Другие функции.
void invertDisplay(boolean i);
void dim(boolean dim);
void startscrollright(uint8_t start, uint8_t stop);
void startscrollleft(uint8_t start, uint8_t stop);
void startscrolldiagright(uint8_t start, uint8_t stop);
void startscrolldiagleft(uint8_t start, uint8_t stop);
void stopscroll(void);
void ssd1306_command(uint8_t c);
boolean getPixel(int16_t x, int16_t y);
uint8_t *getBuffer(void);
Функции для вывода текста относятся к библиотеке Adafruit GFX.
Кроме способа через GIMP, описанного выше, есть более удобный способ - воспользоваться онлайн-конвертером. Страницу можно сохранить на компьютере и пользоваться оффлайн. Исходники на Гитхабе.
Управление объектами на OLED-дисплее при помощи джойстика