Obsah:

Jiný přístup s nexcí: 3 kroky
Jiný přístup s nexcí: 3 kroky

Video: Jiný přístup s nexcí: 3 kroky

Video: Jiný přístup s nexcí: 3 kroky
Video: První pocity... - 3. Sezóna | Diablo IV #DiabloIV 2024, Červenec
Anonim
Jiný přístup s nexcí
Jiný přístup s nexcí

V mém prvním projektu s Arduino Nano připojeným k dotykovému displeji Nextion jsem napsal dlouhou řadu příkazů, které mají být sděleny Nextion přes sériový port, a to je nevyhnutelné, pokud potřebujeme v náhodných okamžicích posílat zcela nezávislé příkazy.

Musím také přiznat, že jsem „bojem“s knihovnami strávil více času než cokoli jiného. Postupně jsem tedy začal pracovat zcela bez těžkých knihoven ITEAD.

Brzy jsem si uvědomil, že nemám naléhavost sdělovat Nextionu změny atributů vizuálních objektů, ale raději počkám, až je shromáždím a pošlu Nextionu jako celku, až dostanu kompletní skupinu.

Pokusím se lépe vysvětlit.

Když v mém projektu složeném ze 16 textových označení chci některé z nich zapnout nebo vypnout, využiji toho atributu „bco“, který při zapnutí přechází (například) z tmavě šedé do bílé (pokud je černý obdélník) a naopak k vypnutí.

V mé aplikaci mi přišlo zbytečné posílat 16 příkazů na sériový port v 16 různých okamžicích, jeden pro každé 'bco' ze 16 signálů.

Dávám přednost tomu, aby Arduino shromažďovalo, které signály musí být 'zapnuto' (HIGH) a které musí být 'vypnuto' (LOW) v 16bitovém registru, kde každý bit odpovídá jedné ze 16 signalizací Nextion.

Po aktualizaci každého bitu registru předám jeho hodnotu Nextionu, jediné zprávě, která obsahuje souhrnné informace týkající se 16 prvků.

Tímto způsobem je komunikace z Arduina a Nextion značně omezena, protože v této jediné zprávě přenášené na sériovou linku do Nextion jsou shromažďovány informace, které by jinak vyžadovaly přenos 16 zpráv.

Je pravda, že není vždy nutné aktualizovat všechny zprávy, ale jsem si jist, že jinak by to ztrácelo více času.

Přirozeně každý bit obsažený v celém čísle přijatém Arduinem, displej Nextion ho bude muset přiřadit k požadovanému atributu.

To znamená, že kód musí být napsán na displeji Nextion, ale není třeba se ho děsit: pokud se mi to podaří…

Pak je tu dvojí výhoda: Arduino bude mít lehčí kód a bude se méně zabývat sériovou komunikací s Nextion.

Nextion po obdržení dat v jedné zprávě je použije mnohem rychleji, než kdyby čekalo na 16 zpráv. Zapnutí nebo vypnutí 16 signálů bude tedy téměř souběžné s ohledem na nejběžnější režim, ve kterém mezi vykonáním příkazu pro první signalizaci a příkazem pro poslední signalizaci uplyne čas pro neznámý počet zpráv.

Na displeji Nextion jsem vytvořil tento systém klasickým způsobem, to znamená, že pokaždé otáčení registru „masky“vám umožní prozkoumat každý ze 16 bitů. Když je zkoumaný bit HIGH, signál spojený s tímto bitem se rozsvítí na displeji a vypne se, když je bit LOW.

'Negativním' aspektem tohoto systému je, že kód zapsaný na displeji Nextion je méně vhodné pro dokumentaci než kód Arduino. Kromě toho hrozí, že bude kód Nextion rozptýlen po různých objektech. Je třeba dbát na to, abyste hned zdokumentovali, co děláte.

Pomocí programu Poznámkový blok ++ napíšu kód, který poté zkopíruji do objektu Nextion, který je téměř výhradně v tm0 na stránce 0.

Syntaxe jazyka Nextion má mnoho omezení, ale dokáže je překonat nebo je obejít s minimálním úsilím a pokusit se vidět problémy z neobvyklých úhlů pohledu.

