Оглавление:
Видео: Другой подход с Nextion: 3 шага
2024 Автор: John Day | [email protected]. Последнее изменение: 2024-01-30 11:51
В моем первом проекте с 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 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 // темно-ЗЕЛЕНЫЙ
}
// *******************
Подтверждение
Я хочу поблагодарить Гидеона Россоува, потому что, читая его инструкции, я быстро достиг части своих целей. Спасибо, мистер. Гидеон Россоув
Рекомендуемые:
Поворотный энкодер - понимание и использование (Arduino / другой ΜКонтроллер): 3 шага
Поворотный энкодер - понимание и использование (Arduino / другой ΜКонтроллер): Поворотный энкодер - это электромеханическое устройство, которое преобразует вращательное движение в цифровую или аналоговую информацию. Он может вращаться по часовой стрелке или против часовой стрелки. Есть два типа угловых энкодеров: абсолютные и относительные (инкрементальные) энкодеры. Чт
Другой SLOMO-Frame: 3 шага
Другой SLOMO-Frame: в рамках проектов Numerika2Neets участвующие лаборатории создали кадры Slow motion, такие как https://www.instructables.com/id/IKEA-Frame-Hack-SLOMO-Slow-Motion-Frame/, для сравнения различных стратегий для делать вещи. Это было хорошо, потому что я всегда
Конвертируйте (почти) любой медиафайл в (только примерно) любой другой медиафайл бесплатно !: 4 шага
Конвертируйте (почти) любой медиафайл в (только примерно) любой другой медиафайл бесплатно !: Моя первая инструкция, ура! В любом случае, я искал в Google бесплатную программу, которая конвертировала бы мои файлы Youtube.flv в формат, который является более универсальным, например .wmv или.mov. Я поискал бесчисленное количество форумов и веб-сайтов, а затем нашел программу под названием
Освойте свой Micro: bit с помощью Arduino IDE - кнопка и другой GPIO: 3 шага (с изображениями)
Освойте свой Micro: bit с помощью Arduino IDE - кнопка и другие GPIO: В нашем предыдущем блоге Master Your Micro: bit с помощью Arduino IDE - - Light LED мы говорили о том, как установить библиотеку micro: bit в Arduino IDE и как для управления светодиодом на micro: bit с помощью Arduino IDE. В этой статье мы расскажем вам о ч
Подключите Ipod или другой MP3-плеер к обычным домашним динамикам без дорогого и громоздкого усилителя !: 4 шага
Подключите Ipod или другой MP3-плеер к обычным домашним динамикам без дорогого и громоздкого усилителя !: У вас есть множество дополнительных стереодинамиков, которые либо поставлялись с дешевыми стереосистемами, которые сломались, либо они у вас просто есть без видимой причины? В этой инструкции я покажу вам, как вы можете подключить их к любому Mp3-плееру или любому устройству со звуковым портом