В некоторых проектах на микроконтроллерах использование крошечных дисплеев может быть оптимальным решением для отображения необходимой информации. Например, информации полученной от какого-либо внешнего датчика.
Сегодня мы рассмотрим как можно использовать популярный и компактный монохромный графический OLED-дисплей I2C 128×32 совместно с Arduino.
Это модуль OLED-дисплея 128×32 с диагональю 0,91 дюйма со встроенным контроллером SSD1306 осуществляет обмен данными через шину I2C. Поскольку контроллер SSD1306 предназначен для OLED-дисплея 128×64, а наш дисплей имеет всего 128×32 пикселей, то здесь используется только часть буфера SSD1306.
OLED модуль имеет удобный формфактор для использования совместно с макетной платой (4 контакта на задней стороне модуля). Будьте осторожны, дисплей очень тонкий и хрупкий, поэтому при установке на макетную плату нажимайте только на область контактов и ни в коем случае не нажимайте на на сам дисплей!
SSD1306 — это однокристальный CMOS драйвер OLED / PLED с графическим контроллером для светодиодной матрицы 128×64. Контроллер предназначен для OLED-дисплеев с общим катодом.
Данный OLED-дисплей, как и многие другие модули, хорошо работает с большинством микроконтроллеров с напряжением питания 3,3 В и 5 В. Поскольку связь осуществляется через интерфейс I2C, то для соединения дисплея с микроконтроллером необходимы только два провода — SCL и SDA. По умолчанию I2C адрес для этого OLED-дисплея — 0x3C. Вы можете посмотреть более подробную информацию о I2C в datasheet SSD1306 (стр. 20).
И так перейдем к делу. Чтобы данный OLED-дисплей заработал с Arduino, необходимо подключить несколько библиотек. Библиотека Wire предназначенная для работы с I2C — по умолчанию присутствует в Arduino IDE. Библиотеки SSD1306 и «GFX» нам придется установить самостоятельно.
Ниже показаны выводы для соединения Arduino и OLED-дисплея:
Вот пример кода для теста:
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); void setup() { Serial.begin(9600); if (!display.begin(SSD1306_SWITCHCAPVCC,0x3C)) { Serial.println(F("SSD1306 Allocation Failed")); for (;;); } display.clearDisplay(); display.setTextSize(1); display.setTextColor(WHITE); display.setCursor(0, 0); display.println("Hello 128×32 OLED"); display.println("Hello Arduino Uno"); display.println("Quick Test Example"); display.println("Thank You!"); display.display(); } void loop() { }
Этот небольшой код просто печатает произвольный текст в 4 разных строках на OLED-дисплее.
Однако, чтобы увидеть демонстрацию его полной графической мощи, вы можете попробовать примеры идущие вместе с библиотекой Adafruit SSD1306 Arduino.
Теперь загрузите следующий скетч, не меняя настройки. Что вы видите? Это похоже на изображение, показанное после скетча?
#include <Wire.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define SCREEN_WIDTH 128 #define SCREEN_HEIGHT 32 Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire); void setup(void) { display.begin(SSD1306_SWITCHCAPVCC, 0x3C); } void loop() { display.clearDisplay (); display.setCursor (10, 5); display.setTextSize (2); display.setTextColor (WHITE); display.print ("Hello"); display.setCursor (10, 23); display.setTextSize (1); display.print ("Friends…"); delay (1000); display.drawCircle (110, 15, 15, WHITE); // Head frame display.drawCircle (105, 14, 4, WHITE); // Left eye display.drawCircle (115, 14, 4, WHITE); // Right eye display.drawPixel (103, 22, WHITE); // Mouth display.drawPixel (118, 22, WHITE); // Mouth display.drawPixel (104, 23, WHITE); // Mouth display.drawPixel (117, 23, WHITE); // Mouth display.drawPixel (105, 24, WHITE); // Mouth display.drawPixel (116, 24, WHITE); // Mouth display.drawLine (106, 25, 115, 25, WHITE); // Mouth display.display (); delay (1000); }
Как это возможно? Отличный вопрос! Видите ли, все дело в том, что OLED дисплей состоит из пикселей, представляют собой крошечные квадраты, которые можно включить или выключить.
Таким образом, адресовав каждый отдельный пиксель, можно создавать и отображать простые графические элементы, такие как не закрашенные и закрашенные круги, сегменты круга, эллипсы, линии, прямоугольники и треугольники.
Вам нужно помнить, что координатная плоскость состоит из оси X и оси Y. Горизонтальная ось (левая и правая) — это ось X, а вертикальная ось (вверх и вниз) — ось Y. И, когда мы хотим отобразить точку в координатной сетке, мы задаем ей значение X и значение Y.
Чтобы проиллюстрировать это, внимательно посмотрите на рисунок ниже. Здесь правый глаз смайлика имеет значение X=8 и значение Y=2, поэтому математически мы могли бы записать координаты этой точки как (8, 2).
Возвращаясь к нашему скетчу, который мы привели выше, команда:
display.drawPixel (103, 22, WHITE);
указывает Arduino включить пиксель, расположенный в координате (103, 22), то есть 103 пикселя в направлении X и 22 пикселя в направлении Y.
Аналогичным образом команда:
display.drawCircle (105, 14, 4, WHITE);
указывает Arduino нарисовать круг с координатами центра (105, 14) и радиусом 4.
OLED-дисплей 128×32 с шиной I2C очень легко установить и запустить, поскольку он имеет встроенный регулятор напряжения.
Однако у вас нет простого варианта изменить его адрес установленный по умолчанию (хотя не некоторых моделях с помощью одного или нескольких SMD резисторов это можно сделать).