Подключение графического LCD-дисплея Nokia 5110 к Arduino

Подключение графического 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-дисплея Nokia 5110 к Arduino

Каждый бит представляет один пиксель на экране, который можно программно включить или выключить.

Технические характеристики

Вот технические характеристики:

Технология дисплея

Точечно-матричный LCD

Интерфейс MCU

SPI

Размер экрана

1,5 дюйма

Разрешение

84×48 пикселей

Рабочее напряжение

2,7 В – 3,3 В

Рабочий ток

50 мА макс.

Угол обзора

180°

Распиновка модуля LCD-дисплея Nokia 5110

Модуль LCD-дисплея Nokia 5110 имеет следующую распиновку:

Подключение графического LCD-дисплея Nokia 5110 к Arduino

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 LCDArduinoNotes
VCC5V
GNDGND
RST3via 10KΩ
CE4via 1KΩ
D/C5via 10KΩ
DIN6via 10KΩ
CLK7via 10KΩ
BL5Vvia 330Ω

На следующей схеме показано подключение.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Установка библиотеки

LCD-контроллер PCD8544 имеет гибкие, но сложные драйверы. Для использования контроллера PCD8544 требуется обширное знание адресации памяти. К счастью, библиотека Adafruit PCD8544 Nokia 5110 LCD была написана, чтобы скрыть сложности контроллера PCD8544, позволяя нам управлять дисплеем простыми командами.

Для установки библиотеки перейдите в Sketch > Include Library > Manage Libraries… Дождитесь, пока менеджер библиотек загрузит индекс и обновит список установленных библиотек.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Отфильтруйте поиск, набрав „nokia“. Должно появиться несколько записей. Найдите Adafruit PCD8544 Nokia 5110 LCD library. Нажмите на неё, затем выберите Install.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Эта библиотека является аппаратно-специфичной и обрабатывает низкоуровневые функции. Для отображения графических примитивов, таких как точки, линии, круги и прямоугольники, её необходимо дополнить библиотекой Adafruit GFX. Установите эту библиотеку тоже.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Внутри библиотека Adafruit PCD8544 использует библиотеку Adafruit Bus IO. Найдите Adafruit BusIO в менеджере библиотек и установите её тоже.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Пример кода 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() {
}

Вот как выглядит результат.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Объяснение кода:

Скетч начинается с подключения трёх библиотек: 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)

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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.

Отображение инвертированного текста

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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) приводит к чёрному тексту на заполненном фоне.

Масштабирование размера шрифта

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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 пикселей на символ, и так далее.

Отображение чисел

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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.

Указание системы счисления для чисел

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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 отображает символ сердца.

Поворот текста

Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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() {
}

Вот как выглядит результат.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Большая часть кода (настройка дисплея) совпадает с предыдущим примером, за исключением следующих фрагментов кода, рисующих базовые фигуры.

Рисование прямоугольника

Подключение графического LCD-дисплея Nokia 5110 к Arduino Подключение графического LCD-дисплея Nokia 5110 к Arduino
// 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().

Рисование скруглённого прямоугольника

Подключение графического LCD-дисплея Nokia 5110 к Arduino Подключение графического LCD-дисплея Nokia 5110 к Arduino
//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().

Рисование круга

Подключение графического LCD-дисплея Nokia 5110 к Arduino Подключение графического LCD-дисплея Nokia 5110 к Arduino
//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().

Рисование треугольника

Подключение графического LCD-дисплея Nokia 5110 к Arduino Подключение графического LCD-дисплея Nokia 5110 к Arduino
//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() {
}

Вот как выглядит результат.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Объяснение кода:

Функция 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.

Подключение графического LCD-дисплея Nokia 5110 к Arduino Подключение графического LCD-дисплея Nokia 5110 к Arduino

Получив растровое изображение, необходимо преобразовать его в массив, понятный контроллеру PCD8544. Это можно сделать двумя способами: с помощью image2cpp (онлайн) или LCD Assistant (офлайн).

Онлайн-генератор массива растровых изображений — image2cpp

Существует онлайн-инструмент image2cpp, который может преобразовать ваше изображение в массив. Этот инструмент позволяет:

  • Преобразовывать несколько изображений одновременно.

  • Масштабировать файл изображения — растянуть/масштабировать по размеру/оригинальный

  • Настраивать порог яркости между чёрным и белым.

  • Центрировать изображение вертикально и/или горизонтально.

  • Инвертировать цвета изображения

Для начала откройте image2cpp в браузере и выберите изображение для отображения на экране.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Размеры вашего изображения будут отображены в параметре Canvas size в разделе Image Settings. Если изображение больше 84×48, измените его на 84×48, выбрав соответствующую опцию масштабирования. Результат можно увидеть в разделе Preview.

При необходимости вы можете изменить цвет фона или инвертировать цвета изображения.

Наконец, измените самую важную настройку — порог яркости. Когда вы устанавливаете порог, пиксели выше этого уровня будут белыми, а ниже — чёрными. В нашем случае мы установили 171 для получения хорошей детализации.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Предварительный просмотр отражает любые изменения ваших настроек. Вы можете вносить изменения, наблюдая за результатом.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Когда вы довольны результатом, можно приступить к генерации массива данных. Просто выберите Arduino code в качестве формата вывода и нажмите кнопку Generate code.

К сведению, есть настройка «Draw Mode». Она генерирует изображения на основе паттерна сканирования дисплея. Если изображение выглядит искажённым на экране, попробуйте изменить режим.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Вот и всё. Массив байтов вашего растрового изображения будет создан. Вы можете использовать результат напрямую с нашим примером кода. Просто дайте ему правильное имя. Затем в функции drawBitmap() используйте ваш массив.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Офлайн-генератор массива растровых изображений — LCD Assistant

Также существует Windows-приложение LCD assistant, которое может преобразовать растровое изображение в массив данных. Оно не такое мощное, как image2cpp, но всё ещё широко используется любителями.

Для начала преобразуйте изображение в монохромное растровое изображение 84×48 с глубиной 1 бит. Это можно сделать в любимой программе для рисования, например Inkscape, Photoshop или MS Paint, как мы сделали в MS Paint.

Откройте MS Paint и измените размер файла до 84×48 пикселей.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Теперь сохраните файл как растровое изображение. При сохранении выберите Monochrome Bitmap (.bmp;.dib). Это создаст 1-битное/бинарное растровое изображение с двумя возможными значениями для каждого пикселя: 0 (чёрный) или 1 (белый).

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Единственный недостаток этого подхода — невозможность установить уровень порога яркости. Он по умолчанию установлен на 50% и не может быть изменён.

Теперь скачайте программу LCD Assistant. Откройте исполняемый файл и выберите растровое изображение в меню File.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Просто перейдите в меню File и выберите опцию Save output. Сохраните файл как текстовый документ.

К сведению, есть настройка Byte Orientation. Она генерирует изображения на основе паттерна сканирования дисплея. Если изображение выглядит искажённым на экране, попробуйте изменить режим.

Подключение графического LCD-дисплея Nokia 5110 к Arduino

Вот и всё. После создания массива скопируйте и вставьте его в ваш код. Просто дайте ему правильное имя. Затем в функции drawBitmap() используйте ваш массив.