Innehållsförteckning:

Ett annat tillvägagångssätt med Nextion: 3 steg
Ett annat tillvägagångssätt med Nextion: 3 steg

Video: Ett annat tillvägagångssätt med Nextion: 3 steg

Video: Ett annat tillvägagångssätt med Nextion: 3 steg
Video: Nyheter på lätt svenska 27/01 2024 2024, November
Anonim
Ett annat tillvägagångssätt med Nextion
Ett annat tillvägagångssätt med Nextion

I mitt första projekt med Arduino Nano ansluten till Nextion pekskärm hade jag skrivit en lång rad kommandon som skulle kommuniceras till Nextion via serieporten och detta är oundvikligt om vi behöver skicka helt oberoende kommandon i slumpmässiga ögonblick.

Jag måste också erkänna att jag ägnade mer tid åt att "slåss" med biblioteken än något annat. Så jag kom gradvis till jobbet helt utan de tunga ITEAD -biblioteken.

Jag insåg snart att jag inte hade någon brådska att kommunicera ändringarna i attributen för visuella objekt till Nextion, men jag föredrar att vänta tills jag samlat dem och skicka dem till Nextion som helhet, när jag fick en komplett grupp.

Jag ska försöka förklara mig bättre.

När jag i mitt projekt består av 16 textindikationer vill jag slå på eller av några av dem, gör jag det genom att dra nytta av attributet 'bco' som för att slå på, övergår (till exempel) från mörkgrått till vitt (om i en svart rektangel), och vice versa för att stänga av.

I min applikation tyckte jag att det var meningslöst att skicka 16 kommandon till serieporten i 16 olika ögonblick, en för varje "bco" av de 16 signalerna.

Jag föredrar istället att Arduino samlar vilka signaler som måste vara 'på' (HIGH) och vilka som måste vara 'off' (LOW) i ett 16-bitars register, där varje bit motsvarar en av de 16 signalerna av Nextion.

Efter att ha uppdaterat varje bit i registret överför jag dess värde till Nextion, ett enda meddelande som innehåller en kollektiv information om 16 element.

På detta sätt reduceras kommunikationen från Arduino och Nextion avsevärt eftersom i det enda meddelandet som överförs på serien till Nextion, samlas information in som annars skulle ha krävt överföring av 16 meddelanden.

Det är sant att det inte alltid är nödvändigt att uppdatera alla rapporter, men jag är säker på att att göra annat skulle slösa mer tid.

Naturligtvis måste varje bit i heltalet som tas emot av Arduino, Nextion -displayen koppla den till det önskade attributet.

Det betyder att koden måste skrivas i Nextion -displayen, men den ska inte vara rädd: om jag lyckades …

Sedan finns det en dubbel fördel: Arduino kommer att ha en lättare kod och kommer att vara mindre engagerad i seriell kommunikation med Nextion.

Nextion efter att ha tagit emot data i ett enda meddelande, kommer att använda dem mycket snabbare än om det skulle vänta på 16 meddelanden. Slå på eller av 16 signaler kommer därför att vara nästan samtidiga med avseende på det vanligaste läget, i vilket tiden för ett okänt antal meddelanden förflutit mellan utförandet av kommandot för den första signalen och kommandot för den sista signalen.

I Nextion -displayen skapade jag detta system på det klassiska sättet, det vill säga genom att vrida ett "mask" -register varje gång kan du undersöka var och en av de 16 bitarna. När den undersökta biten är HÖG lyser signalen som är associerad med den biten på displayen och stängs av när en bit är LÅG.

Den "negativa" aspekten av detta system är att koden som skrivs i Nextion -displayen är mindre bekväm att dokumentera än Arduino -koden. Dessutom riskerar Nextion -koden att spridas över olika objekt. Var noga med att dokumentera vad du gör direkt.

Jag använder Anteckningar ++ för att skriva koden som jag sedan kopierar till Nextion -objektet som nästan uteslutande finns på tm0 på sidan 0.

Syntaxen för Nextion -språket har många begränsningar, men det lyckas övervinna dem eller komma runt dem med ett minimum av ansträngning och försöka se problemen från synvinklar som också är ovanliga.

Som exempel rapporterar jag hur Arduino skriver det register som ska överföras, skrivet av mig på det mest elementära sätt som möjligt.

Steg 1: Hur registret överförs

I filen ArduinoCode. PDF visar jag hela min skiss. (Att läsa koden här ner är inte så tydligt)

Här ner vill jag bara visa på vilket sätt Arduino skickar 16 -bitarsregistret till Nextion, utan hjälp av biblioteken, men bara respekterar syntaxen som beskrivs av ITEAD.

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

void NexUpd ()

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

{

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

SRSerial.print (InpReg); // överför de 16 samlade bitarna till Nextion Display

SRSerial.print (InpReg); // överför de 16 samlade bitarna till Nextion Display

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

}

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

Steg 2:.. Men innan…

.. Men innan …
.. Men innan …

Naturligtvis börjar koden med alla deklarationer och setup ().

Ingångarna är INPUT_PULLUP, så ingångsbrytarna är normalt öppna och när de är stängda tillämpar de GND på korrespondentingången.

(Detta är min första instruerbara och jag är ledsen att visa dig min kod på detta dåliga sätt. Ladda ner filen ArduinoCode. PDF att det är mycket tydligt.

Låt mig prata mer om det

Jag har utvecklat mitt eget sätt att "berätta" för Nextion -displayen vad den måste göra. Vanligtvis skickar MCU (Arduino i mitt fall) ett meddelande för varje variant att gälla attributet för ett enda objekt. Denna metod slösar bort mycket tid på att göra saker som inte alltid är så brådskande att kontinuerligt ladda serielinjen. Jag tyckte det var mer bekvämt att Arduino samlar in 16 -bitarsregister informationen om attributen som ska variera på Nextion. Ungefär var 500 mS skickade min Arduino ett meddelande till Nextion med 16 bitar i varje register. Självklart behöver vi i Nextion koden som hanterar det som måste utföras. Denna fördelning av uppgiften (och koden) ger många andra fördelar. Tänk till exempel hur man gör att blinka ett ljus! Med mitt tillvägagångssätt är det enkelt: sätt in lite i Arduino -registret och skicka det till Nextion. Nextion -tvillingregistren skulle kunna uppdateras från Arduino mycket sällan, eftersom blinkfrekvensen är oberoende av kommunikationen; blinkfrekvensen beror från ett timerobjekt till Nextion och kan köras med en minsta tidsbas nära 50 mS. Så med min metod kan vi blinka ett ljus i Nextion vid relativt hög frekvens (antar 2 Hz), även om min Arduino skickar meddelanden var tionde sekund, bara för ett extremt exempel. Detta kan föreslå det motsatta problemet: hur gör man om kommunikationen misslyckas? Detta är inte föremålet för denna diskussion, men jag har redan löst detta problem med en slags Watch Dog: en inuti Arduino -koden, en annan i Nextion -koden.

Blinkningen regleras av Nextion -koden, där varje lampa följer sina riktiga regler: PÅ/AV eller GRÖN/RÖD eller också ändra den inskrivna insidan (eller annat mer). Jag kan berätta några andra saker om mitt projekt men jag föredrar att vänta på dina frågor innan jag lägger till för mycket ord som inte är så lätt för mig att översätta så bra som jag skulle.

Steg 3: Redigera Nextion -objekt

Redigera Nextion -objekt
Redigera Nextion -objekt

Här är en del av koden jag skrev med Nextion Editor på tm0 -objektet.

Det undgår inte att vi känner till att med de 16 bitar som mottagits från Arduino, Nextion -displayen inte bara slår på och av signalerna. För tillfället utelämnar jag förklaringarna för att inte försvåra förståelsen.

Jag är nybörjare och det är därför bättre att ladda ner Nextion code. PDF -sidan istället för att läsa den förvirrade koden här ner. (Jag är ledsen att detta är min första instruerbara)

Om du vill kan du ladda ner hela koden "HMI" för denna min applikation. Filnamnet för denna kod är POW1225. HMI. Det kan springa in i din Nextion -skärm NX4024T032 men för att förstå det måste du simma in i många objekt och titta på koden inuti redaktörens lilla fönster. Så jag tror att det blir lättare att titta på huvudkoden, skriven i filen Nextion code. PDF

// Projekt POW1225. HMI 15 maj 2019

// vACC (va0) Ackumulator

// vINP (va1) Inmatningsregister xxxx xxxx xxxx xxxx

tm0.sv = 1 // tm0 Start

tm0.tim = 50 // tm0 Tidsbas 50 mS

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

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

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

{

tRDY.pco = BLÅ // RÖD

}annan

{

tRDY.pco = GRÅ // mörk GRÅ

}

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

vACC.val = vINP.val & 0x0002

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

{

tPWR.pco = GRÖN // ljus GRÖN

tPON.txt = "ON" // ON

tPON.pco = GRÖN // ljus GRÖN

}annan

{

tPWR.pco = GRÅ // mörk GRÅ 33808

tPON.txt = "AV" // AV

tPON.pco = GRÅ // mörk GRÅ 33808

}

// TORR ***************

vACC.val = vINP.val & 0x0004

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

{

tDRV.pco = BLÅ // BLÅ

tDRY.pco = BLÅ // BLÅ

}annan

{

tDRV.pco = GRÅ // mörk GRÅ 33808

tDRY.pco = GRÅ // mörk GRÅ 33808

}

// SPRINGA ***************

vACC.val = vINP.val & 0x0018

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

{

tRUN.bco = RÖD // MARCIA RÖD (på)

tRUN.pco = SVART // på SVART

tDIR.bco = RÖD // DIR RÖD

tDIR.pco = SVART // på SVART

}annan

{

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

tRUN.pco = GRÅ // på GRÅ

tDIR.bco = 32768 // DIR dark GREEN 1024

tDIR.pco = GRÅ // DIR GRÅ

tDIR.txt = "---" // STOPP

}

// VÄNSTER **************

vACC.val = vINP.val & 0x0008

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

{

tDIR.txt = "<<<" // DIR VÄNSTER

}

// HÖGER *************

vACC.val = vINP.val & 0x0010

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

{

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

}

// Båda ***************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Test RUN båda

{

tDIR.txt = ">>! <<" // DIR BÅDE

}

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

vACC.val = vINP.val & 0x0020

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

{

tTEST.pco = VIT // VIT

tsw tTEST, 1 // Aktivera Touch -händelser

}annan

{

tTEST.pco = GRÅ // mörk GRÅ 33808

tsw tTEST, 0 // Inaktivera Touch -händelser

}

// FEL **************

vACC.val = vINP.val & 0x0040

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

{

tFLT.pco = GRÅ // FEL frånvarande

}

om (vACC.val! = 0)

{

tFLT.pco = GUL // FEL närvarande

}

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

vACC.val = vINP.val & 0x0080

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

{

tEME.pco = GRÅ // EME frånvarande

}

om (vACC.val! = 0)

{

tEME.pco = RÖD // EME närvarande

}

}

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

vACC.val = vINP.val & 0x0100

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

{

tFER.pco = SVART // SVART

tFER.bco = GRÖN // GRÖN

}annan

{

tFER.pco = GRÅ // GRÅ

tFER.bco = 672 // mörk GRÖN

}

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

Bekräftelse

Jag vill ge mina erkännanden till Gideon Rossouwv eftersom jag snabbt fått en del av mina mål när jag läste hans instruktioner. Tack mr. Gideon Rossouwv

Rekommenderad: