Obsah:

Iný prístup s odmietnutím: 3 kroky
Iný prístup s odmietnutím: 3 kroky

Video: Iný prístup s odmietnutím: 3 kroky

Video: Iný prístup s odmietnutím: 3 kroky
Video: 3. února jsou tyto věci absolutně nemožné, jinak budou potíže. Lidová znamení v den Maximova 2024, Júl
Anonim
Iný prístup s odhalením
Iný prístup s odhalením

V mojom prvom projekte s Arduino Nano pripojeným k dotykovému displeju Nextion som napísal dlhý rad príkazov, ktoré sa majú Nextion komunikovať prostredníctvom sériového portu, a to je nevyhnutné, ak potrebujeme v náhodných okamihoch odosielať úplne nezávislé príkazy.

Tiež musím priznať, že som „bojom“s knižnicami strávil viac času ako čokoľvek iné. Postupne som teda začal pracovať úplne bez ťažkých knižníc ITEAD.

Čoskoro som zistil, že nemám žiadnu naliehavú potrebu komunikovať so spoločnosťou Nextion o zmenách atribútov vizuálnych objektov, ale radšej počkám, kým ich zhromaždím a pošlem do Nextionu ako celku, keď dostanem kompletnú skupinu.

Skúsim sa lepšie vysvetliť.

Keď v mojom projekte pozostávajúcom zo 16 textových označení chcem niektoré z nich zapnúť alebo vypnúť, urobím to pomocou atribútu „bco“, ktorý pri zapnutí prechádza (napríklad) z tmavošedej do bielej (ak je čierny obdĺžnik) a naopak, aby ste ho vypli.

V mojej aplikácii som zistil, že je zbytočné posielať 16 príkazov na sériový port v 16 rôznych okamihoch, jeden pre každé „bco“zo 16 signálov.

Preferujem, aby Arduino zbieralo, ktoré signály musia byť „zapnuté“(HIGH) a ktoré musia byť „vypnuté“(LOW) v 16-bitovom registri, kde každý bit zodpovedá jednej zo 16 signalizácií Nextion.

Po aktualizácii každého bitu registra prenášam jeho hodnotu do Nextion, jedinej správy, ktorá obsahuje súhrnné informácie o 16 prvkoch.

Týmto spôsobom sa výrazne zníži komunikácia z Arduina a Nextion, pretože v tejto jedinej správe prenášanej po sériovom zariadení do Nextion sa zbierajú informácie, ktoré by inak vyžadovali prenos 16 správ.

Je pravda, že nie je vždy potrebné aktualizovať všetky správy, ale som si istý, že inak by sa stratilo viac času.

Prirodzene, každý bit obsiahnutý v celom čísle prijatom Arduinom, displej Nextion ho bude musieť priradiť k požadovanému atribútu.

To znamená, že kód musí byť napísaný na displeji Nextion, ale nie je dôvod ho vystrašiť: ak sa mi to podarí …

Potom je tu dvojitá výhoda: Arduino bude mať ľahší kód a bude sa menej zaoberať sériovou komunikáciou s Nextion.

Nextion po prijatí údajov v jednej správe ich použije oveľa rýchlejšie, ako keby čakalo 16 správ. Zapnutie alebo vypnutie 16 signálov bude teda takmer súčasné vzhľadom na najbežnejší režim, v ktorom medzi vykonaním príkazu pre prvú signalizáciu a príkazom pre poslednú signalizáciu uplynie čas pre neznámy počet správ.

Na displeji Nextion som tento systém vytvoril klasickým spôsobom, to znamená, že zakaždým, keď otočíte register „masky“, umožní vám preskúmať každý zo 16 bitov. Keď je skúmaný bit HIGH, signál spojený s týmto bitom sa rozsvieti na displeji a vypne sa, keď je bit LOW.

„Negatívnym“aspektom tohto systému je, že kód zapísaný na displeji Nextion sa dokumentuje menej pohodlne ako kód Arduino. Okrem toho hrozí, že kód Nextion bude rozptýlený po rôznych objektoch. Je potrebné dbať na to, aby ste ihneď zdokumentovali, čo robíte.

Pomocou programu Poznámkový blok ++ napíšem kód, ktorý potom skopírujem do objektu Nextion, ktorý je takmer výlučne na stránke tm0 na strane 0.

Syntax jazyka Nextion má mnoho obmedzení, ale dokáže ich prekonať alebo ich obísť s minimálnym úsilím a pokúsiť sa vidieť problémy z neobvyklých uhlov pohľadu.

Ako príklad uvádzam spôsob, akým Arduino zapisuje register, ktorý sa má prenášať, ktorý som napísal najzákladnejším možným spôsobom.

Krok 1: Ako sa prenáša register

V súbore ArduinoCode. PDF ukazujem celú svoju skicu. (Čítanie kódu tu dole nie je také jednoznačné.)

Tu dole chcem len ukázať, akým spôsobom Arduino odosiela 16 -bitový register do Nextion bez pomoci knižníc, ale rešpektuje syntax opísanú v programe ITEAD.

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

zrušiť NexUpd ()

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

{

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

SRSerial.print (InpReg); // prenos 16 zozbieraných bitov na displej Nextion

SRSerial.print (InpReg); // prenos 16 zozbieraných bitov na displej Nextion

SRSerial.write (koniec); // 255

SRSerial.write (koniec); // 255

SRSerial.write (koniec); // 255

}

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

Krok 2:.. Ale pred …

.. Ale predtým …
.. Ale predtým …

Kód samozrejme začína všetkými deklaráciami a nastavením ().

Vstupy sú INPUT_PULLUP, takže vstupné prepínače sú normálne otvorené a keď sú zatvorené, aplikujú na zodpovedajúci vstup GND.

(Toto je môj prvý Instructable a je mi ľúto, že vám môj kód ukážem týmto zlým spôsobom. Stiahnite si súbor ArduinoCode. PDF, že je to veľmi jasné.

Nechaj ma o tom hovoriť viac

Vyvinul som svoj vlastný spôsob, ako „povedať“displeju Nextion, čo musí robiť. MCU (v mojom prípade Arduino) zvyčajne odosiela správu pre každú variáciu, ktorá sa má použiť na atribút akéhokoľvek jednotlivého objektu. Táto metóda stráca veľa času na to, aby sa veci, ktoré nie sú vždy také naliehavé, načítavali nepretržite sériová linka. Zdá sa mi pohodlnejšie, že Arduino zhromažďuje do 16 bitových registrov informácie o atribútoch, ktoré sa majú líšiť v prípade Nextion. Asi každých 500 mS moje Arduino odoslalo do Nextion jednu správu obsahujúcu 16 bitov obsiahnutých v každom registri súčasne. V Nextion samozrejme potrebujeme kód, ktorý zvládne to, čo musí byť spustené. Táto distribúcia úlohy (a kódu) priniesla mnoho ďalších výhod. Zamyslite sa napríklad nad tým, ako prinútiť žmurknutie! S mojím prístupom je to jednoduché: trocha sa vložte do registra Arduino a odošlite ho do Nextion. Dvojité registre Nextion bolo možné aktualizovať z Arduina veľmi zriedka, pretože frekvencia blikania je nezávislá na komunikácii; frekvencia blikania závisí od objektu s časovačom do Nextion a môže bežať s minimálnou časovou základňou blízko 50 mS. Takže mojou metódou môžeme v Nextionu mrknúť svetlom na relatívne vysokej frekvencii (predpokladajme, že 2 Hz), aj keď moje Arduino odosiela správy každých 10 sekúnd, len pre extrémny príklad. To môže naznačovať opačný problém: ako postupovať, ak komunikácia zlyhá? Toto nie je predmetom tejto diskusie, ale tento problém som už vyriešil pomocou istého strážneho psa: jedného vo vnútri kódu Arduino, druhého do kódu Nextion.

Blikanie je regulované kódom Nextion, kde každé svetlo dodržiava svoje správne pravidlá: ZAPNUTÉ/VYPNUTÉ alebo ZELENÉ/ČERVENÉ alebo tiež zmena napísaného textu (alebo iného). O svojom projekte by som mohol povedať niekoľko ďalších vecí, ale radšej počkám na vaše otázky a potom pridám príliš veľa slov, ktoré nie je také ľahké preložiť tak dobre, ako by som urobil.

Krok 3: Úprava objektov Nextion

Úprava objektov Nextion
Úprava objektov Nextion

Tu je časť kódu, ktorý som napísal s Nextion Editorom na objekt tm0.

Neunikne nášmu upozorneniu, že so 16 bitmi prijatými od Arduina displej Nextion nielenže zapína a vypína signály. V tejto chvíli vynechávam vysvetlenia, aby som nekomplikoval porozumenie.

Som začiatočník, a preto je lepšie stiahnuť si stránku Nextion code. PDF a prečítať si zmätený kód nižšie. (Ospravedlňujem sa, toto je môj prvý pokyn)

Ak si želáte, môžete si stiahnuť kompletný kód „HMI“pre túto moju aplikáciu. Názov súboru tohto kódu je POW1225. HMI. Môže sa dostať do vášho displeja Nextion NX4024T032, ale aby ste to pochopili, musíte vplávať do mnohých objektov a pozrieť sa na kód v malom okne editora. Preto si myslím, že ľahšie bude vyzerať hlavný kód napísaný v súbore Nextion code. PDF

// Projekt POW1225. HMI 15. mája 2019

// vACC (va0) Akumulátor

// vINP (va1) Vstupný register xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Začnite

tm0.tim = 50 // tm0 Časová základňa 50 mS

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

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

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

{

tRDY.pco = MODRÁ // ČERVENÁ

} inak

{

tRDY.pco = SIVÁ // tmavá SIVÁ

}

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

vACC.val = vINP.val & 0x0002

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

{

tPWR.pco = ZELENÁ // svetlo ZELENÁ

tPON.txt = "ON" // ON

tPON.pco = ZELENÁ // svetlo ZELENÁ

} inak

{

tPWR.pco = SIVÁ // tmavá SIVÁ 33808

tPON.txt = "VYPNUTÉ" // VYPNUTÉ

tPON.pco = SIVÁ // tmavá ŠEDÁ 33808

}

// SUCHÉ ****************

vACC.val = vINP.val & 0x0004

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

{

tDRV.pco = MODRÁ // MODRÁ

tDRY.pco = MODRÁ // MODRÁ

} inak

{

tDRV.pco = SIVÁ // tmavá SIVÁ 33808

tDRY.pco = SIVÁ // tmavá ŠEDÁ 33808

}

// SPUŠŤ ****************

vACC.val = vINP.val & 0x0018

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

{

tRUN.bco = ČERVENÁ // MARCIA ČERVENÁ (zapnuté)

tRUN.pco = ČERNÝ // na ČIERNOM

tDIR.bco = ČERVENÁ // DIR ČERVENÁ

tDIR.pco = ČERNÝ // na ČIERNOM

} inak

{

tRUN.bco = 32768 // MARCIA GREY (vypnuté)

tRUN.pco = SIVÁ // na SIVEJ

tDIR.bco = 32768 // DIR dark GREEN 1024

tDIR.pco = SIVÁ // SIVÁ SIVÁ

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

}

// VLEVO ***************

vACC.val = vINP.val & 0x0008

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

{

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

}

// SPRÁVNY *************

vACC.val = vINP.val & 0x0010

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

{

tDIR.txt = ">>>" // SPRÁVNE

}

// OBA ***************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Test SPUSTI oba

{

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

}

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

vACC.val = vINP.val & 0x0020

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

{

tTEST.pco = BIELY // BIELY

tsw tTEST, 1 // Povoliť dotykové udalosti

} inak

{

tTEST.pco = SIVÁ // tmavošedá 33808

tsw tTEST, 0 // Zakáže dotykové udalosti

}

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

vACC.val = vINP.val & 0x0040

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

{

tFLT.pco = SIVÝ // PORUCHA chýba

}

ak (vACC.val! = 0)

{

tFLT.pco = ŽLTÉ // PORUCHA prítomná

}

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

vACC.val = vINP.val & 0x0080

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

{

tEME.pco = SIVÝ // EME chýba

}

ak (vACC.val! = 0)

{

tEME.pco = ČERVENÁ // EME prítomná

}

}

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

vACC.val = vINP.val & 0x0100

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

{

tFER.pco = ČIERNA // ČIERNA

tFER.bco = ZELENÁ // ZELENÁ

} inak

{

tFER.pco = SIVÁ // SIVÁ

tFER.bco = 672 // tmavozelená

}

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

Potvrdenie

Chcem sa poďakovať Gideonovi Rossouwvovi, pretože čítaním jeho pokynov som rýchlo získal časť svojich cieľov. Dakujem pan Gideon Rossouwv

Odporúča: