Satura rādītājs:

Atšķirīga pieeja ar Nextion: 3 soļi
Atšķirīga pieeja ar Nextion: 3 soļi

Video: Atšķirīga pieeja ar Nextion: 3 soļi

Video: Atšķirīga pieeja ar Nextion: 3 soļi
Video: How to control Actuator using Arduino - Robojax 2024, Novembris
Anonim
Citāda pieeja ar Nextion
Citāda pieeja ar Nextion

Savā pirmajā projektā ar Arduino Nano, kas savienots ar Nextion skārienekrānu, es biju uzrakstījis garu komandu sēriju, kas jāpaziņo Nextion, izmantojot seriālo portu, un tas ir neizbēgami, ja mums ir jānosūta pilnīgi neatkarīgas komandas nejaušos brīžos.

Man arī jāatzīst, ka es vairāk laika pavadīju cīņā ar bibliotēkām. Tā es pamazām sāku strādāt pilnīgi bez smagām ITEAD bibliotēkām.

Drīz es sapratu, ka man nav nekādas steigas paziņot Nextion par vizuālo objektu atribūtu izmaiņām, bet es labprātāk gaidu, kamēr tās apkopošu un nosūtīšu uz Nextion kopumā, kad ieguvu pilnu grupu.

Es centīšos labāk izskaidrot sevi.

Ja savā projektā, kas sastāv no 16 teksta norādēm, es vēlos dažas no tām ieslēgt vai izslēgt, es to daru, izmantojot atribūtu “bco”, kas ieslēgšanai pāriet (piemēram) no tumši pelēkas uz baltu (ja melns taisnstūris), un otrādi, lai izslēgtu.

Savā lietojumprogrammā es uzskatīju, ka ir bezjēdzīgi nosūtīt 16 komandas uz seriālo portu 16 dažādos brīžos, pa vienam katram 16 signālu “bco”.

Tā vietā es dodu priekšroku tam, lai Arduino savāktu signālus, kuriem jābūt ieslēgtiem (HIGH) un kuriem jābūt izslēgtiem (LOW) 16 bitu reģistrā, kur katrs bits atbilst vienam no 16 Nextion signāliem.

Pēc katra reģistra bita atjaunināšanas es nosūtu tā vērtību Nextion - vienam ziņojumam, kurā ir apkopota informācija par 16 elementiem.

Tādā veidā tiek ievērojami samazināta saziņa no Arduino un Nextion, jo vienā ziņojumā, kas tiek pārraidīts sērijā uz Nextion, tiek apkopota informācija, kas citādi būtu prasījusi 16 ziņojumu pārsūtīšanu.

Tiesa, ne vienmēr ir jāatjaunina visi pārskati, taču esmu pārliecināts, ka citādi būtu jātērē vairāk laika.

Protams, katrs bits, kas atrodas Arduino saņemtajā veselā skaitlī, Nextion displejam tas būs jāsaista ar vēlamo atribūtu.

Tas nozīmē, ka kods ir jāraksta Nextion displejā, taču tas nav jābaidās: ja man tas izdodas…

Tad ir dubultā priekšrocība: Arduino būs vieglāks kods un mazāk iesaistīsies sērijas sakaros ar Nextion.

Nextion pēc datu saņemšanas vienā ziņojumā tos izmantos daudz ātrāk nekā tad, ja gaidītu 16 ziņojumus. Tādējādi 16 signālu ieslēgšana vai izslēgšana būs gandrīz vienlaicīga attiecībā uz visparastāko režīmu, kurā laiks starp nezināmu ziņojumu skaitu paiet no pirmās signāla komandas izpildes līdz pēdējās signalizācijas komandai.

Nextion displejā es izveidoju šo sistēmu klasiskā veidā, tas ir, katru reizi pagriežot “masku” reģistru, jūs varat pārbaudīt katru no 16 bitiem. Ja pārbaudītais bits ir HIGH, ar šo bitu saistītais signāls iedegas displejā un izslēdzas, kad bits ir LOW.

Šīs sistēmas “negatīvais” aspekts ir tāds, ka Nextion displejā ierakstīto kodu ir mazāk ērti dokumentēt nekā Arduino kodu. Turklāt Nextion kods riskē tikt izkaisīts pa dažādiem objektiem. Ir jārūpējas, lai nekavējoties dokumentētu to, ko darāt.

Es izmantoju Notepad ++, lai uzrakstītu kodu, ko pēc tam nokopēju Nextion objektā, kas ir gandrīz tikai 0 lapas tm0.

Nextion valodas sintaksei ir daudz ierobežojumu, taču tai izdodas tos pārvarēt vai apiet ar minimālu piepūli, kā arī mēģināt aplūkot problēmas no neparasta viedokļa.

Kā piemēru es ziņoju par veidu, kādā Arduino raksta pārsūtāmo reģistru, ko es uzrakstīju pēc iespējas elementārākā veidā.

1. darbība. Reģistra pārsūtīšana

Failā ArduinoCode. PDF es rādu visu savu skici. (Lasot kodu šeit, tas nav tik skaidrs)

Šeit es vēlos tikai parādīt, kādā veidā Arduino nosūta 16 bitu reģistru uz Nextion bez bibliotēku palīdzības, bet ievērojot ITEAD aprakstīto sintaksi.

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

anulēts NexUpd ()

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

{

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

SRSerial.print (InpReg); // pārsūtiet 16 savāktos bitus uz Nextion displeju

SRSerial.print (InpReg); // pārsūtiet 16 savāktos bitus uz Nextion displeju

SRSerial.write (terminālis); 255

SRSerial.write (terminālis); 255

SRSerial.write (terminālis); 255

}

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

2. solis:.. Bet pirms…

.. Bet pirms…
.. Bet pirms…

Protams, kods sākas ar visām deklarācijām un iestatīšanu ().

Ieejas ir INPUT_PULLUP, tāpēc ieejas slēdži parasti ir atvērti, un, aizverot, tie piemēro GND atbilstošajai ieejai.

(Šī ir mana pirmā pamācība, un man žēl parādīt jums savu kodu šādā sliktā veidā. Lūdzu, lejupielādējiet failu ArduinoCode. PDF, ka tas ir ļoti skaidrs.

Ļaujiet man vairāk par to runāt

Esmu izstrādājis savu veidu, kā “pateikt” Nextion displejam, kas tam jādara. Parasti MCU (manā gadījumā Arduino) nosūta ziņojumu par katru variāciju, kas attiecas uz jebkura atsevišķa objekta atribūtu. Šī metode tērē daudz laika, lai darītu lietas, kas ne vienmēr ir tik steidzamas, lai nepārtraukti ielādētu sērijas līniju. Man šķita ērtāk, ja Arduino savāc 16 bitu reģistros informāciju par atribūtiem, kas atšķiras atkarībā no Nextion. Apmēram ik pēc 500 mS mans Arduino nosūta Nextion vienu ziņojumu, kas satur katrā reģistrā esošos 16 bitus. Acīmredzot Nextion mums ir nepieciešams kods, kas apstrādā to, kas jāizpilda. Šāds uzdevuma (un koda) sadalījums ļauj iegūt daudzas citas priekšrocības. Piemēram, padomājiet, kā likt mirgot gaismai! Ar manu pieeju tas ir vienkārši: nedaudz iestatiet Arduino reģistrā un nosūtiet to uz Nextion. Nextion dvīņu reģistrus no Arduino varētu atjaunināt ļoti reti, jo mirgošanas frekvence ir neatkarīga no saziņas; mirgošanas biežums ir atkarīgs no taimera objekta uz Nextion un var darboties ar minimālo laika bāzi gandrīz 50 mS. Tātad ar manu metodi mēs varam mirgot Nextion gaismā ar salīdzinoši augstu frekvenci (pieņemsim, 2 Hz), pat ja mans Arduino sūta ziņojumus ik pēc 10 sekundēm, tikai ekstremālam piemēram. Tas var liecināt par pretēju problēmu: kā rīkoties, ja saziņa neizdodas? Tas nav šīs diskusijas objekts, bet es jau esmu atrisinājis šo problēmu ar sava veida sargsuņa palīdzību: viens Arduino kodā, cits Nextion kodā.

Mirgošanu regulē Nextion kods, kur katra gaisma atbilst viņa pareizajiem noteikumiem: IESLĒGTS/IZSLĒGTS vai ZAĻS/SARKANS vai arī mainot rakstīto (vai citu). Es varētu pastāstīt dažas citas lietas par savu projektu, bet es labāk gaidu jūsu jautājumus, pirms pievienoju pārāk daudz vārdu, kurus man nav tik viegli iztulkot, kā es to darītu.

3. darbība: Nextion objektu rediģēšana

Nextion objektu rediģēšana
Nextion objektu rediģēšana

Šeit ir daļa no koda, ko es uzrakstīju ar Nextion Editor uz objekta tm0.

Mēs nepamanām, ka ar 16 bitiem, kas saņemti no Arduino, Nextion displejs ne tikai ieslēdz un izslēdz signālus. Pagaidām izlaižu paskaidrojumus, lai nesarežģītu izpratni.

Esmu iesācējs, tāpēc labāk ir lejupielādēt Nextion kodu. PDF lapu, lai lasītu sajaukto kodu šeit. (Atvainojiet, šī ir mana pirmā pamācība)

Ja vēlaties, šai manai lietojumprogrammai varat lejupielādēt pilnu kodu "HMI". Šī koda faila nosaukums ir POW1225. HMI. Tas var iekļūt jūsu Nextion displejā NX4024T032, bet, lai to saprastu, jums ir jāiepeldējas daudzos objektos un jāaplūko kods redaktora mazajā logā. Tāpēc es domāju, ka būs vieglāk apskatīt galveno kodu, kas rakstīts failā Nextion code. PDF

// Projekts POW1225. HMI 2019. gada 15. maijs

// vACC (va0) Akumulators

// vINP (va1) Ievades reģistrs xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Sākt

tm0.tim = 50 // tm0 Laika bāze 50 mS

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

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

ja (vACC.val! = 0) // Pārbaudiet RDY

{

tRDY.pco = ZILS // SARKANS

} cits

{

tRDY.pco = PELĒKA // tumši pelēka

}

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

vACC.val = vINP.val & 0x0002

ja (vACC.val! = 0) // Pārbaudiet PWR

{

tPWR.pco = ZAĻA // gaiši ZAĻA

tPON.txt = "IESLĒGTS" // IESLĒGTS

tPON.pco = ZAĻA // gaiši ZAĻA

} cits

{

tPWR.pco = PELĒKA // tumši pelēka 33808

tPON.txt = "IZSLĒGTS" // IZSLĒGTS

tPON.pco = PELĒKA // tumši pelēka 33808

}

// DRY ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // Pārbaudīt DRY

{

tDRV.pco = ZILS // ZILS

tDRY.pco = ZILS // ZILS

} cits

{

tDRV.pco = PELĒKA // tumši pelēka 33808

tDRY.pco = PELĒKA // tumši pelēka 33808

}

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

vACC.val = vINP.val & 0x0018

ja (vACC.val! = 0) // Testa RUN

{

tRUN.bco = RED // MARCIA RED (ieslēgts)

tRUN.pco = BLACK // uz BLACK

tDIR.bco = SARKANS // DIR SARKANS

tDIR.pco = BLACK // uz BLACK

} cits

{

tRUN.bco = 32768 // MARCIA GREY (izslēgts)

tRUN.pco = PELĒKA // pelēkā krāsā

tDIR.bco = 32768 // DIR tumši zaļa 1024

tDIR.pco = PELĒKA // DIR GREY

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

}

// pa kreisi **************

vACC.val = vINP.val & 0x0008

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

{

tDIR.txt = "<<<" // KREISIS KREISIS

}

// TAISNĪBA *************

vACC.val = vINP.val & 0x0010

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

{

tDIR.txt = ">>>" // TIEŠAIS

}

// Abos **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Pārbaudīt RUN abus

{

tDIR.txt = ">>! <<" // DIRB

}

// PĀRBAUDE **************

vACC.val = vINP.val & 0x0020

ja (vACC.val! = 0) // Pārbaudes tests

{

tTEST.pco = BALTS // BALTS

tsw tTEST, 1 // Iespējot pieskāriena notikumus

} cits

{

tTEST.pco = PELĒKA // tumši pelēka 33808

tsw tTEST, 0 // Atspējot Touch notikumus

}

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

vACC.val = vINP.val & 0x0040

ja (vACC.val == 0) // Testa kļūda

{

tFLT.pco = PELĒKA // KĻŪDA nav

}

ja (vACC.val! = 0)

{

tFLT.pco = DZELTENS // KĻŪDA

}

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

vACC.val = vINP.val & 0x0080

ja (vACC.val == 0) // Pārbaudiet EME

{

tEME.pco = PELĒKA // EME nav

}

ja (vACC.val! = 0)

{

tEME.pco = RED // EME klāt

}

}

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

vACC.val = vINP.val & 0x0100

ja (vACC.val! = 0) // Pārbaudiet FERMO

{

tFER.pco = MELNA // MELNA

tFER.bco = ZAĻA // ZAĻA

} cits

{

tFER.pco = PELĒKA // PELĒKA

tFER.bco = 672 // tumši ZAĻA

}

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

Apstiprinājums

Es vēlos pateikties Gideonam Rossouvam, jo, lasot viņa pamācības, esmu ātri sasniedzis daļu no saviem mērķiem. Paldies, mr. Gideons Rossuvs

Ieteicams: