Подключение графического LCD-дисплея Nokia 5110 к Arduino
Вспомните эпоху до iPhone, когда единственный раз, когда вы прикасались к крошечному чёрно-белому LCD-экрану телефона, — это чтобы протереть его. В те времена мобильные телефоны Nokia 3310 и 5110 использовали именно такие маленькие LCD-дисплеи.
С развитием технологий эти дисплеи нашли новое применение в мире DIY. Они быстро завоевали популярность среди любителей электроники благодаря малому размеру (около 1,5″), низкой стоимости, простоте использования, низкому энергопотреблению и возможности отображать как текст, так и растровые изображения.
Обзор оборудования
Драйвер LCD PCD8544
В основе модуля лежит мощный однокристальный маломощный CMOS-контроллер LCD-дисплея от Philips — PCD8544.
PCD8544 использует последовательную шину, подобную SPI, для связи с микроконтроллерами и предназначен для управления графическим дисплеем размером 84×48 пикселей.
Встроенное формирование напряжения питания и смещения LCD-контроллера PCD8544 снижает энергопотребление, что делает его подходящим для приложений, чувствительных к энергопотреблению. LCD обычно потребляет всего от 6 до 7 мА.
Согласно техническому описанию, эта микросхема работает в диапазоне от 2,7 до 3,3 В и имеет уровни связи 3 В. Поэтому для подключения к микроконтроллеру с логикой 5 В, такому как Arduino, требуется преобразование логических уровней.
Подсветка LCD
LCD имеет подсветку, доступную в четырёх различных цветах: красный, зелёный, синий и белый.
Подсветка состоит из четырёх светодиодов, расположенных по краям дисплея. Чтобы сменить подсветку LCD, снимите LCD с платы, отжав металлические зажимы на задней стороне. Вы заметите четыре светодиода, припаянных по краям дисплея. Просто замените светодиоды на желаемые по цвету.
Карта памяти LCD Nokia 5110
LCD-драйвер PCD8544 содержит 504 байта графической оперативной памяти данных дисплея (GDDRAM), которая хранит битовый шаблон для отображения на экране. Эта область памяти разделена на 6 банков (от 0 до 5). Каждый банк имеет 84 столбца/сегмента (от 0 до 83). И каждый столбец может хранить 8 бит данных (от 0 до 7). Это подтверждает, что у нас:
6 банков x 84 сегмента x 8 бит данных = 4032 бита = 504 байта
Вся память, включая банки, сегменты и данные, показана ниже.
Каждый бит представляет один пиксель на экране, который можно программно включить или выключить.
Технические характеристики
Вот технические характеристики:
Технология дисплея |
Точечно-матричный LCD |
|---|---|
Интерфейс MCU |
SPI |
Размер экрана |
1,5 дюйма |
Разрешение |
84×48 пикселей |
Рабочее напряжение |
2,7 В – 3,3 В |
Рабочий ток |
50 мА макс. |
Угол обзора |
180° |
Распиновка модуля LCD-дисплея Nokia 5110
Модуль LCD-дисплея Nokia 5110 имеет следующую распиновку:
RST используется для сброса дисплея. Это активный низкий вывод, что означает, что подтягивание его к LOW сбрасывает дисплей. Подключив этот вывод к выводу сброса Arduino, экран будет сбрасываться автоматически.
CE (Chip Enable) используется для выбора одного из нескольких подключённых модулей, использующих одну и ту же шину SPI. Это также активный низкий вывод.
D/C (Data/Command) используется библиотекой для разделения команд (таких как установка курсора в определённую позицию, очистка экрана и т.д.) от данных.
DIN — это последовательный вывод данных.
CLK — это последовательный вывод тактирования.
VCC — вывод питания для LCD, его следует подключить к 3,3 В.
BL (Backlight) управляет подсветкой дисплея. Подключив этот вывод к любому выводу Arduino с поддержкой PWM или используя потенциометр, можно управлять яркостью.
GND — это вывод заземления.
Схема подключения LCD-дисплея Nokia 5110 к Arduino
Давайте подключим LCD к Arduino.
Подключения просты. Выводы последовательного тактирования (CLK), последовательных данных (DIN), данные/команда (DC), выбор кристалла (CE) и сброс (RST) подключаются от вывода 7 до вывода 3 на Arduino.
К сожалению, максимальное входное напряжение LCD составляет 3,6 В, поэтому мы не можем подключить его напрямую к стандартному 5 В Arduino. Нам нужно преобразовать уровни.
Один из простейших способов преобразования уровней — добавить резисторы последовательно с выводами данных. Просто добавьте резисторы 10 кОм последовательно с выводами CLK, DIN, D/C и RST, а также резистор 1 кОм последовательно с выводом CE.
Наконец, вывод подсветки (BL) подключается к 3,3 В через токоограничительный резистор 330 Ом. Если вы хотите управлять яркостью, добавьте потенциометр или подключите этот вывод к любому выводу Arduino с поддержкой PWM.
В следующей таблице перечислены подключения выводов:
| Nokia 5110 LCD | Arduino | Notes | |
| VCC | 5V | – | |
| GND | GND | – | |
| RST | 3 | via 10KΩ | |
| CE | 4 | via 1KΩ | |
| D/C | 5 | via 10KΩ | |
| DIN | 6 | via 10KΩ | |
| CLK | 7 | via 10KΩ | |
| BL | 5V | via 330Ω |
На следующей схеме показано подключение.
Установка библиотеки
LCD-контроллер PCD8544 имеет гибкие, но сложные драйверы. Для использования контроллера PCD8544 требуется обширное знание адресации памяти. К счастью, библиотека Adafruit PCD8544 Nokia 5110 LCD была написана, чтобы скрыть сложности контроллера PCD8544, позволяя нам управлять дисплеем простыми командами.
Для установки библиотеки перейдите в Sketch > Include Library > Manage Libraries… Дождитесь, пока менеджер библиотек загрузит индекс и обновит список установленных библиотек.
Отфильтруйте поиск, набрав „nokia“. Должно появиться несколько записей. Найдите Adafruit PCD8544 Nokia 5110 LCD library. Нажмите на неё, затем выберите Install.
Эта библиотека является аппаратно-специфичной и обрабатывает низкоуровневые функции. Для отображения графических примитивов, таких как точки, линии, круги и прямоугольники, её необходимо дополнить библиотекой Adafruit GFX. Установите эту библиотеку тоже.
Внутри библиотека Adafruit PCD8544 использует библиотеку Adafruit Bus IO. Найдите Adafruit BusIO в менеджере библиотек и установите её тоже.
Пример кода Arduino 1 — отображение текста
Теперь самая интересная часть! Вот простой скетч, который выполнит следующее:
Отображение простого текста
Отображение инвертированного текста
Отображение чисел
Отображение чисел с указанием системы счисления (Hex, Dec)
Отображение символов ASCII
Поворот текста
Этот скетч даст вам полное представление о работе с LCD-дисплеем Nokia 5110 и может послужить основой для более практических экспериментов и проектов. Попробуйте скетч, а затем мы подробно его разберём.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int rotatetext = 1;
void setup() {
Serial.begin(9600);
//Initialize Display
display.begin();
// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);
// Clear the buffer.
display.clearDisplay();
// Display Text
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
// Display Inverted Text
display.setTextColor(WHITE, BLACK); // 'inverted' text
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
// Scaling Font Size
display.setTextColor(BLACK);
display.setCursor(0,0);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();
// Display Numbers
display.setTextSize(1);
display.setCursor(0,0);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();
// Specifying Base For Numbers
display.setCursor(0,0);
display.print("0x"); display.print(0xFF, HEX);
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)");
display.display();
delay(2000);
display.clearDisplay();
// Display ASCII Characters
display.setCursor(0,0);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
display.clearDisplay();
// Text Rotation
while(1)
{
display.clearDisplay();
display.setRotation(rotatetext); // rotate 90 degrees counter clockwise, can also use values of 2 and 3 to go further.
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Text Rotation");
display.display();
delay(1000);
display.clearDisplay();
rotatetext++;
}
}
void loop() {
}
Вот как выглядит результат.
Объяснение кода:
Скетч начинается с подключения трёх библиотек: SPI.h, Adafruit_GFX.h и Adafruit_PCD8544.h.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
Следующий шаг — создание объекта Adafruit_PCD8544.h. Конструктор Adafruit_PCD8544 принимает пять номеров выводов Arduino, подключённых к выводам CLK, DIN, D/C, CE и RST дисплея. Также определена переменная rotatetext, значение которой станет ясным через мгновение.
// Initialize LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
int rotatetext = 1;
В функции setup мы инициализируем объект LCD с помощью функции begin(). Мы также устанавливаем контрастность дисплея с помощью функции setContrast(value), где value может варьироваться от 0 до 100. Однако значение 50-60 даёт отличные результаты.
После этого мы очищаем буфер перед выводом первого сообщения на экран.
//Initialize Display
display.begin();
// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);
// Clear the buffer.
display.clearDisplay();
Отображение простого текста (Hello World)
// Display Text
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
Для отображения текста на экране сначала необходимо задать размер шрифта. Это делается вызовом setTextSize() с передачей неотрицательного числа (начиная с 1) в качестве параметра.
Затем мы устанавливаем цвет шрифта, вызывая функцию setTextColor(). Передайте BLACK для тёмного фона и WHITE для светлого.
Перед выводом сообщения нужно установить позицию курсора, вызвав функцию setCursor(X,Y). Пиксели на экране адресуются по горизонтальной (X) и вертикальной (Y) координатам. Начало координат (0,0) находится в верхнем левом углу, положительный X увеличивается вправо, а положительный Y — вниз.
Для вывода сообщения на экран можно использовать функции print(" ") или println(" "), аналогично выводу данных в монитор последовательного порта. Помните, что println() переместит курсор на следующую строку.
Последний шаг — использование команды display() для отправки содержимого экранного буфера во внутреннюю память контроллера PCD8544 и отображения содержимого на LCD.
Отображение инвертированного текста
// Display Inverted Text
display.setTextColor(WHITE, BLACK);
display.setCursor(0,0);
display.println("Hello world!");
display.display();
delay(2000);
display.clearDisplay();
Для отображения инвертированного текста используется функция setTextColor(FontColor, BackgroundColor). Если вы были внимательны, то заметили, что ранее мы передавали этой функции только один параметр, а теперь два. Это возможно благодаря перегрузке функций.
В данном случае использование setTextColor(BLACK, WHITE) приводит к чёрному тексту на заполненном фоне.
Масштабирование размера шрифта
// Scaling Font Size
display.setTextColor(BLACK);
display.setCursor(0,0);
display.setTextSize(2);
display.println("Hello!");
display.display();
delay(2000);
display.clearDisplay();
Ранее в этом руководстве мы использовали функцию setTextSize() для установки размера шрифта. Вы можете масштабировать шрифт, передав любое неотрицательное целое число в эту функцию.
Символы отображаются в соотношении 5:7. Другими словами, передача размера шрифта 1 отображает текст размером 5×7 пикселей на символ, передача размера шрифта 2 — 10×14 пикселей на символ, и так далее.
Отображение чисел
// Display Numbers
display.setTextSize(1);
display.setCursor(0,0);
display.println(123456789);
display.display();
delay(2000);
display.clearDisplay();
Функции print() или println() могут использоваться для отображения чисел на LCD. Поскольку перегруженная реализация этих функций принимает 32-битные беззнаковые целые значения, можно отображать числа в диапазоне от 0 до 4 294 967 295.
Указание системы счисления для чисел
// Specifying Base For Numbers
display.setCursor(0,0);
display.print("0x"); display.print(0xFF, HEX);
display.print("(HEX) = ");
display.print(0xFF, DEC);
display.println("(DEC)");
display.display();
delay(2000);
display.clearDisplay();
Функции print() и println() имеют необязательный второй параметр, указывающий систему счисления (формат); допустимые значения: BIN (двоичная, основание 2), OCT (восьмеричная, основание 8), DEC (десятичная, основание 10) и HEX (шестнадцатеричная, основание 16). Для чисел с плавающей запятой этот параметр указывает количество десятичных знаков. Например:
print(78, BIN) выводит «1001110»
print(78, OCT) выводит «116»
print(78, DEC) выводит «78»
print(78, HEX) выводит «4E»
println(1.23456, 0) выводит «1»
println(1.23456, 2) выводит «1.23»
println(1.23456, 4) выводит «1.2346»
Отображение символов ASCII
// Display ASCII Characters
display.setCursor(0,0);
display.setTextSize(2);
display.write(3);
display.display();
delay(2000);
display.clearDisplay();
Функции print() и println() отправляют данные на дисплей как читаемый человеком текст ASCII, тогда как функция write() отправляет двоичные данные на дисплей. Эту функцию можно использовать для отображения символов ASCII. Например, отправка 3 отображает символ сердца.
Поворот текста
// Text Rotation
while(1)
{
display.clearDisplay();
display.setRotation(rotatetext);
display.setTextSize(1);
display.setTextColor(BLACK);
display.setCursor(0,0);
display.println("Text Rotation");
display.display();
delay(1000);
display.clearDisplay();
rotatetext++;
}
Вы можете повернуть содержимое дисплея с помощью функции setRotation(). Она позволяет просматривать дисплей как в портретном, так и в альбомном режиме.
Эта функция принимает только один параметр, соответствующий четырём основным поворотам. Может быть любым неотрицательным целым числом, начиная с 0. При увеличении значения содержимое дисплея поворачивается на 90 градусов против часовой стрелки. Например:
0 — стандартная альбомная ориентация экрана.
1 — поворот экрана на 90 градусов вправо.
2 — экран перевёрнут вверх ногами.
3 — поворот экрана на 90 градусов влево.
Пример кода Arduino 2 — базовые фигуры
Вот простой скетч, демонстрирующий рисование базовых фигур: прямоугольников, кругов и треугольников. Попробуйте скетч, а затем мы подробно его разберём.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
void setup() {
Serial.begin(9600);
//Initialize Display
display.begin();
// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);
// Clear the buffer.
display.clearDisplay();
// Draw Rectangle
display.drawRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Rectangle
display.fillRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Round Rectangle
display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Round Rectangle
display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Circle
display.drawCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Circle
display.fillCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Triangle
display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Triangle
display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
}
void loop() {
}
Вот как выглядит результат.
Большая часть кода (настройка дисплея) совпадает с предыдущим примером, за исключением следующих фрагментов кода, рисующих базовые фигуры.
Рисование прямоугольника
// Draw Rectangle
display.drawRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Rectangle
display.fillRect(0, 0, 60, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
Функция drawRect() используется для рисования прямоугольника на экране. Она принимает пять параметров: координаты X и Y, ширину, высоту и цвет. Эта функция рисует пустой прямоугольник с рамкой толщиной 1 пиксель. Для рисования заполненного прямоугольника используется функция fillRect().
Рисование скруглённого прямоугольника
//Draw Round Rectangle
display.drawRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Round Rectangle
display.fillRoundRect(0, 0, 60, 40, 8, BLACK);
display.display();
delay(2000);
display.clearDisplay();
Функция drawRoundRect() используется для рисования скруглённого прямоугольника на экране. Она принимает те же параметры, что и drawRect(), за исключением одного дополнительного — радиуса скругления углов. Эта функция рисует пустой скруглённый прямоугольник с рамкой толщиной 1 пиксель. Для рисования заполненного скруглённого прямоугольника используется функция fillRoundRect().
Рисование круга
//Draw Circle
display.drawCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Circle
display.fillCircle(20, 20, 20, BLACK);
display.display();
delay(2000);
display.clearDisplay();
Функция drawCircle() используется для рисования круга на экране. Она принимает четыре параметра: координату X центра, координату Y центра, радиус и цвет. Эта функция рисует пустой круг с рамкой толщиной 1 пиксель. Для рисования заполненного круга используется функция fillCircle().
Рисование треугольника
//Draw Triangle
display.drawTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
//Draw Filled Triangle
display.fillTriangle(20, 0, 0, 40, 40, 40, BLACK);
display.display();
delay(2000);
display.clearDisplay();
Функция drawTriangle() используется для рисования треугольника на экране. Она принимает семь параметров: три пары координат X и Y (x0, y0, x1, y1, x2 и y2) вершин треугольника и цвет. (x0, y0) — верхняя вершина, (x1, y1) — левая вершина, (x2, y2) — правая вершина.
Эта функция рисует пустой треугольник с рамкой толщиной 1 пиксель. Для рисования заполненного треугольника используется функция fillTriangle().
Пример кода Arduino 3 — отображение растрового изображения
Наш последний пример показывает, как отображать растровые изображения на LCD-дисплее Nokia 5110. Это полезно для отображения логотипов, спрайтов, инфографики или иконок.
#include <SPI.h>
#include <Adafruit_GFX.h>
#include <Adafruit_PCD8544.h>
// Declare LCD object for software SPI
// Adafruit_PCD8544(CLK,DIN,D/C,CE,RST);
Adafruit_PCD8544 display = Adafruit_PCD8544(7, 6, 5, 4, 3);
// 'Marilyn Monroe 84x48', 84x48px
const unsigned char MarilynMonroe [] PROGMEM = {
0x00, 0x00, 0x00, 0x7f, 0x00, 0x02, 0xfe, 0xf8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xbe, 0x00,
0x00, 0x1f, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x3f, 0x80, 0x00, 0x00,
0x00, 0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x1f, 0xe1, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0,
0x00, 0x00, 0x0f, 0xf1, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0e, 0xd8, 0xe0,
0x00, 0x00, 0x00, 0x00, 0x00, 0x1f, 0x80, 0x00, 0x07, 0xe0, 0x70, 0x00, 0x00, 0x00, 0x00, 0x03,
0x3f, 0xe0, 0x00, 0x07, 0xf0, 0x78, 0x00, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x70, 0x00, 0x0f, 0xee,
0x7c, 0x00, 0x00, 0x00, 0x00, 0x03, 0xc0, 0x00, 0x00, 0x0f, 0xf7, 0x1c, 0x00, 0x00, 0x00, 0x00,
0x07, 0x80, 0x00, 0x0f, 0xc7, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x00, 0x07, 0xc0, 0x00, 0x0f, 0xf3,
0xdf, 0x7f, 0x80, 0x00, 0x00, 0x00, 0x07, 0xfe, 0x00, 0x08, 0x7d, 0xef, 0xff, 0xc0, 0x00, 0x00,
0x00, 0x7f, 0xff, 0x80, 0x30, 0x0f, 0xfc, 0xe0, 0xc0, 0x00, 0x00, 0x01, 0x9e, 0x73, 0xc0, 0xe0,
0x07, 0xf8, 0xc1, 0xc0, 0x00, 0x00, 0x03, 0xfc, 0x00, 0x01, 0xc0, 0x0f, 0xfd, 0xe1, 0x80, 0x00,
0x00, 0x03, 0xf8, 0x00, 0x01, 0x9c, 0x0f, 0xff, 0xc1, 0xc0, 0x00, 0x00, 0x02, 0xc0, 0x00, 0x01,
0x9f, 0xbf, 0xfe, 0x01, 0x40, 0x00, 0x00, 0x02, 0x60, 0x00, 0x03, 0x07, 0xef, 0xff, 0x01, 0x40,
0x00, 0x00, 0x00, 0x60, 0x00, 0x07, 0x01, 0xf7, 0xff, 0x80, 0xc0, 0x00, 0x00, 0x00, 0x50, 0x01,
0xdf, 0x00, 0x7f, 0xff, 0x1c, 0x80, 0x00, 0x00, 0x00, 0x40, 0x01, 0xff, 0x00, 0x1f, 0xff, 0x1e,
0xe0, 0x00, 0x00, 0x02, 0x08, 0x00, 0x3f, 0x80, 0x07, 0xef, 0x03, 0xe0, 0x00, 0x00, 0x06, 0x08,
0x00, 0x03, 0xc0, 0x07, 0xdf, 0x07, 0xc0, 0x00, 0x00, 0x06, 0x08, 0x0f, 0x81, 0x80, 0x1f, 0xdf,
0x1f, 0x80, 0x00, 0x00, 0x03, 0x08, 0x1f, 0x98, 0x00, 0x3f, 0xfe, 0x19, 0x80, 0x00, 0x00, 0x18,
0x08, 0x3f, 0xfe, 0x00, 0x7f, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x08, 0x08, 0x30, 0x3f, 0x00, 0xff,
0xff, 0x3f, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x76, 0x0f, 0x89, 0xff, 0xff, 0x9f, 0x00, 0x00, 0x00,
0x03, 0xe0, 0x7f, 0xc3, 0x81, 0xff, 0xfe, 0x9f, 0x80, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xf3, 0xc3,
0xff, 0xfe, 0x1f, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x7f, 0xfd, 0xc3, 0xff, 0xfe, 0x5e, 0x00, 0x00,
0x00, 0x03, 0xf0, 0x7f, 0xff, 0xc3, 0xff, 0xf3, 0x1e, 0x00, 0x00, 0x00, 0x03, 0xf0, 0x71, 0xff,
0x87, 0xff, 0xe3, 0xff, 0x00, 0x00, 0x00, 0x07, 0xf0, 0x7c, 0x3f, 0x87, 0xff, 0xe3, 0xfe, 0x00,
0x00, 0x00, 0x0f, 0xf0, 0x3c, 0xff, 0x05, 0xff, 0xf3, 0xfc, 0x00, 0x00, 0x00, 0x0f, 0xf0, 0x0f,
0xfe, 0x09, 0xff, 0xf7, 0xfc, 0x00, 0x00, 0x00, 0x08, 0xf8, 0x01, 0xfc, 0x19, 0xff, 0xff, 0xf8,
0x00, 0x00, 0x00, 0x0c, 0x78, 0x00, 0x00, 0x13, 0xff, 0xff, 0xf8, 0x00, 0x00, 0x00, 0x0e, 0x78,
0x00, 0x00, 0x23, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x0e, 0xf8, 0x00, 0x00, 0x47, 0xff, 0xff,
0xf0, 0x00, 0x00, 0x00, 0x0c, 0xfa, 0x00, 0x01, 0x8f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x08,
0x7b, 0x00, 0x03, 0x3f, 0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x0c, 0x3b, 0xf8, 0x0f, 0xff, 0xff,
0xff, 0xe0, 0x00, 0x00, 0x00, 0x0f, 0xbb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00,
0x07, 0xfb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x71, 0xff, 0xff, 0xff,
0xff, 0xff, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x41, 0xff, 0xff, 0xff, 0xff, 0xff, 0xe0, 0x00, 0x00
};
void setup() {
Serial.begin(9600);
//Initialize Display
display.begin();
// you can change the contrast around to adapt the display for the best viewing!
display.setContrast(57);
// Clear the buffer.
display.clearDisplay();
// Display bitmap
display.drawBitmap(0, 0, MarilynMonroe, 84, 48, BLACK);
display.display();
// Invert Display
//display.invertDisplay(1);
}
void loop() {
}
Вот как выглядит результат.
Объяснение кода:
Функция drawBitmap() используется для отображения растрового изображения на LCD. Она принимает шесть параметров: координату X верхнего левого угла, координату Y верхнего левого угла, массив байтов монохромного растрового изображения, ширину изображения в пикселях, высоту в пикселях и цвет.
Растровое изображение в нашем примере имеет размер 84×48. Поэтому координаты X и Y установлены в 0, а ширина и высота — 84 и 48.
// Display bitmap
display.drawBitmap(0, 0, MarilynMonroe, 84, 48, BLACK);
display.display();
Но прежде чем использовать функцию drawBitmap(), нам нужно изображение для отрисовки. Помните, что разрешение экрана дисплея составляет 84×48 пикселей, поэтому изображения больше этого размера не будут отображаться корректно. Чтобы получить изображение правильного размера, откройте вашу любимую программу для рисования, например Inkscape, Photoshop или MS Paint, и установите размер холста 84×48 пикселей.
Мы использовали фотографию Мэрилин Монро в качестве примера. Мы изменили её размер до 84×48 пикселей в MS Paint и сохранили как файл .bmp.
Получив растровое изображение, необходимо преобразовать его в массив, понятный контроллеру PCD8544. Это можно сделать двумя способами: с помощью image2cpp (онлайн) или LCD Assistant (офлайн).
Онлайн-генератор массива растровых изображений — image2cpp
Существует онлайн-инструмент image2cpp, который может преобразовать ваше изображение в массив. Этот инструмент позволяет:
Преобразовывать несколько изображений одновременно.
Масштабировать файл изображения — растянуть/масштабировать по размеру/оригинальный
Настраивать порог яркости между чёрным и белым.
Центрировать изображение вертикально и/или горизонтально.
Инвертировать цвета изображения
Для начала откройте image2cpp в браузере и выберите изображение для отображения на экране.
Размеры вашего изображения будут отображены в параметре Canvas size в разделе Image Settings. Если изображение больше 84×48, измените его на 84×48, выбрав соответствующую опцию масштабирования. Результат можно увидеть в разделе Preview.
При необходимости вы можете изменить цвет фона или инвертировать цвета изображения.
Наконец, измените самую важную настройку — порог яркости. Когда вы устанавливаете порог, пиксели выше этого уровня будут белыми, а ниже — чёрными. В нашем случае мы установили 171 для получения хорошей детализации.
Предварительный просмотр отражает любые изменения ваших настроек. Вы можете вносить изменения, наблюдая за результатом.
Когда вы довольны результатом, можно приступить к генерации массива данных. Просто выберите Arduino code в качестве формата вывода и нажмите кнопку Generate code.
К сведению, есть настройка «Draw Mode». Она генерирует изображения на основе паттерна сканирования дисплея. Если изображение выглядит искажённым на экране, попробуйте изменить режим.
Вот и всё. Массив байтов вашего растрового изображения будет создан. Вы можете использовать результат напрямую с нашим примером кода. Просто дайте ему правильное имя. Затем в функции drawBitmap() используйте ваш массив.
Офлайн-генератор массива растровых изображений — LCD Assistant
Также существует Windows-приложение LCD assistant, которое может преобразовать растровое изображение в массив данных. Оно не такое мощное, как image2cpp, но всё ещё широко используется любителями.
Для начала преобразуйте изображение в монохромное растровое изображение 84×48 с глубиной 1 бит. Это можно сделать в любимой программе для рисования, например Inkscape, Photoshop или MS Paint, как мы сделали в MS Paint.
Откройте MS Paint и измените размер файла до 84×48 пикселей.
Теперь сохраните файл как растровое изображение. При сохранении выберите Monochrome Bitmap (.bmp;.dib). Это создаст 1-битное/бинарное растровое изображение с двумя возможными значениями для каждого пикселя: 0 (чёрный) или 1 (белый).
Единственный недостаток этого подхода — невозможность установить уровень порога яркости. Он по умолчанию установлен на 50% и не может быть изменён.
Теперь скачайте программу LCD Assistant. Откройте исполняемый файл и выберите растровое изображение в меню File.
Просто перейдите в меню File и выберите опцию Save output. Сохраните файл как текстовый документ.
К сведению, есть настройка Byte Orientation. Она генерирует изображения на основе паттерна сканирования дисплея. Если изображение выглядит искажённым на экране, попробуйте изменить режим.
Вот и всё. После создания массива скопируйте и вставьте его в ваш код. Просто дайте ему правильное имя. Затем в функции drawBitmap() используйте ваш массив.