Mündəricat:

Nextion ilə fərqli bir yanaşma: 3 addım
Nextion ilə fərqli bir yanaşma: 3 addım

Video: Nextion ilə fərqli bir yanaşma: 3 addım

Video: Nextion ilə fərqli bir yanaşma: 3 addım
Video: ESP8266 Беспроводной ЧМИ Nextion || Внешний ПЛК Arduino 2024, Iyul
Anonim
Nextion ilə fərqli bir yanaşma
Nextion ilə fərqli bir yanaşma

Nextion toxunma ekranına qoşulan Arduino Nano ilə ilk layihəmdə, Nextion -a serial portu vasitəsi ilə çatdırılması üçün uzun bir sıra əmrlər yazmışdım və təsadüfi anlarda tamamilə müstəqil əmrlər göndərməli olsaq bu qaçılmazdır.

Etiraf etməliyəm ki, kitabxanalarla hər şeydən çox 'döyüşmək' üçün daha çox vaxt sərf etmişəm. Beləliklə, tədricən ağır ITEAD kitabxanaları olmadan tamamilə işə başladım.

Tezliklə başa düşdüm ki, vizual obyektlərin xüsusiyyətlərindəki dəyişiklikləri Nextiona çatdırmaq üçün heç bir təxirəsalınmazlığım yoxdur, amma tam bir qrup əldə edəndə onları toplayaraq bir bütün olaraq Nextiona göndərənə qədər gözləməyi üstün tuturam.

Özümü daha yaxşı izah etməyə çalışacağam.

16 mətn işarəsindən ibarət layihəmdə bəzilərini yandırmaq və ya söndürmək istədikdə bunu açmaq üçün (məsələn) tünd bozdan ağa (məsələn qara düzbucaqlı) və əksinə söndürmək üçün.

Tətbiqimdə, 16 siqnalın hər 'bco' si üçün 16 fərqli anda 16 əmri serial porta göndərməyin faydasız olduğunu gördüm.

Bunun əvəzinə Arduinonun, hər bitin Nextionun 16 siqnalından birinə uyğun gəldiyi 16 bitlik bir qeyddə hansı siqnalların 'yandır' (YÜKSƏK), hansı siqnalların 'sönük' (LOW) olması lazım olduğunu toplamasını üstün tuturam.

Reyestrin hər bitini yenilədikdən sonra onun dəyərini 16 elementlə bağlı kollektiv məlumatı olan tək bir mesaj olan Nextiona ötürürəm.

Bu şəkildə Arduino və Nextiondan olan əlaqə əhəmiyyətli dərəcədə azalır, çünki serialda Nextiona ötürülən tək mesajda, əks halda 16 mesajın ötürülməsini tələb edəcək məlumatlar toplanır.

Düzdür, bütün hesabatları yeniləmək həmişə lazım deyil, amma əminəm ki, əks halda bunu etmək daha çox vaxt itirəcək.

Təbii ki, Arduino tərəfindən alınan tam ədəddə olan hər bir bit, Nextion ekranında onu istənilən atributla əlaqələndirməli olacaq.

Bu o deməkdir ki, Nextion ekranında kod yazılmalıdır, amma qorxmaq lazım deyil: əgər uğur qazansam …

Ardından ikiqat üstünlük var: Arduino daha yüngül bir koda sahib olacaq və Nextion ilə serial ünsiyyəti ilə daha az məşğul olacaq.

Nextion, məlumatları tək bir mesajda aldıqdan sonra onları 16 mesaj gözləməkdən daha sürətli istifadə edəcək. 16 siqnalın açılması və ya söndürülməsi, ilk siqnal əmrinin yerinə yetirilməsi ilə son siqnal əmri arasında bilinməyən sayda mesajın vaxtının keçdiyi ən adi rejimə görə demək olar ki, eyni vaxtda olacaq.

Nextion ekranında bu sistemi klassik şəkildə yaratdım, yəni hər dəfə 'maska' qeydini çevirmək 16 bitin hər birini araşdırmağa imkan verir. Müayinə olunan bit YÜKSƏK olduqda, həmin bitlə əlaqəli siqnal ekranda yanır və bir az YÜKSƏN olduqda sönür.

Bu sistemin 'mənfi' tərəfi Nextion ekranında yazılan kodun sənədləşdirilməsinin Arduino kodundan daha az rahat olmasıdır. Bundan əlavə, Nextion kodu müxtəlif obyektlərə səpələnmək riski daşıyır. Etdiyiniz işi dərhal sənədləşdirmək üçün diqqətli olmalısınız.

