Turinys:

Skirtingas požiūris naudojant „Nextion“: 3 žingsniai
Skirtingas požiūris naudojant „Nextion“: 3 žingsniai

Video: Skirtingas požiūris naudojant „Nextion“: 3 žingsniai

Video: Skirtingas požiūris naudojant „Nextion“: 3 žingsniai
Video: Verslo požiūris. Naujametinė valdžios dovana – gigantiškas mokestis gyventojams ir verslui 2024, Liepa
Anonim
Kitoks požiūris naudojant „Nextion“
Kitoks požiūris naudojant „Nextion“

Pirmajame projekte, kuriame „Arduino Nano“buvo prijungtas prie „Nextion“jutiklinio ekrano, buvau parašęs ilgą komandų seriją, kurią reikia perduoti „Nextion“per nuoseklųjį prievadą, ir tai yra neišvengiama, jei mums reikia atsitiktinėmis akimirkomis siųsti visiškai nepriklausomas komandas.

Taip pat turiu pripažinti, kad daugiau laiko praleidau „kovodamas“su bibliotekomis. Taigi pamažu visiškai pradėjau dirbti be didelių ITEAD bibliotekų.

Netrukus supratau, kad neturiu skubos pranešti „Nextion“apie vizualinių objektų atributų pasikeitimus, tačiau man labiau patinka palaukti, kol juos surinksiu, ir išsiųsti į „Nextion“kaip visumą, kai gausiu visą grupę.

Pabandysiu geriau paaiškinti save.

Kai savo projekte, kurį sudaro 16 tekstinių nuorodų, noriu įjungti arba išjungti kai kurias iš jų, tai darau pasinaudodamas atributu „bco“, kuris įjungimo metu (pavyzdžiui) pereina nuo tamsiai pilkos iki baltos (jei juodas stačiakampis), ir atvirkščiai - išjungti.

Savo programoje man atrodė nenaudinga siųsti 16 komandų į nuoseklųjį prievadą per 16 skirtingų momentų, po vieną kiekvienam „bco“iš 16 signalų.

Geriau, kad „Arduino“surinktų, kurie signalai turi būti įjungti (HIGH), o kurie-„išjungti“(LOW) 16 bitų registre, kur kiekvienas bitas atitinka vieną iš 16 „Nextion“signalų.

Atnaujinęs kiekvieną registro bitą, perduodu jo vertę „Nextion“- vienam pranešimui, kuriame yra bendra informacija apie 16 elementų.

Tokiu būdu ryšys iš „Arduino“ir „Nextion“yra žymiai sumažintas, nes tame viename pranešime, perduotame serijiniu būdu „Nextion“, renkama informacija, kurios kitu atveju būtų reikėję perduoti 16 pranešimų.

Tiesa, ne visada būtina atnaujinti visas ataskaitas, tačiau esu įsitikinęs, kad kitaip elgdamiesi sugaištumėte daugiau laiko.

Natūralu, kad kiekvienas „Arduino“gautas sveikasis skaičius turi „Nextion“ekraną, kuris turi jį susieti su norimu atributu.

Tai reiškia, kad kodas turi būti parašytas „Nextion“ekrane, tačiau nereikia išsigąsti: jei pavyks …

Tada yra dvigubas pranašumas: „Arduino“turės lengvesnį kodą ir mažiau užsiims serijiniu ryšiu su „Nextion“.

„Nextion“, gavusi duomenis vienu pranešimu, juos naudos daug greičiau, nei lauktų 16 pranešimų. Todėl 16 signalų įjungimas arba išjungimas bus beveik tuo pačiu metu, kai naudojamas įprastas režimas, kai nuo pirmojo signalizavimo komandos įvykdymo iki paskutinio signalizavimo komandos praeina nežinomo pranešimų skaičiaus laikas.

„Nextion“ekrane aš sukūriau šią sistemą klasikiniu būdu, tai yra, kiekvieną kartą pasukus „kaukės“registrą galima ištirti kiekvieną iš 16 bitų. Kai ištirtas bitas yra AUKŠTAS, signalas, susietas su tuo bitu, užsidega ekrane ir išsijungia, kai bitas yra ŽEMAS.

Neigiamas šios sistemos aspektas yra tas, kad „Nextion“ekrane parašytas kodas yra mažiau patogus dokumentuoti nei „Arduino“kodas. Be to, „Nextion“kodas gali išsibarstyti po įvairius objektus. Reikia nedelsiant dokumentuoti, ką darote.

Aš naudoju „Notepad ++“, kad parašyčiau kodą, kurį nukopijuoju į „Nextion“objektą, kuris yra beveik vien tik 0 puslapio tm0.

„Nextion“kalbos sintaksė turi daug apribojimų, tačiau ji sugeba jas įveikti arba apeiti su minimaliomis pastangomis ir pabandyti pamatyti problemas taip pat neįprastais požiūriais.

Kaip pavyzdį pateikiu būdą, kuriuo Arduino rašo perduodamą registrą, kurį aš parašiau kiek įmanoma elementariau.

1 žingsnis: kaip perduodamas registras

Faile ArduinoCode. PDF rodau visą savo eskizą. (Skaitant kodą ne taip aišku)

Čia aš tik noriu parodyti, kokiu būdu „Arduino“siunčia 16 bitų registrą į „Nextion“be bibliotekų pagalbos, bet gerbdamas ITEAD aprašytą sintaksę.

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

void NexUpd ()

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

{

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

SRSerial.print (InpReg); // perduoti 16 surinktų bitų į „Nextion“ekraną

SRSerial.print (InpReg); // perduoti 16 surinktų bitų į „Nextion“ekraną

SRSerial.write (terminalas); 255

SRSerial.write (terminalas); 255

SRSerial.write (terminalas); 255

}

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

2 žingsnis:.. Bet prieš…

.. Bet prieš…
.. Bet prieš…

Žinoma, kodas prasideda nuo visų deklaracijų ir sąrankos ().

Įvestys yra INPUT_PULLUP, todėl įvesties jungikliai paprastai yra atidaryti, o uždarius jie taiko GND atitinkamam įėjimui.

(Tai yra mano pirmasis „Instructable“ir apgailestauju, kad taip blogai parodau savo kodą. Atsisiųskite failą „ArduinoCode. PDF“, kad jis yra labai aiškus.

Leiskite man apie tai daugiau kalbėti

Aš sukūriau savo būdą „pasakyti“„Nextion“ekranui, ką jis turi daryti. Paprastai MCU (mano atveju „Arduino“) siunčia pranešimą kiekvienam variantui, kuris taikomas bet kurio vieno objekto atributui. Šis metodas praleidžia daug laiko tam, kad ne visada būtų taip skubu įkelti serijinę liniją. Man pasirodė patogiau, kad „Arduino“į 16 bitų registrus renka informaciją apie „Nextion“skirtingus atributus. Maždaug kas 500 mS mano „Arduino“siunčia „Nextion“vieną pranešimą, kuriame yra 16 bitų, esančių kiekviename registre vienu metu. Akivaizdu, kad „Nextion“mums reikalingas kodas, kuris tvarko tai, kas turi būti vykdoma. Šis užduoties (ir kodo) paskirstymas suteikia daug kitų pranašumų. Pavyzdžiui, pagalvokite, kaip priversti mirksėti šviesą! Mano požiūriu tai paprasta: šiek tiek nustatykite „Arduino“registrą ir nusiųskite jį į „Nextion“. „Nextion“dvynių registrus iš „Arduino“galima atnaujinti labai retai, nes mirksėjimo dažnis yra nepriklausomas nuo ryšio; mirksėjimo dažnis priklauso nuo laikmačio objekto į „Nextion“ir gali veikti mažiausiai 50 mS. Taigi, naudojant mano metodą, galime mirksėti „Nextion“šviesa santykinai dideliu dažniu (tarkime, 2 Hz), net jei mano „Arduino“siunčia pranešimus kas 10 sekundžių, tik kraštutiniu pavyzdžiu. Tai gali pasiūlyti priešingą problemą: kaip elgtis, jei ryšys nepavyksta? Tai nėra šios diskusijos objektas, bet aš jau išsprendžiau šią problemą su savotišku sarginiu šunimi: vienas yra „Arduino“kode, kitas - „Nextion“kode.

Mirksėjimą reguliuoja „Nextion“kodas, kuriame kiekviena lemputė atitinka jam nustatytas taisykles: ĮJUNGTA/IŠJUNGTA arba ŽALTA/RAUDONA arba taip pat keičiamas užrašas viduje (ar kita). Galėčiau papasakoti keletą kitų dalykų apie savo projektą, bet verčiau palaukti jūsų klausimų, prieš pridėdamas per daug žodžių, kuriuos man ne taip lengva išversti taip, kaip norėčiau.

3 veiksmas: „Nextion“objektų redagavimas

„Nextion“objektų redagavimas
„Nextion“objektų redagavimas

Čia yra kodo dalis, kurią parašiau su „Nextion Editor“objektu tm0.

Nevengiame pastebėti, kad su 16 bitų, gautų iš „Arduino“, „Nextion“ekranas ne tik įjungia ir išjungia signalus. Šiuo metu aš praleidžiu paaiškinimus, kad nebūtų apsunkintas supratimas.

Aš esu pradedantysis, todėl geriau atsisiųsti „Nextion code. PDF“puslapį, kad galėtumėte skaityti supainiotą kodą. (Atsiprašau, tai pirmas pamokymas)

Jei norite, galite atsisiųsti visą šios programos kodą „HMI“. Šio kodo failo pavadinimas yra POW1225. HMI. Jis gali patekti į jūsų „Nextion“ekraną NX4024T032, tačiau, kad tai suprastumėte, turite įplaukti į daugelį objektų ir pažvelgti į kodą mažame redaktoriaus lange. Taigi manau, kad bus lengviau ieškoti pagrindinio kodo, parašyto faile Nextion code. PDF

// Projektas POW1225. HMI 2019 m. Gegužės 15 d

// vACC (va0) Kaupiklis

// vINP (va1) Įvesties registras xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Pradėti

tm0.tim = 50 // tm0 Laiko bazė 50 mS

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

vACC.val = vINP.val & 0x0001 // Kaukė

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

{

tRDY.pco = MĖLYNA // RAUDONA

}Kitas

{

tRDY.pco = PILKAS // tamsiai pilkas

}

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

vACC.val = vINP.val & 0x0002

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

{

tPWR.pco = ŽALIA // šviesiai ŽALIA

tPON.txt = "ĮJUNGTA" // ĮJUNGTA

tPON.pco = ŽALIA // šviesiai ŽALIA

}Kitas

{

tPWR.pco = PILKAS // tamsiai pilkas 33808

tPON.txt = "IŠJUNGTA" // IŠJUNGTA

tPON.pco = PILKAS // tamsiai pilkas 33808

}

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

vACC.val = vINP.val & 0x0004

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

{

tDRV.pco = MĖLYNA // MĖLYNA

tDRY.pco = MĖLYNA // MĖLYNA

}Kitas

{

tDRV.pco = PILKAS // tamsiai pilkas 33808

tDRY.pco = PILKAS // tamsiai pilkas 33808

}

// Vykdyti ***************

vACC.val = vINP.val & 0x0018

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

{

tRUN.bco = RAUDONA // MARCIA RED (įjungta)

tRUN.pco = BLACK // ant BLACK

tDIR.bco = RAUDONA // DIR RED

tDIR.pco = JUODAS // ant JUODOS

}Kitas

{

tRUN.bco = 32768 // MARCIA GREY (išjungta)

tRUN.pco = PILKAS // ant pilkos

tDIR.bco = 32768 // DIR tamsiai žalias 1024

tDIR.pco = PILKAS // DIR GREY

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

}

// Kairė **************

vACC.val = vINP.val & 0x0008

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

{

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

}

// TEISINGAS *************

vACC.val = vINP.val & 0x0010

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

{

tDIR.txt = ">>>" // TIESIOGINIS

}

// abu **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Bandymas Vykdyti abu

{

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

}

// BANDYMAS **************

vACC.val = vINP.val & 0x0020

if (vACC.val! = 0) // Bandomasis testas

{

tTEST.pco = BALTA // BALTA

tsw tTEST, 1 // Įgalinti „Touch“įvykius

}Kitas

{

tTEST.pco = PILKAS // tamsiai pilkas 33808

tsw tTEST, 0 // Išjungti lietimo įvykius

}

// KLAIDA *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Bandymo gedimas

{

tFLT.pco = PILKAS // KLAIDOS nėra

}

jei (vACC.val! = 0)

{

tFLT.pco = GELTONA // KLAIDA

}

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

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // Išbandykite EME

{

tEME.pco = PILKAS // EME nėra

}

jei (vACC.val! = 0)

{

tEME.pco = RAUDONA // EME yra

}

}

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

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // Išbandykite FERMO

{

tFER.pco = JUODAS // JUODAS

tFER.bco = ŽALIA // ŽALIA

}Kitas

{

tFER.pco = PILKAS // PILKAS

tFER.bco = 672 // tamsiai ŽALIA

}

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

Pripažinimas

Noriu padėkoti Gideonui Rossouwvui, nes skaitydamas jo instrukcijas greitai pasiekiau dalį savo tikslų. Ačiū pone Gideonas Rossouwvas

Rekomenduojamas: