Дисплеи Nextion: редактор, прошивка и работа с Arduino

Сенсорные дисплеи Nextion берут обработку графики на себя. Разбираем создание интерфейса в Nextion Editor и обмен данными с Arduino.
Чем Nextion отличается от обычных дисплеев
В проектах на Arduino применяют разные экраны: монохромные символьные на контроллере HD44780, графические от NOKIA 5110, OLED-модули, цветные TFT-матрицы. Общее правило таково: чем сложнее дисплей, тем больше ресурсов платы он отнимает. Дисплеи Nextion относятся к классу HMI (Human Machine Interface) и устроены иначе. У них собственный микроконтроллер, целиком занятый графикой, контроллер сенсорного экрана, память, разъём для SD-карты и интерфейс UART.

Улучшенные версии дополнительно оснащены часами реального времени и контактами GPIO. С Arduino дисплей связывается по последовательному порту. Обмен двусторонний и построен на унифицированных командах: дисплей сообщает о касаниях элементов экрана, а плата меняет атрибуты этих элементов. В линейке есть модели с диагональю от 2.4 до 7.0 дюйма и разрешением от 320x240 до 800x480.


Создание интерфейса в Nextion Editor
Интерфейс рисуют в программе Nextion Editor, которая выпускается только для Windows. В ней размещают элементы на экране и задают обработку событий нажатия и отпускания (Touch Press и Touch Release).

Новый проект создаётся через File → New. В окне Setting на вкладке Device выбирают линейку и модель дисплея, на вкладке Display задают ориентацию экрана и кодировку; для кириллицы подходит iso-8859-5. На вкладке project доступ к проекту можно закрыть паролем.
Рабочее окно редактора включает главное меню, панель выравнивания и порядка элементов, библиотеку элементов, область отображения, список страниц, библиотеки изображений и шрифтов, окно результатов компиляции, поле для кода события и зону редактирования атрибутов выбранного элемента.
Изначально в проекте одна страница page0, её имя можно изменить. Чтобы задать фон, изображение сначала добавляют в библиотеку кнопкой «+», затем у страницы выставляют атрибут sta в значение image и в поле pic выбирают картинку. Шрифты создаются встроенным генератором (Tools → Font Generator), сохраняются и подключаются через библиотеку шрифтов. Элементы интерфейса перетаскивают из библиотеки мышью и настраивают в окне атрибутов. Для события Touch Press или Touch Release галочкой включается отправка сообщения в UART, там же можно написать код, который выполнится при событии.
Загрузка прошивки в дисплей
Перед загрузкой проект компилируют командой Compile. Если ошибок нет, прошивку записывают одним из двух способов:
- через UART: дисплей подключают к компьютеру через USB-Serial адаптер, выбирают пункт Upload и нажимают Go; ход процесса виден и в программе, и на экране дисплея;
- с карты microSD: файл проекта копируют на карту, вставляют её в дисплей и подают питание, а после окончания прошивки карту извлекают.
Обмен данными с Arduino
Со стороны Arduino используются библиотека Nextion и программный последовательный порт SoftwareSerial на пинах 2 (Rx) и 3 (Tx), скорость обмена 9600 бод. Простейший скетч инициализирует дисплей, в цикле ждёт сообщение методом listen() и пересылает полученную строку в монитор порта.
При касании элемента приходит строка вида 65 0 2 1 ffff ffff ffff. Первый байт 65 означает событие касания, далее идут номер страницы, номер элемента на странице и тип события: 1 для Touch Press, 0 для Touch Release.
Для управления экраном в библиотеке есть набор методов:
- sendCommand() отправляет произвольную команду;
- setComponentText() задаёт текст компонента;
- getComponentText() считывает текст компонента;
- buttonOnOff() нажимает или отжимает кнопку;
- buttonToggle() переключает переключатель;
- updateProgressBar() изменяет индикатор выполнения.
В примере отправки команд скетч раз в две секунды меняет текст в компоненте t0, переключает шрифт кнопки командами b0.font=1 и b0.font=0 и сдвигает слайдер, присваивая случайное значение атрибуту h0.val.
Пример: домашняя метеостанция
В качестве практического проекта рассматривается метеостанция на Arduino Uno. К плате подключены дисплей Nextion, датчик освещённости BH1750, датчик давления BMP280 и датчик температуры и влажности DHT22, чей вывод DATA заведён на пин 10. Важная деталь: BMP280 питается от выхода 3.3 В, подача 5 В выводит его из строя.
Прошивка дисплея (проект meteo1, вертикальная ориентация) состоит из двух страниц. Страница logo показывает заставку при включении и выполняет код по событию Touch Release. На странице sensors размещены 4 элемента Picture с иконками и 8 элементов Text; для неё подготовлены два шрифта Arial размером 32 и 56 px. Показания выводятся в текстовые элементы t1, t2, t3 и t4 путём изменения атрибута txt.
Скетч подключает библиотеки SoftwareSerial, Nextion, BH1750FVI, Adafruit_Sensor, Adafruit_BMP280, Wire, SPI и DHT. Раз в 5 секунд он опрашивает датчики и вызовами вида myNextion.setComponentText(«t1», String(val1)) отправляет на экран температуру, влажность, освещённость и давление. Для контроля те же значения дублируются в монитор последовательного порта.
Типичные неполадки
- Нет связи между Arduino и дисплеем: в первую очередь проверяют правильность соединений.
- Изображение мигает: дисплею не хватает тока при питании от платы Arduino, помогает отдельный блок питания на 5 В.