Notepad ++ istifadə edərək, demək olar ki, yalnız 0 səhifənin tm0 -də olan Nextion obyektinə kopyaladığım kodu yazmaq üçün istifadə edirəm.

Nextion dilinin sintaksisinin çoxsaylı məhdudiyyətləri var, ancaq bunları aşmağı və ya minimum səylə ətrafdan çıxmağı və problemləri qeyri -adi olan nöqteyi -nəzərdən görməyə çalışır.

Nümunə olaraq, Arduinonun mümkün olan ən sadə şəkildə yazdığım reyestri necə yazdığını bildirirəm.

Addım 1: Qeydiyyat Necə Verilir

ArduinoCode. PDF faylında bütün eskizlərimi göstərirəm. (Kodu oxuyanda o qədər də aydın deyil)

Aşağıda, Arduinonun 16 bitlik Qeydiyyatı kitabxanaların köməyi olmadan Nextion -a hansı yolla göndərdiyini göstərmək istəyirəm, ancaq ITEAD -in təsvir etdiyi sintaksisə hörmətlə yanaşıram.

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

boş NexUpd ()

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

{

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

SRSerial.print (InpReg); // toplanan 16 biti Nextion Display -ə ötürür

SRSerial.print (InpReg); // toplanan 16 biti Nextion Display -ə ötürür

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

SRSerial.write (termin); // 255

}

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

Addım 2:.. Amma əvvəl …

.. Amma əvvəl…
.. Amma əvvəl…

Əlbəttə ki, kod bütün bəyannamələr və quraşdırma ilə başlayır ().

Girişlər INPUT_PULLUP -dur, buna görə giriş açarları normal olaraq açıqdır və bağlandıqda müxbir girişə GND tətbiq edirlər.

(Bu mənim ilk Təlimatımdır və kodumu sizə bu pis şəkildə göstərdiyim üçün üzr istəyirəm. Çox aydın olduğu üçün ArduinoCode. PDF faylını yükləyin.

İcazə verin daha çox danışım

Nextion ekranına nə etməli olduğunu izah etmək üçün öz yolumu hazırlamışam. Adətən MCU (mənim vəziyyətimdə Arduino), hər bir dəyişikliyə hər hansı bir obyektin atributuna tətbiq etmək üçün bir mesaj göndərir. Arduinonun Nextionda dəyişəcək atributlar haqqında məlumatları 16 bitlik qeydlərə yığmasını daha əlverişli hesab etdim. Təxminən hər 500 mS -də mənim Arduino Nextiona hər bir qeyddə 16 bit olan bir mesaj göndərir. Aydındır ki, Nextion -da icra edilməli olanı idarə edən koda ehtiyacımız var. Tapşırığın (və kodun) bu cür paylanması bir çox digər üstünlüklər əldə etməyə imkan verir. Məsələn, göz qırpımını necə işıqlandıracağınızı düşünün! Mənim yanaşmamla bu çox asandır: bir az Arduino reyestrinə daxil edin və Nextion -a göndərin. Nextion əkiz qeydləri Arduinodan çox nadir hallarda yenilənə bilər, çünki göz qırpma tezliyi ünsiyyətdən asılı deyil; yanıb -sönmə tezliyi bir Taymer obyektindən Nextiona bağlıdır və 50 mS -ə yaxın minimum vaxt bazası ilə işləyə bilər. Mənim metodumla, Arduino hər 10 saniyədə bir mesaj göndərsə belə, Nextion -da nisbətən yüksək tezlikdə bir işıq yandıra bilərik (məsələn, 2 Hz). Bu əks problemi göstərə bilər: Ünsiyyət uğursuz olarsa necə etməli? Bu müzakirə mövzusu deyil, amma bu problemi bir növ Watch Dog ilə həll etdim: biri Arduino Kodunun içərisində, digəri Nextion kodunda.

Yanıp sönmə, Nextion kodu ilə tənzimlənir, burada hər işıq öz qaydalarına riayət edir: ON/OFF və ya GREEN/QIRMIZI və ya içindəki yazını dəyişdirmək (və ya daha çox). Layihəmlə bağlı başqa şeylər deyə bilərdim, amma çoxlu sözlər əlavə etməzdən əvvəl suallarınızı gözləməyi üstün tuturam, mənim üçün yaxşı tərcümə etmək.

Addım 3: Nextion obyektlərini redaktə edin

Nextion obyektlərinin redaktəsi
Nextion obyektlərinin redaktəsi

Nextion Editor ilə tm0 obyektində yazdığım kodun bir hissəsidir.

Arduinodan alınan 16 bitlə Nextion displeyinin siqnalları açıb söndürməməsi diqqətimizdən yayınmır. Hal -hazırda başa düşməyi çətinləşdirməmək üçün izahları buraxıram.

Mən bir başlanğıcam və buna görə də qarışıq kodu aşağıda oxumaq üçün Nextion code. PDF səhifəsini yükləmək daha yaxşıdır. (Üzr istəyirəm bu mənim ilk təlimatımdır)

İstəyirsinizsə, bunun üçün tətbiqimin tam kodunu "HMI" yükləyə bilərsiniz. Bu kodun adı POW1225. HMI -dir. Nextion ekranınıza NX4024T032 daxil ola bilər, ancaq bunu başa düşmək üçün bir çox obyektə girib redaktorun kiçik pəncərəsindəki kodu axtarmalısınız. Buna görə Nextion code. PDF faylında yazılmış əsas kodu axtarmağın daha asan olacağını düşünürəm

// Layihə POW1225. HMI 15 May 2019

// vACC (va0) Akkumulyator

// vINP (va1) Giriş Qeydiyyatı xxxx xxxx xxxx xxxx

tm0.az = 1 // tm0 Başla

tm0.tim = 50 // tm0 Zaman bazası 50 mS

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

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

əgər (vACC.val! = 0) // RDY test edin

{

tRDY.pco = MAVİ // QIRMIZI

} başqa

{

tRDY.pco = GREY // tünd boz

}

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

vACC.val = vINP.val & 0x0002

if (vACC.val! = 0) // PWR test edin

{

tPWR.pco = YAŞIL // açıq YAŞIL

tPON.txt = "ON" // ON

tPON.pco = YAŞIL // açıq YAŞIL

} başqa

{

tPWR.pco = GRAY // tünd boz 34808

tPON.txt = "OFF" // OFF

tPON.pco = GRAY // tünd boz 34808

}

// QURU ***************

vACC.val = vINP.val & 0x0004

if (vACC.val! = 0) // DRY test edin

{

tDRV.pco = MAVİ // MAVİ

tDRY.pco = MAVİ // MAVİ

} başqa

{

tDRV.pco = GRAY // tünd boz 34808

tDRY.pco = GRAY // tünd boz 34808

}

// QALDIR ***************

vACC.val = vINP.val & 0x0018

əgər (vACC.val! = 0) // Test RUN

{

tRUN.bco = QIRMIZI // MARCIA QIRMIZI (aktiv)

tRUN.pco = SİYAH / QARADA

tDIR.bco = QIRMIZI // DIR QIRMIZI

tDIR.pco = SİYAH / QARADA

} başqa

{

tRUN.bco = 32768 // MARCIA GRAY (off)

tRUN.pco = GRAY // GRAY -da

tDIR.bco = 32768 // DIR qaranlıq GREEN 1024

tDIR.pco = GREY // DIR GRAY

tDIR.txt = "---" // DUR

}

// SOL **************

vACC.val = vINP.val & 0x0008

if (vACC.val! = 0) // Sağa Çalıştır Test edin

{

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

}

// SAĞ *************

vACC.val = vINP.val & 0x0010

if (vACC.val! = 0) // Sola ÇALIŞTIR

{

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

}

// İKİSİ **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Hər ikisini də sınayın

{

tDIR.txt = ">>! <<" // İKİSİ

}

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

vACC.val = vINP.val & 0x0020

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

{

tTEST.pco = AĞ // AĞ

tsw tTEST, 1 // Toxunma hadisələrini aktiv edin

} başqa

{

tTEST.pco = GRAY // tünd boz 34808

tsw tTEST, 0 // Toxunma hadisələrini deaktiv edin

}

// HATA *************

vACC.val = vINP.val & 0x0040

if (vACC.val == 0) // Xəta testi

{

tFLT.pco = GRAY // FAULT yoxdur

}

əgər (vACC.val! = 0)

{

tFLT.pco = SARI // HATA mövcuddur

}

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

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // EME test edin

{

tEME.pco = GRAY // EME yoxdur

}

əgər (vACC.val! = 0)

{

tEME.pco = QIRMIZI // EME mövcuddur

}

}

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

vACC.val = vINP.val & 0x0100

if (vACC.val! = 0) // FERMO test edin

{

tFER.pco = SİYAH / SİYAH

tFER.bco = YAŞIL // YAŞIL

} başqa

{

tFER.pco = GRİ // GRİ

tFER.bco = 672 // qaranlıq YAŞIL

}

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

Təsdiq

Gideon Rossouwv -a öz təşəkkürümü bildirmək istəyirəm, çünki onun Təlimatlarını oxumaqla məqsədlərimin bir hissəsini tez qazandım. Təşəkkür edirəm cənab. Gideon Rossouwv

Tövsiyə: