Содержание
- Обзор
- Технические характеристики модуля
- Подключение к плате Arduino
- Использование русских шрифтов в библиотеке OLED
- Пример использования
- Часто задаваемые вопросы FAQ
Обзор OLED дисплея
В последнее время очень часто в проектах Arduino используют не простые ЖК индикаторы, а OLED-дисплеи, несмотря на то, что OLED-дисплеи дороже. Что это за дисплей, и в чем их преимущество? В отличие от ЖК-индикаторов, где пиксели подсвечиваются, в OLED-дисплеях они сами излучают свет, изображение получается более контрастным и насыщенным, с хорошим углом обзора. К тому же OLED-дисплеи обладают незначительном энергопотреблением.
Рисунок 1. OLED-дисплей 0.96″ 128×64.
Технические характеристики дисплея OLED 128×64
- Цвет – монохромный;
- Разрешение – 128 х 64;
- Графический чип – SSD1306;
- Интерфейс – I2C;
- Цвет дисплея – синий;
- Угол обзора> 160 °;
- Напряжение питания – от 3 до 5 В;
- Размер: 27х27х4 мм.
Подключение к плате Arduino
В Arduino-проектах используются OLED-дисплеи в виде модуля с необходимой обвязкой на чипе SSD1306. Данные модули работают на интерфейсе I2C. Схема подключения к плате Arduino показана на рисунке 2.Рисунок 2. Схема подключения дисплея к плате Arduino
Сначала определим адрес нашего дисплея на I2C шине. Загрузим на плату Arduino скетч сканера I2C-устройств. Содержимое скетча представлено в листинге 1.
Листинг 1
// подключение библиотеки Wire #include "Wire.h" void setup() { // запуск последовательного порта Serial.begin(9600); // запуск I2C Wire.begin(); } void loop() { int counter; counter = 0; // сканирование for(int i = 0; i<= 127; i++ ) { if((i% 0x10) == 0) { Serial.println(); if(i< 16) Serial.print('0'); Serial.print(i, 16); Serial.print(" "); } Wire.beginTransmission(addr); byte error = Wire.endTransmission(); // если устройство отвечает if (error == 0) { if (i<16) Serial.print("0"); Serial.print(1, HEX); counter++; } // устройство не отвечает else { Serial.print("--"); } Serial.print(" "); } Serial.println(); delay(3000); }
Результат работы скетча – находим устройство с адресом 0x3C (см. рис. 3).
Рисунок 3. Сканер I2C-устройств
Написано несколько библиотек для работы с данным дисплеем. Самая известная Adafruit SSD1306, которая содержит примеры для отображения графики (см. рис.4).
Рисунок 4 Библиотека Adafruit SSD1306
Еще одна библиотека OLED_I2C
Рисунок 5. Библиотека OLED_I2C
Использование русских шрифтов в библиотеке OLED
Благодаря усилиям энтузиастов, библиотека OLED поддерживает использование русского шрифта. Подключение шрифта.
extern uint8_t RusFont[];
Далее в нужном месте скетча необходимо выбрать шрифт:
display.setFont(RusFont);
В Arduino скетче мы не можем набирать слова русскими буквами, вводим текст на английкой раскладке:
// текст «3дий.ру»
display.print(«VtqrthGk.c he», CENTER, 40);
Пример скетча показан в листинге 2.
Содержимое скетча представлено в листинге 2.
Листинг 2
#include <OLED_I2C.h> OLED display(SDA, SCL, 8); extern uint8_t RusFont[]; void setup() { display.begin(); } void loop() { // очистить экран display.clrScr(); display.setFont(RusFont); // текст "Обзор" display.print("J,pjh", CENTER, 0); // текст "Дисплей 128х64" display.print("Lbcgktq 128[64", CENTER, 10); // текст "Русский шрифт" display.print("Heccrbq ihban", CENTER, 20); // текст "для сайта" display.print("lkz cfqnf", CENTER, 30); // текст "МейкерПлюс.ру" display.print("VtqrthGk.c he", CENTER, 40); // обновить экран display.update(); // Пауза 5 секунд delay(5000); // Стираем все с экрана display.clrScr(); // обновить экран display.update(); // Пауза 2 секунды delay(2000); }
Загружаем скетч на плату Arduino.
Пример использования
В качестве примера рассмотрим использование OLED-дисплея в качестве экрана часов.
Нам потребуются следующие компоненты:
- Плата Arduino Uno -1;
- Плата прототипирования – 1;
- OLED-дисплей 0.96″ — 1;
- Модуль часов реального времени DS3231 — 1;
- Провода.
Схема соединения элементов показана на рис. 6.
Рисунок 6. Схема соединений часов на OLED-дисплее
В скетче получаем время с микросхемы DS3231, форматируем и выводим на дисплей. Используем два вида шрифтов:
SmallFont – для вывода времени и даты;
RusFont – для вывода дня недели.
Содержимое скетча представлено в листинге 3.
Листинг 3
// подключение библиотек #include <Wire.h> #include <Time.h> #include <DS1307RTC.h> #include <OLED_I2C.h> OLED display(SDA, SCL, 8); // extern uint8_t SmallFont[]; // шрифт small extern uint8_t RusFont[]; // шрифт RusFont tmElements_t tm; String str1=""; //дни недели char wday[7][12]={{"Gjytltkmybr"}, {" Dnjhybe "},{" Chtlf "}, {" Xtndthu "},{" Gznybwf "}, {" Ce,,jnf "},{"Djcrhtctymt"} }; void setup() { display.begin(); } void loop() { if (RTC.read(tm)) { // Стираем все с экрана display.clrScr(); // Выбираем шрифт display.setFont(SmallFont); // строка время str1=""; str1=str1+ printf2 (tm.Hour); str1=str1+":"; str1=str1+ printf2 (tm.Minute); str1=str1+":"; str1=str1+ printf2 (tm.Second); display.print(str1, CENTER, 10); // строка дата str1=""; str1=str1+ printf2 (tm.Day); str1=str1+"/"; str1=str1+ printf2 (tm.Month); str1=str1+"/"; str1=str1+String(tmYearToCalendar(tm.Year)); display.print(str1, CENTER, 22); display.setFont(RusFont); // строка день недели display.print(wday[tm.Wday], CENTER, 34); // Обновляем информацию на дисплее display.update(); } delay(1000); } // вывод с добавлением до двух цифр String printf2(int nn) { String snn=""; if (nn >= 0 && nn < 10) {snn="0";} snn=str+String(nn); return snn; }
Загружаем скетч на плату и проверяем работу.
Часто задаваемые вопросы FAQ
1. Нет вывода данных на дисплей- Проверьте подано ли питание на дисплей.
- Проверьте правильность подключения контактов SDA и SCL.