Съдържание:

Различен подход с Nextion: 3 стъпки
Различен подход с Nextion: 3 стъпки

Видео: Различен подход с Nextion: 3 стъпки

Видео: Различен подход с Nextion: 3 стъпки
Видео: Автоматика для коптилки 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 Display

SRSerial.print (InpReg); // предава 16 събрани бита на Nextion Display

SRSerial.write (термин); // 255

SRSerial.write (термин); // 255

SRSerial.write (термин); // 255

}

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

Стъпка 2:.. Но преди…

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

Разбира се, кодът започва с всички декларации и setup ().

Входовете са INPUT_PULLUP, така че входните превключватели са нормално отворени и когато са затворени, те прилагат GND към съответния вход.

(Това е първият ми Instructable и съжалявам да ви покажа моя код по този лош начин. Моля, изтеглете файла ArduinoCode. PDF, че е много ясен.

Нека поговорим повече за това

Разработил съм собствен начин да „кажа“на дисплея на Nextion какво трябва да прави. Обикновено MCU (Arduino в моя случай) изпраща съобщение за всеки отделен вариант, който да се прилага към атрибута на всеки отделен обект. Този метод губи много време за извършване на неща, които не винаги са толкова спешни за непрекъснато зареждане на последователната линия. Намерих за по -удобно Arduino да събира в 16 -битови регистри информацията за атрибутите, за да варира в Nextion. Приблизително на всеки 500 mS моят Arduino изпраща до Nextion едно съобщение, съдържащо 16 бита, съдържащи се във всеки регистър в даден момент. Очевидно в Nextion имаме нужда от кода, който обработва това, което трябва да се изпълни. Това разпределение на задачата (и кода) позволява да се получат много други предимства. Например, помислете как да накарате мигането да светне! С моя подход е лесно: задайте малко в регистъра на Arduino и го изпратете до Nextion. Двойните регистри на Nextion могат да се актуализират от Arduino много рядко, тъй като честотата на мигане е независима от комуникацията; честотата на мигане зависи от обект на таймер в Nextion и може да работи с минимална времева база близо до 50 mS. Така че с моя метод можем да премигнем светлина в Nextion на относително висока честота (да предположим 2 Hz), дори ако моят Arduino изпраща съобщения на всеки 10 секунди, само за краен пример. Това може да предложи обратния проблем: как да постъпим, ако комуникацията се провали? Това не е обект на тази дискусия, но вече реших този проблем с един вид куче за наблюдение: един в кода на Arduino, друг в кода на Nextion.

Мигането се регулира от кода на Nextion, където всяка светлина следва неговите правилни правила: ВКЛ./ИЗКЛ. Или ЗЕЛЕН/ЧЕРВЕН, или също промяна на написаното вътре (или друго). Бих могъл да разкажа някои други неща за моя проект, но предпочитам да изчакам вашите въпроси, преди да добавя твърде много думи, които не са толкова лесни за мен да превеждам добре, както бих направил.

Стъпка 3: Редактиране на Nextion обекти

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

Ето част от кода, който написах с Nextion Editor върху обекта tm0.

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

Аз съм начинаещ и затова е по -добре да изтеглите страницата Nextion code. PDF, вместо да прочетете объркания код тук долу. (Съжалявам, това е първият ми инструктаж)

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

// Проект POW1225. HMI 15 май 2019 г.

// vACC (va0) акумулатор

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

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

tm0.tim = 50 // tm0 База от време 50 mS

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

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

if (vACC.val! = 0) // Тествайте RDY

{

tRDY.pco = СИН // ЧЕРВЕН

} else

{

tRDY.pco = СИВ // тъмно СИВ

}

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

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // Тествайте PWR

{

tPWR.pco = ЗЕЛЕН // светъл ЗЕЛЕН

tPON.txt = "ON" // ON

tPON.pco = ЗЕЛЕН // светъл ЗЕЛЕН

} else

{

tPWR.pco = СИВ // тъмно СИВ 33808

tPON.txt = "OFF" // OFF

tPON.pco = СИВ // тъмно СИВ 33808

}

// СУХ ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // Тествайте DRY

{

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

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

} else

{

tDRV.pco = СИВ // тъмно СИВ 33808

tDRY.pco = СИВ // тъмно СИВ 33808

}

// БЕГА ***************

vACC.val = vINP.val & 0x0018

if (vACC.val! = 0) // Тестване RUN

{

tRUN.bco = ЧЕРВЕН // MARCIA ЧЕРВЕН (включен)

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

tDIR.bco = ЧЕРВЕНО // ЧЕРВЕНО ЧЕРВЕНО

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

} else

{

tRUN.bco = 32768 // MARCIA GREY (изключено)

tRUN.pco = СИВ // на СИВ

tDIR.bco = 32768 // DIR тъмно ЗЕЛЕН 1024

tDIR.pco = СИВ // МЪРКО СИВ

tDIR.txt = "---" // СТОП

}

// НАЛЯВО **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Тестване RUN Вдясно

{

tDIR.txt = "<<<" // DIR НАЛЯВО

}

// ПРАВО *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Тестване RUN Вляво

{

tDIR.txt = ">>>" // DIR ДЯСНО

}

// И ДВЕТЕ **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Тествайте RUN и двете

{

tDIR.txt = ">>! <<" // DIR И ДВЕ

}

// ТЕСТ **************

vACC.val = vINP.val & 0x0020

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

{

tTEST.pco = БЯЛ // БЯЛ

tsw tTEST, 1 // Активиране на събития с докосване

} else

{

tTEST.pco = СИВ // тъмно СИВ 33808

tsw tTEST, 0 // Деактивиране на събития с докосване

}

// FAULT *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Проверете FAULT

{

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 = ЧЕРВЕН // EME присъства

}

}

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

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // Тествайте FERMO

{

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

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

} else

{

tFER.pco = СИВ // СИВ

tFER.bco = 672 // тъмно ЗЕЛЕНО

}

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

Признание

Искам да изкажа своите признания на Гидиън Росув, защото четейки неговите инструкции, бързо постигнах част от целите си. Благодаря ви г -н. Гидеон Росув

Препоръчано: