Оглавление:

Другой подход с Nextion: 3 шага
Другой подход с Nextion: 3 шага

Видео: Другой подход с Nextion: 3 шага

Видео: Другой подход с Nextion: 3 шага
Видео: Урок 3. Кнопка Dual state Nextion Включаем выключаем подсветку. 2024, Июль
Anonim
Другой подход с Nextion
Другой подход с Nextion

В моем первом проекте с Arduino Nano, подключенным к сенсорному дисплею Nextion, я написал длинную серию команд, которые будут передаваться Nextion через последовательный порт, и это неизбежно, если нам нужно отправлять полностью независимые команды в случайные моменты.

Я также должен признать, что потратил больше времени на «борьбу» с библиотеками, чем на что-либо другое. Так что постепенно я стал работать без тяжелых библиотек ITEAD.

Вскоре я понял, что мне не нужно срочно сообщать Nextion об изменениях атрибутов визуальных объектов, но я предпочитаю подождать, пока я их соберу, и отправить их в Nextion целиком, когда у меня будет полная группа.

Я постараюсь лучше объяснить.

Когда в моем проекте, состоящем из 16 текстовых указателей, я хочу включить или выключить некоторые из них, я делаю это, используя атрибут 'bco', который для включения переходит (например) из темно-серого в белый (если в черный прямоугольник), и наоборот, чтобы выключить.

В моем приложении я обнаружил, что бесполезно отправлять 16 команд на последовательный порт в 16 различных моментов, по одной для каждого «bco» из 16 сигналов.

Вместо этого я предпочитаю, чтобы Arduino собирал, какие сигналы должны быть «включены» (HIGH), а какие должны быть «выключены» (LOW) в 16-битном регистре, где каждый бит соответствует одной из 16 сигналов Nextion.

После обновления каждого бита регистра я передаю его значение в Nextion, одно сообщение, которое содержит общую информацию о 16 элементах.

Таким образом, связь от Arduino и Nextion значительно сокращается, потому что в одном сообщении, передаваемом по последовательному каналу в Nextion, собирается информация, которая в противном случае потребовала бы передачи 16 сообщений.

Правда, не всегда обязательно обновлять все отчеты, но я уверен, что иначе было бы потрачено больше времени.

Естественно, каждый бит, содержащийся в целом числе, полученном Arduino, дисплей Nextion должен будет связать его с желаемым атрибутом.

Это значит, что код нужно писать на дисплее Nextion, но не пугайтесь: если у меня получилось…

Тогда есть двойное преимущество: Arduino будет иметь более легкий код и будет меньше участвовать в последовательной связи с Nextion.

Nextion после получения данных в одном сообщении будет использовать их гораздо быстрее, чем если бы он ждал 16 сообщений. Таким образом, включение или выключение 16 сигналов будет почти одновременным по отношению к наиболее обычному режиму, в котором время для неизвестного количества сообщений проходит между выполнением команды для первой сигнализации и команды для последней сигнализации.

На дисплее Nextion я создал эту систему классическим способом, то есть, каждый раз поворачивая регистр «маски», вы можете исследовать каждый из 16 битов. Когда проверяемый бит имеет высокий уровень, сигнал, связанный с этим битом, загорается на дисплее и выключается, когда бит имеет низкий уровень.

«Негативным» аспектом этой системы является то, что код, написанный на дисплее Nextion, менее удобен для документирования, чем код Arduino. Кроме того, код Nextion рискует быть разбросанным по различным объектам. Необходимо сразу же задокументировать то, что вы делаете.

Я использую Notepad ++ для написания кода, который затем копирую в объект Nextion, который почти всегда находится в tm0 страницы 0.

Синтаксис языка Nextion имеет множество ограничений, но ему удается их преодолеть или обойти их с минимальными усилиями и попытаться увидеть проблемы с точек зрения, которые также необычны.

В качестве примера я сообщаю, как Arduino записывает регистр для передачи, записанный мной самым элементарным способом.

Шаг 1. Как передается регистр

В файле ArduinoCode. PDF я показываю весь свой скетч. (Читая код здесь, это не так ясно)

Здесь я хочу только показать, каким образом Arduino отправляет 16-битный регистр в Nextion без помощи библиотек, но с соблюдением синтаксиса, описанного ITEAD.

//***************************************************************************************

void NexUpd ()

//***************************************************************************************

{

SRSerial.print ("vINP.val =");

SRSerial.print (InpReg); // передаем 16 собранных бит на дисплей Nextion

SRSerial.print (InpReg); // передаем 16 собранных бит на дисплей Nextion

SRSerial.write (окончание); // 255

SRSerial.write (окончание); // 255

SRSerial.write (окончание); // 255

}

//***************************************************************************************

Шаг 2:.. Но перед…

.. Но прежде …
.. Но прежде …

Конечно, код начинается со всех объявлений и setup ().

Входы - INPUT_PULLUP, поэтому входные переключатели обычно разомкнуты, а когда замкнуты, они применяют GND к соответствующему входу.

(Это моя первая инструкция, и мне очень жаль, что я показываю вам свой код в такой плохой форме. Загрузите файл ArduinoCode. PDF, он очень понятен.

Позвольте мне поговорить об этом подробнее

Я разработал свой собственный способ «сказать» дисплею Nextion, что он должен делать. Обычно микроконтроллер (в моем случае Arduino) отправляет сообщение для каждого отдельного варианта, применяемого к атрибуту любого отдельного объекта. Этот метод тратит много времени на то, что не всегда так срочно, чтобы постоянно загружать последовательную линию. Мне показалось более удобным, что Arduino собирает в 16-битные регистры информацию об атрибутах, которые нужно изменять на Nextion. Примерно каждые 500 мс мой Arduino отправляет Nextion одно сообщение, содержащее 16 битов, содержащихся в каждом регистре за раз. Очевидно, что в Nextion нам нужен код, который обрабатывает то, что должно быть выполнено. Такое распределение задачи (и кода) позволяет получить много других преимуществ. Например, подумайте, как заставить мигать свет! С моим подходом это просто: установить немного в регистр Arduino и отправить его в Nextion. Регистры-близнецы Nextion могут обновляться из Arduino очень редко, потому что частота мигания не зависит от связи; частота мигания зависит от объекта Timer в Nextion и может работать с минимальной временной разверткой, близкой к 50 мс. Таким образом, с помощью моего метода мы можем мигать светом в Nextion с относительно высокой частотой (предположим, 2 Гц), даже если мой Arduino отправляет сообщения каждые 10 секунд, просто для крайнего примера. Это может означать противоположную проблему: что делать, если Связь не работает? Это не является предметом нашего обсуждения, но я уже решил эту проблему с помощью своего рода Watch Dog: один в коде Arduino, другой в коде Nextion.

Мигание регулируется кодом Nextion, где каждый свет следует своим правилам: ВКЛ / ВЫКЛ или ЗЕЛЕНЫЙ / КРАСНЫЙ или также изменение написанного внутри (или другое). Я мог бы рассказать еще кое-что о своем проекте, но я предпочитаю подождать с вашими вопросами, прежде чем добавлять слишком много слов, которые мне не так легко перевести, как я бы.

Шаг 3: Редактирование объектов Nextion

Редактирование объектов Nextion
Редактирование объектов Nextion

Вот часть кода, который я написал с помощью Nextion Editor для объекта tm0.

Не ускользает от нашего внимания, что с 16 битами, полученными от Arduino, дисплей Nextion не просто включает и выключает сигналы. На данный момент я опускаю пояснения, чтобы не усложнять понимание.

Я новичок, поэтому лучше скачать страницу Nextion code. PDF вместо того, чтобы читать запутанный код здесь. (Прошу прощения, это моя первая инструкция)

При желании вы можете загрузить полный код "HMI" для этого моего приложения. Имя файла этого кода - POW1225. HMI. Он может столкнуться с вашим дисплеем Nextion NX4024T032, но чтобы понять это, вам нужно плавать во многих объектах и смотреть код внутри небольшого окна редактора. Так что, думаю, будет проще смотреть основной код, записанный в файле Nextion code. PDF.

// Project POW1225. HMI 15 мая 2019 г.

// vACC (va0) Накопитель

// vINP (va1) Входной регистр xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Старт

tm0.tim = 50 // tm0 Развертка 50 мс

// RDY ***************

vACC.val = vINP.val & 0x0001 // Маска

if (vACC.val! = 0) // Тестирование RDY

{

tRDY.pco = СИНИЙ // КРАСНЫЙ

}еще

{

tRDY.pco = СЕРЫЙ // темно-СЕРЫЙ

}

// PWR ***************

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // Тестируем PWR

{

tPWR.pco = ЗЕЛЕНЫЙ // светло-ЗЕЛЕНЫЙ

tPON.txt = "ВКЛ" // ВКЛ

tPON.pco = ЗЕЛЕНЫЙ // светло-ЗЕЛЕНЫЙ

}еще

{

tPWR.pco = СЕРЫЙ // темно-СЕРЫЙ 33808

tPON.txt = "ВЫКЛ" // ВЫКЛ

tPON.pco = СЕРЫЙ // темно-СЕРЫЙ 33808

}

// СУХОЙ ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // Проверить СУХОЙ

{

tDRV.pco = СИНИЙ // СИНИЙ

tDRY.pco = СИНИЙ // СИНИЙ

}еще

{

tDRV.pco = СЕРЫЙ // темно-СЕРЫЙ 33808

tDRY.pco = СЕРЫЙ // темно-СЕРЫЙ 33808

}

// ЗАПУСТИТЬ ***************

vACC.val = vINP.val & 0x0018

if (vACC.val! = 0) // Тестовый ЗАПУСК

{

tRUN.bco = КРАСНЫЙ // КРАСНЫЙ МАРСИЯ (вкл.)

tRUN.pco = ЧЕРНЫЙ // на ЧЕРНОМ

tDIR.bco = RED // DIR RED

tDIR.pco = ЧЕРНЫЙ // на ЧЕРНОМ

}еще

{

tRUN.bco = 32768 // МАРСИЯ ГРЕЙ (выкл.)

tRUN.pco = СЕРЫЙ // на СЕРЫЙ

tDIR.bco = 32768 // DIR темно-зеленый 1024

tDIR.pco = СЕРЫЙ // ПРЯМО СЕРЫЙ

tDIR.txt = "---" // ОСТАНОВИТЬ

}

// ЛЕВЫЙ **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Тест ЗАПУСК вправо

{

tDIR.txt = "<<<" // НАПРАВЛЕНИЕ ВЛЕВО

}

// ПРАВИЛЬНО *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Тест ЗАПУСК влево

{

tDIR.txt = ">>>" // НАПРАВО

}

// ОБА **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Тестируем запускаем оба

{

tDIR.txt = ">>! <<" // ОБА НАПРАВЛЕНИЯ

}

// ТЕСТОВОЕ ЗАДАНИЕ **************

vACC.val = vINP.val & 0x0020

if (vACC.val! = 0) // Тест ТЕСТ

{

tTEST.pco = БЕЛЫЙ // БЕЛЫЙ

tsw tTEST, 1 // Включить события касания

}еще

{

tTEST.pco = СЕРЫЙ // темно-СЕРЫЙ 33808

tsw tTEST, 0 // Отключить события касания

}

// ВИНА *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // НЕИСПРАВНОСТЬ теста

{

tFLT.pco = СЕРЫЙ // НЕИСПРАВНОСТЬ отсутствует

}

если (vACC.val! = 0)

{

tFLT.pco = ЖЕЛТЫЙ // НЕИСПРАВНОСТЬ присутствует

}

// EME ***************

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // Тестируем EME

{

tEME.pco = СЕРЫЙ // EME отсутствует

}

если (vACC.val! = 0)

{

tEME.pco = RED // EME присутствует

}

}

// ФЕРМО *************

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // Проверить FERMO

{

tFER.pco = ЧЕРНЫЙ // ЧЕРНЫЙ

tFER.bco = ЗЕЛЕНЫЙ // ЗЕЛЕНЫЙ

}еще

{

tFER.pco = СЕРЫЙ // СЕРЫЙ

tFER.bco = 672 // темно-ЗЕЛЕНЫЙ

}

// *******************

Подтверждение

Я хочу поблагодарить Гидеона Россоува, потому что, читая его инструкции, я быстро достиг части своих целей. Спасибо, мистер. Гидеон Россоув

Рекомендуемые: