Освой Arduino играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Библиотека Adafruit_SSD1306

Библиотека для работы с монохромным 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() {}
Amperkot

API

  • void display(void) - выводит подготовленные данные на экран
  • void clearDisplay(void) - очищает буфер, стирая все пиксели на экране
  • void drawPixel(int16_t x, int16_t y, uint16_t color) - рисует пиксель в указанных координатах указанным цветом

Другие функции.

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.

  • setTextSize(n) – задаёт размер шрифта (от «1» до «8»)
  • setCursor(x, y) – задаёт координаты, с которых начнётся вывод текста
  • print("msg")/println("msg") – печать строки

Перевод изображения

Кроме способа через GIMP, описанного выше, есть более удобный способ - воспользоваться онлайн-конвертером. Страницу можно сохранить на компьютере и пользоваться оффлайн. Исходники на Гитхабе.

Дополнительные материалы

Секундомер на OLED-дисплее

Управление объектами на OLED-дисплее при помощи джойстика

Реклама