Органические светоизлучающие диоды (OLED) – это своего рода диоды, в которых светоизлучающий слой, состоящий из органического соединения, излучает свет при подаче электрического тока. Этот слой размещен между двумя электродами. Данная технология используется в экранах дисплеев устройств, таких как компьютеры, телевизоры, смартфоны и т. д. Дисплеи OLED имеют собственный источник света и не нуждаются в какой-либо подсветке, как в случае с ЖК-дисплеем, поэтому они энергоэффективны и используются со многими микроконтроллерами.

В этом примере мы будем связывать OLED-дисплей с NodeMCU ESP8266. NodeMCU – это платформа Интернета вещей, работающая на основе недорогого чипа ESP8266 с поддержкой Wi-Fi. Он имеет контакты GPIO для подключения других периферийных устройств и поддерживает последовательную связь с помощью контактов SPI, I2C и UART.
В данном проекте вместе с ESP8266 мы будем использовать монохромный 7-выводной OLED-дисплей SSD1306 размером 0,96 дюйма, который имеет 128 пикселей по ширине и 64 пикселей по длине. Этот дисплей может работать как с протоколом связи SPI, так и с протоколом I2C. Мы будем использовать протокол SPI в этом уроке. На этом OLED присутствует микросхема SSD1306, которая помогает отображать пиксели на экране. Схема подключения NodeMCU ESP8266 и OLED-дисплея SSD1306 показана далее.

Вывод GND поступает на линию GND NodeMCU, вывод VDD может быть подключен к 3,3 В или 5 В, SCK – это вывод синхронизации на OLED-дисплее, который подключен к D5 NodeMCU для синхронизации SPI. Вывод SDA, который является выводом MOSI на OLED-дисплее для интерфейса SPI, поступает на D7 NodeMCU. Вывод RESET подключен к D3. DC, вывод команды данных подключен к D2 NodeMCU. Последний вывод – CS для выбора микросхемы идет к D8.
Здесь мы будем использовать библиотеки «Adafruit _SSD1306.h» и «Adafruit_GFX.h» для взаимодействия OLED с NodeMCU. Откройте Arduino IDE и установите последнюю версию из Arduino IDE (Скетч – Включить библиотеку – Управление библиотеками или нажмите Ctrl + Shift_I).

Поскольку размер в пикселях нашего OLED-дисплея равен 128x64, поэтому мы должны внести изменения в заголовочный файл Adafruit_SSD1306. Откройте библиотеки Arduino, перейдите к Adafruit_SSD1306 и откройте его заголовочный файл (Adafruit _SSD1306.h). Закомментируйте строку «#define SSD1306_128_32» и раскомментируйте строку «#define SSD1306_128_64», как показано на рисунке ниже, а затем сохраните файл. По умолчанию эта библиотека поставляется с «#define SSD1306_128_32».

Наконец, измените номера контактов в примере Adafruit SSD1306 «ssd1306_128x64_spi» в соответствии со схемой подключения, приведенной выше. Теперь, когда вы запустите скетч после правильного подключения OLED-дисплея к NodeMCU, вы увидите логотип Adafruit на OLED-дисплее, который по умолчанию сохраняется в библиотеке. После логотипа Adafruit отображается много других графических элементов, таких как линии, прямоугольники, треугольники, круги, строки, числа, анимация и растровые изображения. Здесь в этом уроке мы научимся отображать любое изображение на OLED с помощью NodeMCU ESP8266.

Полный код программы приводится в конце. Здесь поясним некоторые основные функции, используемые в коде. Дисплей OLED-экрана очищается перед отображением чего-либо, вызывая функцию display.clearDisplay(). Мы устанавливаем размер шрифта равным 2, вызывая функцию setTextSize(font-size), и устанавливаем цвет текста и положение курсора с помощью функций setTextColor и setCursor. Команда Display.display() используется для передачи данных во внутреннюю память контроллера SSD1306. После передачи пиксель появляется на экране. Теперь мы можем начать прокручивать текст различными способами, вызывая display.startscrollright(x-pos, y-pos) и display.startscrollleft(x-pos, y-pos) в течение времени, указанного в функции задержки. Прокрутка текста может быть остановлена с помощью функции display.stopscroll().
Мы вызываем функцию display.drawBitmap(), которая принимает 6 параметров (координата x, координата y, массив растровых изображений, ширина, высота и цвет) для рисования изображения на OLED. Так как наш размер дисплея 128х64, поэтому мы устанавливаем ширину и высоту как 128 и 64 соответственно. Здесь массив растровых изображений содержит информацию о пикселях, чтобы нарисовать пиксель на экране для создания изображения. Этот растровый массив может быть сгенерирован с помощью онлайн-инструментов, также имеется много программ для преобразования изображения в растровый массив. Растровое изображение в режиме онлайн может быть сгенерировано с помощью http://javl.github.io/image2cpp/. Загрузите файл изображения, который вы хотите отобразить на OLED и установите размер 128x64. Будет показано предварительное изображение, а затем будет создан массив растровых изображений.


Наконец загрузите полный код в NodeMCU ESP8266, и вы увидите изображение, отображаемое на OLED-экране.

Полный код программы:
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#define SCREEN_WIDTH 128 // ширина в пикселях
#define SCREEN_HEIGHT 64 // высота в пикселях
// линии SPI подключения:
#define OLED_MOSI D7
#define OLED_CLK D5
#define OLED_DC D2
#define OLED_CS D8
#define OLED_RESET D3
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT,
OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);
const unsigned char myBitmap [] PROGMEM = {
0xff, 0xff, 0xff, 0xe0, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xc0, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf7, 0xc0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc7, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x0f, 0x01, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x0f, 0x03, 0xff, 0xc0, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf8, 0x1e, 0x03, 0x3f, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x3e, 0x03, 0x3f, 0xfc, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0x3c, 0x03, 0x7f, 0xfe, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x7c, 0x03, 0xf0, 0x3f, 0x83, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x80, 0x78, 0x00, 0xc0, 0x0f, 0xc1, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0xf8, 0x00, 0x00, 0x07, 0xe0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x01, 0xf0, 0x00, 0x00, 0x03, 0xf8, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x01, 0xf0, 0x00, 0x00, 0x00, 0xfc, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x03, 0xe0, 0x00, 0x0f, 0x00, 0x7e, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x07, 0xc0, 0x3f, 0xff, 0x80, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x7f, 0xf9, 0x80, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x80, 0xff, 0xf9, 0x80, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x80, 0xff, 0xff, 0x80, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x01, 0xf0, 0x1f, 0x80, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x00, 0x03, 0xe0, 0x06, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x00, 0x07, 0xc0, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x07, 0x80, 0x00, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x0f, 0x80, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x1e, 0x01, 0xe0, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x1e, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x3c, 0x03, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x7c, 0x03, 0x3f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x01, 0xe0, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x00, 0x00, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x01, 0xf0, 0x00, 0x00, 0x00, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x03, 0xb0, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x03, 0x18, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0x80, 0x00, 0x03, 0xbc, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x00, 0x01, 0xfe, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xc0, 0x00, 0x00, 0xff, 0xff, 0x80, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x00, 0x1f, 0xff, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x00, 0x07, 0xfc, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x80, 0x03, 0xf0, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x01, 0xc0, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x03, 0xff, 0xc0, 0x00, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xf8, 0x00, 0xff, 0xe0, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfc, 0x00, 0x3f, 0xe0, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xfe, 0x00, 0x0e, 0x30, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x00, 0x07, 0x70, 0x00, 0xff, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0x80, 0x03, 0xe0, 0x1b, 0xfc, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xc0, 0x01, 0xc0, 0x7f, 0xf0, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xe0, 0x00, 0x00, 0x7f, 0xc0, 0x07, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf0, 0x00, 0x00, 0x67, 0x00, 0x0f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xf8, 0x00, 0x00, 0x66, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xfe, 0x00, 0x00, 0x7e, 0x00, 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0x00, 0x00, 0x3c, 0x01, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xc0, 0x00, 0x00, 0x03, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xf0, 0x00, 0x00, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xfe, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
0xff, 0xff, 0xff, 0xf8, 0x1f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
};
void setup() {
Serial.begin(9600);
// SSD1306_SWITCHCAPVCC = внутренняя генерация напряжения 3,3 В на дисплее
if(!display.begin(SSD1306_SWITCHCAPVCC)) {
Serial.println(F("SSD1306 allocation failed"));
for(;;); // Не продолжать, бесконечный цикл
}
// Показать начальное содержимое буфера на экране -
// библиотека инициализирует это с помощью заставки Adafruit.
//display.display();
//delay(2000); // Пауза на 2 секунды
// Очистить буфер
display.clearDisplay();
testscrolltext();
// Очистить буфер
display.clearDisplay();
// Отображать растровое изображение
display.drawBitmap(35, 0, myBitmap, 128, 64, BLACK, WHITE);
display.display();
}
void loop() {
}
void testscrolltext(void) {
display.clearDisplay();
display.setTextSize(2); // Отобразить двумерный текст
display.setTextColor(WHITE);
display.setCursor(0, 0);
display.println(F("CIRCUIT"));
display.println(F("DIGEST"));
display.display(); // Показать исходный текст
delay(100);
// Прокрутим в разных направлениях, делая паузу между ними:
display.startscrollright(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrollleft(0x00, 0x0F);
delay(2000);
display.stopscroll();
delay(1000);
display.startscrolldiagright(0x00, 0x07);
delay(2000);
display.startscrolldiagleft(0x00, 0x07);
delay(2000);
display.stopscroll();
delay(1000);
}
© digitrode.ru