Jako příklad uvádím způsob, jakým Arduino zapisuje registr, který má být vyslán, zapsaný mnou nejjednodušším možným způsobem.

Krok 1: Jak se registr přenáší

V souboru ArduinoCode. PDF ukazuji celý svůj náčrt. (Číst kód zde dole není tak jasné)

Zde dolů chci pouze ukázat, jakým způsobem Arduino posílá 16bitový registr do Nextion, bez pomoci knihoven, ale respektuje syntaxi popsanou ITEAD.

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

neplatné NexUpd ()

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

{

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

SRSerial.print (InpReg); // přenos 16 nasbíraných bitů na displej Nextion

SRSerial.print (InpReg); // přenos 16 nasbíraných bitů na displej Nextion

SRSerial.write (konec); // 255

SRSerial.write (konec); // 255

SRSerial.write (konec); // 255

}

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

Krok 2:.. Ale před …

.. Ale předtím …
.. Ale předtím …

Kód samozřejmě začíná všemi deklaracemi a nastavením ().

Vstupy jsou INPUT_PULLUP, takže vstupní spínače jsou normálně otevřené a když jsou zavřené, aplikují GND na odpovídající vstup.

(Toto je můj první Instructable a je mi líto, že vám mohu ukázat svůj kód tímto špatným způsobem. Stáhněte si prosím soubor ArduinoCode. PDF, že je to velmi jasné.

Dovolte mi, abych o tom mluvil více

Vyvinul jsem svůj vlastní způsob, jak „říci“displeji Nextion, co musí dělat. Obvykle MCU (v mém případě Arduino) posílá zprávu pro každou variaci, která se má vztahovat na atribut jakéhokoli jednotlivého objektu. Tato metoda ztrácí mnoho času na věci, které nejsou vždy tak naléhavé, aby bylo možné nepřetržitě načítat sériovou linku. Zjistil jsem pohodlnější, že Arduino shromažďuje do 16 bitových registrů informace o atributech, které se mají na Nextion lišit. Asi každých 500 ms moje Arduino posílá Nextionu jednu zprávu obsahující 16 bitů obsažených v každém registru najednou. Zjevně v Nextion potřebujeme kód, který zvládne to, co musí být provedeno. Tato distribuce úkolu (a kódu) umožňuje získat mnoho dalších výhod. Například přemýšlejte, jak přimět mrknutí světla! S mým přístupem je to snadné: vložte trochu do registru Arduino a odešlete jej do Nextion. Dvojité registry Nextion lze z Arduina aktualizovat velmi zřídka, protože frekvence blikání je nezávislá na komunikaci; frekvence blikání závisí na objektu Timer v Nextion a může běžet s minimální časovou základnou téměř 50 mS. Takže s mojí metodou můžeme v Nextionu blikat světlem na relativně vysoké frekvenci (předpokládejme 2 Hz), i když můj Arduino odesílá zprávy každých 10 sekund, jen pro extrémní příklad. To může naznačovat opačný problém: jak postupovat, pokud komunikace selže? Toto není předmětem této diskuse, ale tento problém jsem již vyřešil jakýmsi Watch Dogem: jedním uvnitř Arduino Code, druhým do Nextion kódu.

Blikání je regulováno kódem Nextion, kde každé světlo dodržuje jeho správná pravidla: ZAPNUTO/VYPNUTO nebo ZELENÉ/ČERVENÉ nebo také změna psaného textu (nebo jiného). Mohl bych o svém projektu říci několik dalších věcí, ale raději si počkám na vaše otázky, než přidám příliš mnoho slov, která se mi tak snadno nepřeloží, jako já.

Krok 3: Úpravy objektů Nextion

Úpravy objektů Nextion
Úpravy objektů Nextion

Zde je část kódu, který jsem napsal pomocí Nextion Editoru na objekt tm0.

Neunikne našemu upozornění, že díky 16 bitům přijatým od Arduina displej Nextion signály nejen zapíná a vypíná. Prozatím vynechávám vysvětlení, abych nekomplikoval porozumění.

Jsem začátečník, a proto je lepší si místo toho stáhnout stránku Nextion code. PDF a přečíst si zde zmatený kód. (Omlouvám se, toto je můj první pokyn)

Pokud si přejete, můžete si stáhnout kompletní kód „HMI“pro tuto moji aplikaci. Název tohoto kódu je POW1225. HMI. Může běžet na váš displej Nextion NX4024T032, ale abyste to pochopili, musíte vplout do mnoha objektů a podívat se na kód uvnitř malého okna editoru. Takže si myslím, že bude snazší podívat se na hlavní kód, zapsaný v souboru Nextion code. PDF

// Projekt POW1225. HMI 15. května 2019

// Akumulátor vACC (va0)

// vINP (va1) Vstupní registr xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Start

tm0.tim = 50 // tm0 Časová základna 50 mS

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

vACC.val = vINP.val & 0x0001 // Maska

if (vACC.val! = 0) // Test RDY

{

tRDY.pco = MODRÁ // ČERVENÁ

}jiný

{

tRDY.pco = ŠEDÁ // tmavě ŠEDÁ

}

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

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // Test PWR

{

tPWR.pco = ZELENÁ // světle ZELENÁ

tPON.txt = "ON" // ON

tPON.pco = ZELENÁ // světle ZELENÁ

}jiný

{

tPWR.pco = ŠEDÁ // tmavě ŠEDÁ 33808

tPON.txt = "OFF" // OFF

tPON.pco = ŠEDÁ // tmavě ŠEDÁ 33808

}

// SUCHÝ ****************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // Test DRY

{

tDRV.pco = MODRÁ // MODRÁ

tDRY.pco = MODRÁ // MODRÁ

}jiný

{

tDRV.pco = ŠEDÁ // tmavě ŠEDÁ 33808

tDRY.pco = ŠEDÁ // tmavě ŠEDÁ 33808

}

// BĚH ****************

vACC.val = vINP.val & 0x0018

if (vACC.val! = 0) // Test RUN

{

tRUN.bco = ČERVENÁ // MARCIA ČERVENÁ (zapnuto)

tRUN.pco = ČERNÁ // na ČERNÉ

tDIR.bco = ČERVENÁ // DIR ČERVENÁ

tDIR.pco = ČERNÁ // na ČERNÉ

}jiný

{

tRUN.bco = 32768 // MARCIA GREY (vypnuto)

tRUN.pco = ŠEDÝ // na ŠEDÉ

tDIR.bco = 32768 // DIR dark GREEN 1024

tDIR.pco = ŠEDÁ // ŠEDÁ ŠEDÁ

tDIR.txt = "---" // STOP

}

// VLEVO, ODJET **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Test RUN vpravo

{

tDIR.txt = "<<<" // DIR LEFT

}

// ŽE JO *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Test RUN vlevo

{

tDIR.txt = ">>>" // SPRÁVNĚ PRÁVO

}

// OBA **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Test RUN oba

{

tDIR.txt = ">>! <<" // DIR OBA

}

// TEST **************

vACC.val = vINP.val & 0x0020

if (vACC.val! = 0) // Test TEST

{

tTEST.pco = BÍLÁ // BÍLÁ

tsw tTEST, 1 // Povolení dotykových událostí

}jiný

{

tTEST.pco = ŠEDÁ // tmavě ŠEDÁ 33808

tsw tTEST, 0 // Zakáže dotykové události

}

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

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Test FAULT

{

tFLT.pco = ŠEDÝ // CHYBA chybí

}

if (vACC.val! = 0)

{

tFLT.pco = ŽLUTÁ // PORUCHA přítomna

}

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

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // Test EME

{

tEME.pco = ŠEDÝ // EME chybí

}

if (vACC.val! = 0)

{

tEME.pco = ČERVENÁ // EME přítomen

}

}

// FERMO *************

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // Test FERMO

{

tFER.pco = ČERNÁ // ČERNÁ

tFER.bco = ZELENÁ // ZELENÁ

}jiný

{

tFER.pco = ŠEDÁ // ŠEDÁ

tFER.bco = 672 // tmavě ZELENÁ

}

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

Potvrzení

Chtěl bych poděkovat Gideonovi Rossouwvovi, protože díky čtení jeho instrukcí jsem rychle získal část svých cílů. Děkuji pane Gideon Rossouwv

Doporučuje: