Innholdsfortegnelse:

En annen tilnærming med neste: 3 trinn
En annen tilnærming med neste: 3 trinn

Video: En annen tilnærming med neste: 3 trinn

Video: En annen tilnærming med neste: 3 trinn
Video: Staysman & Lazz - En godt stekt pizza 2024, Juli
Anonim
En annen tilnærming med Nextion
En annen tilnærming med Nextion

I mitt første prosjekt med Arduino Nano koblet til Nextion berøringsskjerm, hadde jeg skrevet en lang rekke kommandoer som skulle kommuniseres til Nextion via serieporten, og dette er uunngåelig hvis vi må sende totalt uavhengige kommandoer i tilfeldige øyeblikk.

Jeg må også innrømme at jeg brukte mer tid på å "kjempe" med biblioteker enn noe annet. Så jeg begynte gradvis å jobbe helt uten de tunge ITEAD -bibliotekene.

Jeg skjønte snart at jeg ikke hadde noen hast til å kommunisere endringene i attributtene til visuelle objekter til Nextion, men jeg foretrekker å vente til jeg samlet dem og sende dem til Nextion som helhet, da jeg fikk en komplett gruppe.

Jeg skal prøve å forklare meg bedre.

Når jeg i prosjektet mitt består av 16 tekstindikasjoner jeg vil slå noen av dem på eller av, gjør jeg det ved å dra fordel av 'bco' -attributtet som for eksempel for å slå på, går fra mørkegrått til hvitt (hvis det er i et svart rektangel), og omvendt for å slå av.

I applikasjonen min fant jeg det ubrukelig å sende 16 kommandoer til serieporten i 16 forskjellige øyeblikk, en for hver "bco" av de 16 signalene.

Jeg foretrekker i stedet at Arduino samler hvilke signaler som må være 'på' (HIGH) og hvilke som må være 'off' (LOW) i et 16-biters register, hvor hver bit tilsvarer en av de 16 signalene til Nextion.

Etter å ha oppdatert hver bit i registret, overfører jeg verdien til Nextion, en enkelt melding som inneholder en kollektiv informasjon om 16 elementer.

På denne måten reduseres kommunikasjonen fra Arduino og Nextion betraktelig fordi i den ene meldingen som sendes på serien til Nextion, samles informasjon inn som ellers ville ha krevd overføring av 16 meldinger.

Det er sant at det ikke alltid er nødvendig å oppdatere alle rapportene, men jeg er sikker på at å gjøre noe annet ville kaste bort mer tid.

Hver bit som er inne i heltallet mottatt av Arduino, må Nextion -skjermen naturligvis knytte den til ønsket attributt.

Dette betyr at koden må skrives i Nextion -displayet, men den skal ikke skremmes: hvis jeg lyktes …

Da er det en dobbel fordel: Arduino vil ha en lettere kode og vil være mindre engasjert i seriell kommunikasjon med Nextion.

Nextion etter å ha mottatt dataene i en enkelt melding, vil bruke dem mye raskere enn om det skulle vente på 16 meldinger. Å slå på eller av 16 signaler vil derfor være nesten samtidig med hensyn til den vanligste modusen, hvor tiden for et ukjent antall meldinger går mellom utførelsen av kommandoen for den første signaleringen og kommandoen for den siste signalen.

I Nextion -skjermen opprettet jeg dette systemet på en klassisk måte, det vil si at ved å snu et "maske" -register hver gang kan du undersøke hver av de 16 bitene. Når den undersøkte biten er HØY, lyser signalet knyttet til den biten på displayet og slås av når litt er LAVT.

Det 'negative' aspektet ved dette systemet er at koden skrevet i Nextion -skjermen er mindre praktisk å dokumentere enn Arduino -koden. Videre risikerer Nextion -koden å bli spredt over forskjellige objekter. Det må utvises forsiktighet for å dokumentere det du gjør med en gang.

Jeg bruker Notisblokk ++ til å skrive koden som jeg deretter kopierer til Nextion -objektet som nesten utelukkende er på tm0 på side 0.

Syntaksen til Nextion -språket har mange begrensninger, men det klarer å overvinne dem eller omgå dem med et minimum av innsats og prøve å se problemene fra synspunkter som også er uvanlige.

Som et eksempel rapporterer jeg hvordan Arduino skriver registret som skal overføres, skrevet av meg på den mest elementære måten som er mulig.

Trinn 1: Hvordan registeret overføres

I filen ArduinoCode. PDF viser jeg hele skissen min. (Å lese koden her nede er ikke så tydelig)

Her nede vil jeg bare vise på hvilken måte Arduino sender 16 -biters Register til Nextion, uten hjelp fra bibliotekene, men bare respekterer syntaksen beskrevet av ITEAD.

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

ugyldig NexUpd ()

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

{

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

SRSerial.print (InpReg); // overfør de 16 innsamlede bitene til Nextion Display

SRSerial.print (InpReg); // overfør de 16 innsamlede bitene til Nextion Display

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

}

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

Trinn 2:.. Men før…

.. Men før …
.. Men før …

Selvfølgelig starter koden med alle deklarasjonene og oppsettet ().

Inngangene er INPUT_PULLUP, så inngangsbryterne er normalt åpne, og når de er lukket, bruker de GND på korrespondentinngangen.

(Dette er min første Instructable, og jeg beklager å vise deg koden min på denne dårlige måten. Last ned filen ArduinoCode. PDF at den er veldig tydelig.

La meg snakke mer om det

Jeg har utviklet min egen måte å "fortelle" til Nextion -skjermen hva den må gjøre. Vanligvis sender MCU (Arduino i mitt tilfelle) en melding for hver enkelt variant som skal gjelde attributtet til et enkelt objekt. Denne metoden kaster bort mye tid på å gjøre ting som ikke alltid er så presserende å laste serielinjen kontinuerlig. Jeg fant det mer praktisk at Arduino samler inn i 16 biters registre informasjonen om attributtene som skal variere på Nextion. Omtrent hver 500 ms sendte min Arduino en melding til Nextion som inneholdt 16 -bitene i hvert register til enhver tid. Tydeligvis i Nextion trenger vi koden som håndterer det som må utføres. Denne fordelingen av oppgaven (og koden) gir mange andre fordeler. Tenk for eksempel hvordan du får et blink til å lyse! Med min tilnærming er det enkelt: sett litt inn i Arduino -registeret og send det til Nextion. Nextion -tvillingregistrene kan svært sjelden oppdateres fra Arduino, fordi blinkfrekvensen er uavhengig av kommunikasjonen; blinkfrekvensen er avhengig av et Timer -objekt til Nextion og kan kjøre med en minimum tidsbase nær 50 mS. Så med min metode kan vi blinke et lys i Nextion med relativt høy frekvens (antar 2 Hz), selv om Arduino sender meldinger hvert 10. sekund, bare for et ekstremt eksempel. Dette kan antyde det motsatte problemet: hvordan gjør jeg hvis kommunikasjonen mislykkes? Dette er ikke gjenstanden for denne diskusjonen, men jeg har allerede løst dette problemet med en slags Watch Dog: en inne i Arduino -koden, en annen til Nextion -koden.

Blinkingen er regulert av Nextion -koden, hvor hvert lys følger de riktige reglene: PÅ/AV eller GRØNN/RØD eller også endre det skrevne inne (eller annet mer). Jeg kunne fortelle noen andre ting om prosjektet mitt, men jeg foretrekker å vente på spørsmålene dine før jeg legger til for mange ord som ikke er så enkle for meg å oversette som jeg ville.

Trinn 3: Redigere Nextion -objektene

Redigere Nextion -objektene
Redigere Nextion -objektene

Her er en del av koden jeg skrev med Nextion Editor på tm0 -objektet.

Det kommer ikke bort fra vår oppmerksomhet at med de 16 bitene mottatt fra Arduino, slår Nextion -skjermen ikke bare på og av signalene. For øyeblikket utelater jeg forklaringene for ikke å komplisere forståelsen.

Jeg er nybegynner, og derfor er det bedre å laste ned Nextion code. PDF -siden i stedet for å lese den forvirrede koden her nede. (Jeg beklager at dette er min første instruks)

Hvis du ønsker det, kan du laste ned hele koden "HMI" for denne applikasjonen min. Filnavnet til denne koden er POW1225. HMI. Det kan løpe inn i Nextion -skjermen NX4024T032, men for å forstå det må du svømme inn i mange objekter og se koden inne i det lille vinduet til redaktøren. Så jeg tror det blir lettere å se på hovedkoden, skrevet i filen Nextion code. PDF

// Project POW1225. HMI 15. mai 2019

// vACC (va0) Akkumulator

// vINP (va1) Inngangsregister xxxx xxxx xxxx xxxx

tm0.no = 1 // tm0 Start

tm0.tim = 50 // tm0 Tidsgrunnlag 50 mS

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

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

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

{

tRDY.pco = BLÅ // RØD

}ellers

{

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

}

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

vACC.val = vINP.val og 0x0002

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

{

tPWR.pco = GRØN // lys GRØN

tPON.txt = "PÅ" // PÅ

tPON.pco = GRØNN // lett GRØNN

}ellers

{

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

tPON.txt = "AV" // AV

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

}

// TØRR ****************

vACC.val = vINP.val og 0x0004

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

{

tDRV.pco = BLÅ // BLÅ

tDRY.pco = BLÅ // BLÅ

}ellers

{

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

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

}

// LØPE ***************

vACC.val = vINP.val og 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

}ellers

{

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

}

// VENSTRE **************

vACC.val = vINP.val og 0x0008

hvis (vACC.val! = 0) // Test RUN Høyre

{

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

}

// IKKE SANT *************

vACC.val = vINP.val og 0x0010

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

{

tDIR.txt = ">>>" // DIR HØYRE

}

// BÅDE **************

vACC.val = vINP.val og 0x0018

hvis (vACC.val == 24) // Test RUN begge

{

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

}

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

vACC.val = vINP.val og 0x0020

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

{

tTEST.pco = HVIT // HVIT

tsw tTEST, 1 // Aktiver berøringshendelser

}ellers

{

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

tsw tTEST, 0 // Deaktiver berøringshendelser

}

// FEIL **************

vACC.val = vINP.val og 0x0040

hvis (vACC.val == 0) // Test FEIL

{

tFLT.pco = GRÅ // FEIL fraværende

}

hvis (vACC.val! = 0)

{

tFLT.pco = GUL // FEIL til stede

}

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

vACC.val = vINP.val og 0x0080

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

{

tEME.pco = GRÅ // EME fraværende

}

hvis (vACC.val! = 0)

{

tEME.pco = RØD // EME tilstede

}

}

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

vACC.val = vINP.val og 0x0100

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

{

tFER.pco = SVART // SVART

tFER.bco = GRØNN // GRØNN

}ellers

{

tFER.pco = GRÅ // GRÅ

tFER.bco = 672 // mørk GRØN

}

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

Bekreftelse

Jeg vil gi mine anerkjennelser til Gideon Rossouwv fordi jeg ved å lese instruksjonene hans raskt har fått en del av målene mine. Takk mr. Gideon Rossouwv

Anbefalt: