Kazalo:

Drugačen pristop z Nextion: 3 koraki
Drugačen pristop z Nextion: 3 koraki

Video: Drugačen pristop z Nextion: 3 koraki

Video: Drugačen pristop z Nextion: 3 koraki
Video: Как управлять приводом с помощью Arduino - Robojax 2024, November
Anonim
Drugačen pristop z Nextion
Drugačen pristop z Nextion

V svojem prvem projektu z Arduino Nano, povezanim z zaslonom na dotik Nextion, sem napisal dolgo vrsto ukazov, ki jih je treba sporočiti Nextionu prek serijskih vrat, kar je neizogibno, če moramo v naključnih trenutkih poslati popolnoma neodvisne ukaze.

Moram tudi priznati, da sem več časa preživel v 'boju' s knjižnicami kot karkoli drugega. Tako sem postopoma začel delati popolnoma brez težkih knjižnic ITEAD.

Kmalu sem spoznal, da nimam nujnosti, da Nextionu sporočim spremembe atributov vizualnih predmetov, ampak raje počakam, da jih zberem, in jih pošljem v Nextion kot celoto, ko bom dobil celotno skupino.

Poskušal se bom bolje razložiti.

Ko želim v svojem projektu, sestavljenem iz 16 besedilnih oznak, nekatere vklopiti ali izklopiti, to storim tako, da izkoristim atribut 'bco', ki za vklop preide (na primer) iz temno sive v belo (če je v črni pravokotnik) in obratno za izklop.

V moji aplikaciji se mi je zdelo neuporabno pošiljati 16 ukazov na serijska vrata v 16 različnih trenutkih, po enega za vsak 'bco' od 16 signalov.

Raje namesto tega Arduino zbira, kateri signali morajo biti 'vklopljeni' (HIGH) in kateri morajo biti 'off' (LOW) v 16-bitnem registru, kjer vsak bit ustreza enemu od 16 signalov Nextion.

Po posodobitvi vsakega bita registra prenesem njegovo vrednost v Nextion, eno samo sporočilo, ki vsebuje zbirne podatke o 16 elementih.

Na ta način se komunikacija iz Arduina in Nextiona znatno zmanjša, ker se v tem enotnem sporočilu, ki se po serijski pošilja na Nextion, zbirajo informacije, ki bi sicer zahtevale prenos 16 sporočil.

Res je, da ni vedno treba posodobiti vseh poročil, vendar sem prepričan, da bi s tem drugače izgubili več časa.

Seveda bo moral vsak bit, ki ga vsebuje celo število, ki ga je prejel Arduino, zaslon Nextion povezati z želenim atributom.

To pomeni, da mora biti koda napisana na zaslonu Nextion, vendar se ne ustrašite: če mi uspe …

Potem je dvojna prednost: Arduino bo imel lažjo kodo in se bo manj ukvarjal s serijsko komunikacijo z Nextionom.

Nextion jih bo po prejemu podatkov v enem sporočilu porabil veliko hitreje, kot če bi čakal na 16 sporočil. Vklop ali izklop 16 signalov bo torej skoraj sočasen glede na najbolj običajen način, v katerem čas za neznano število sporočil preteče med izvajanjem ukaza za prvo signalizacijo in ukazom za zadnjo signalizacijo.

Na zaslonu Nextion sem ta sistem ustvaril na klasičen način, to pomeni, da vsakič, ko obrnete register 'mask', lahko pregledate vsakega od 16 bitov. Ko je preučeni bit VISOK, signal, povezan s tem bitom, zasveti na zaslonu in se izklopi, ko je bit NIZKA.

"Negativni" vidik tega sistema je, da je koda, napisana na zaslonu Nextion, manj priročna za dokumentiranje kot koda Arduino. Poleg tega obstaja nevarnost, da bo koda Nextion razpršena po različnih predmetih. Paziti morate, da takoj dokumentirate, kaj počnete.

Notepad ++ uporabljam za pisanje kode, ki jo nato kopiram v objekt Nextion, ki je skoraj izključno v tm0 strani 0.

Sintaksa jezika Nextion ima številne omejitve, vendar jih uspe premagati ali jih obiti z minimalnim naporom in poskušati na težave gledati tudi z nenavadnega vidika.

Kot primer navajam način, na katerega Arduino zapiše register, ki ga je treba poslati, ki sem ga napisal na najbolj elementaren način.

1. korak: Kako se register prenaša

V datoteki ArduinoCode. PDF prikažem vso svojo skico. (Branje kode tukaj ni tako jasno)

Tukaj spodaj želim samo pokazati, na kakšen način Arduino pošlje 16 -bitni register v Nextion, brez pomoči knjižnic, vendar le ob upoštevanju skladnje, ki jo opisuje ITEAD.

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

void NexUpd ()

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

{

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

SRSerial.print (InpReg); // pošlje 16 zbranih bitov na Nextion Display

SRSerial.print (InpReg); // pošlje 16 zbranih bitov na Nextion Display

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

}

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

2. korak:.. Toda prej…

.. Toda prej…
.. Toda prej…

Seveda se koda začne z vsemi deklaracijami in nastavitvijo ().

Vhodi so INPUT_PULLUP, zato so vhodna stikala običajno odprta in ko so zaprta, uporabijo GND na ustrezni vhod.

(To je moj prvi Instructable in žal mi je, da vam na tako slab način pokažem svojo kodo. Prenesite datoteko ArduinoCode. PDF, da je zelo jasna.

Naj povem več o tem

Razvil sem svoj način, da na zaslonu Nextion 'povem', kaj mora narediti. Običajno MCU (v mojem primeru Arduino) pošlje sporočilo za vsako posamezno različico, ki velja za atribut katerega koli posameznega objekta. Ta metoda izgubi veliko časa za stvari, ki niso vedno tako nujne za neprekinjeno nalaganje serijske linije. Ugotovil sem, da je bolj priročno, da Arduino v 16 -bitne registre zbira podatke o atributih, ki se razlikujejo glede na Nextion. Približno vsakih 500 mS moj Arduino pošlje Nextionu eno sporočilo, ki vsebuje 16 bitov v vsakem registru hkrati. Očitno v Nextionu potrebujemo kodo, ki obravnava, kaj je treba izvesti. Ta porazdelitev naloge (in kode) omogoča številne druge prednosti. Na primer, pomislite, kako utripati luč! Z mojim pristopom je enostavno: nastavite malo v register Arduino in ga pošljite v Nextion. Registre dvojčkov Nextion je bilo mogoče zelo redko posodobiti iz Arduina, ker je frekvenca utripanja neodvisna od komunikacije; frekvenca utripanja je odvisna od predmeta Timer v Nextion in lahko deluje z najmanjšo časovno osnovo blizu 50 mS. Tako lahko z mojo metodo utripamo luč v Nextionu pri relativno visoki frekvenci (recimo 2 Hz), tudi če moj Arduino pošilja sporočila vsakih 10 sekund, samo za skrajni primer. To lahko nakazuje nasprotno težavo: kako ravnati, če komunikacija ne uspe? To ni predmet te razprave, vendar sem to težavo že rešil z nekakšnim Watch Dogom: eden znotraj kode Arduino, drugi v kodo Nextion.

Utripanje ureja koda Nextion, kjer vsaka lučka sledi njegovim pravilom: VKLOP/IZKLOP ali ZELENA/RDEČA ali pa tudi spreminjanje napisanega v notranjosti (ali kaj drugega). O svojem projektu bi lahko povedal še nekaj drugih stvari, vendar raje počakam na vaša vprašanja, preden dodam preveč besed, ki jih ni tako enostavno prevesti, kot bi jih.

3. korak: Urejanje objektov Nextion

Urejanje objektov Nextion
Urejanje objektov Nextion

Tukaj je del kode, ki sem jo napisal z urejevalnikom Nextion na objektu tm0.

Ne uhaja nam v oči, da pri 16 bitih, prejetih od Arduina, zaslon Nextion ne vklopi in izklopi samo signalov. Zaenkrat razlage izpustim, da ne otežim razumevanja.

Sem začetnik in zato je bolje, da namesto tega preberete zmedeno kodo, prenesite stran Nextion code. PDF. (Žal mi je to prvi pouk)

Če želite, lahko prenesete celotno kodo "HMI" za to mojo aplikacijo. Ime datoteke te kode je POW1225. HMI. Lahko se zažene v zaslon Nextion NX4024T032, vendar, da ga razumete, morate plavati v številne predmete in pogledati kodo v majhnem oknu urejevalnika. Zato menim, da bo tako lažje videti glavno kodo, zapisano v datoteki Nextion code. PDF

// Projekt POW1225. HMI 15. maj 2019

// VACC (va0) Akumulator

// vINP (va1) Vhodni register xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Začni

tm0.tim = 50 // tm0 Časovna osnova 50 mS

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

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

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

{

tRDY.pco = MODRA // RDEČA

} drugo

{

tRDY.pco = SIVA // temno SIVA

}

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

vACC.val = vINP.val & 0x0002

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

{

tPWR.pco = ZELENO // svetlo ZELENO

tPON.txt = "ON" // ON

tPON.pco = ZELENO // svetlo ZELENO

} drugo

{

tPWR.pco = SIVA // temno SIVA 33808

tPON.txt = "OFF" // OFF

tPON.pco = SIVA // temno SIVA 33808

}

// SUHO ***************

vACC.val = vINP.val & 0x0004

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

{

tDRV.pco = MODRA // MODRA

tDRY.pco = MODRA // MODRA

} drugo

{

tDRV.pco = SIVA // temno SIVA 33808

tDRY.pco = SIVA // temno SIVA 33808

}

// RUN ***************

vACC.val = vINP.val & 0x0018

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

{

tRUN.bco = RDEČA // MARCIA RDEČA (vklopljena)

tRUN.pco = ČRNO // na ČRNO

tDIR.bco = RDEČA // DIR RDEČA

tDIR.pco = ČRNO // na ČRNO

} drugo

{

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

tRUN.pco = SIVA // na SIVI

tDIR.bco = 32768 // DIR temno ZELENA 1024

tDIR.pco = SIVA // DIR SIVA

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

}

// LEVO **************

vACC.val = vINP.val & 0x0008

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

{

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

}

// PRAV *************

vACC.val = vINP.val & 0x0010

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

{

tDIR.txt = ">>>" // DIR DESNO

}

// OBOJE **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Preizkusite RUN oboje

{

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

}

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

vACC.val = vINP.val & 0x0020

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

{

tTEST.pco = BELO // BELO

tsw tTEST, 1 // Omogoči dogodke na dotik

} drugo

{

tTEST.pco = SIVA // temno SIVA 33808

tsw tTEST, 0 // Onemogoči dogodke na dotik

}

// NAPAKA *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Preverite napako

{

tFLT.pco = SIVA // NAPAKA odsotna

}

če (vACC.val! = 0)

{

tFLT.pco = RUMENA // NAPAKA prisotna

}

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

vACC.val = vINP.val & 0x0080

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

{

tEME.pco = SIVA // EME odsoten

}

če (vACC.val! = 0)

{

tEME.pco = RDEČA // EME prisotna

}

}

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

vACC.val = vINP.val & 0x0100

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

{

tFER.pco = ČRNA // ČRNA

tFER.bco = ZELENO // ZELENO

} drugo

{

tFER.pco = SIVA // SIVA

tFER.bco = 672 // temno ZELENA

}

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

Priznanje

Gideonu Rossouwvu se želim zahvaliti, ker sem ob branju njegovih navodil hitro dosegel del svojih ciljev. Hvala g. Gideon Rossouwv

Priporočena: