Πίνακας περιεχομένων:

Μια διαφορετική προσέγγιση με επόμενο: 3 βήματα
Μια διαφορετική προσέγγιση με επόμενο: 3 βήματα

Βίντεο: Μια διαφορετική προσέγγιση με επόμενο: 3 βήματα

Βίντεο: Μια διαφορετική προσέγγιση με επόμενο: 3 βήματα
Βίντεο: Μαθήματα μπουζουκιού,δρόμος χιτζάζ και ανάπτυξη συγχορδιών πολύ εύκολα,μια διαφορετική προσέγγιση. 2024, Ιούλιος
Anonim
Μια διαφορετική προσέγγιση με το Nextion
Μια διαφορετική προσέγγιση με το Nextion

Στο πρώτο μου έργο με το Arduino Nano συνδεδεμένο με την οθόνη αφής Nextion, είχα γράψει μια μακρά σειρά εντολών για να επικοινωνήσω στο Nextion μέσω της σειριακής θύρας και αυτό είναι αναπόφευκτο αν χρειαστεί να στείλουμε εντελώς ανεξάρτητες εντολές, σε τυχαίες στιγμές.

Πρέπει επίσης να παραδεχτώ ότι πέρασα περισσότερο χρόνο σε «μάχες» με τις Βιβλιοθήκες από οτιδήποτε άλλο. Έτσι άρχισα σταδιακά να δουλεύω εντελώς χωρίς τις βαριές βιβλιοθήκες του ITEAD.

Σύντομα συνειδητοποίησα ότι δεν είχα καμία επείγουσα ανάγκη να ανακοινώσω στον Nextion τις αλλαγές στα χαρακτηριστικά των οπτικών αντικειμένων, αλλά προτιμώ να περιμένω μέχρι να τα συλλέξω και να τα στείλω στο Nextion συνολικά, όταν έχω μια πλήρη ομάδα.

Θα προσπαθήσω να εξηγήσω καλύτερα τον εαυτό μου.

Όταν στο έργο μου που αποτελείται από 16 ενδείξεις κειμένου θέλω να ενεργοποιήσω ή να απενεργοποιήσω κάποιες από αυτές, το κάνω εκμεταλλευόμενος το χαρακτηριστικό «bco» που για ενεργοποίηση, περνά (για παράδειγμα) από σκούρο γκρι σε λευκό (εάν είναι ένα μαύρο ορθογώνιο) και αντίστροφα για απενεργοποίηση.

Στην εφαρμογή μου βρήκα άχρηστο να στέλνω 16 εντολές στη σειριακή θύρα σε 16 διαφορετικές στιγμές, μία για κάθε «bco» από τα 16 σήματα.

Προτιμώ το Arduino να συλλέγει ποια σήματα πρέπει να είναι "on" (HIGH) και ποια πρέπει να είναι "off" (LOW) σε έναν καταχωρητή 16 bit, όπου κάθε bit αντιστοιχεί σε ένα από τα 16 σήματα του Nextion.

Μετά την ενημέρωση κάθε δυαδικού ψηφίου του καταχωρητή, μεταβιβάζω την τιμή του στο Nextion, ένα μόνο μήνυμα που περιέχει συλλογικές πληροφορίες σχετικά με 16 στοιχεία.

Με αυτόν τον τρόπο η επικοινωνία από το Arduino και το Nextion μειώνεται σημαντικά επειδή σε αυτό το μόνο μήνυμα που μεταδίδεται στο σειριακό στο Nextion, συλλέγονται πληροφορίες που διαφορετικά θα απαιτούσαν τη μετάδοση 16 μηνυμάτων.

Είναι αλήθεια ότι δεν είναι πάντα απαραίτητο να ενημερώσετε όλες τις αναφορές, αλλά είμαι βέβαιος ότι διαφορετικά θα χάσει περισσότερο χρόνο.

Φυσικά, κάθε bit που περιέχεται στον ακέραιο αριθμό που λαμβάνει το Arduino, η οθόνη Nextion θα πρέπει να το συσχετίσει με το επιθυμητό χαρακτηριστικό.

Αυτό σημαίνει ότι ο κωδικός πρέπει να είναι γραμμένος στην οθόνη Nextion, αλλά δεν πρέπει να φοβάται: αν τα κατάφερα…

Στη συνέχεια, υπάρχει ένα διπλό πλεονέκτημα: το Arduino θα έχει έναν ελαφρύτερο κωδικό και θα ασχολείται λιγότερο με τη σειριακή επικοινωνία με το Nextion.

Το Nextion αφού λάβει τα δεδομένα σε ένα μόνο μήνυμα, θα τα χρησιμοποιήσει πολύ πιο γρήγορα από ό, τι αν περίμενε 16 μηνύματα. Η ενεργοποίηση ή απενεργοποίηση 16 σημάτων θα είναι επομένως σχεδόν ταυτόχρονη σε σχέση με την πιο συνηθισμένη λειτουργία, στην οποία ο χρόνος για έναν άγνωστο αριθμό μηνυμάτων μεσολαβεί μεταξύ της εκτέλεσης της εντολής για την πρώτη σηματοδότηση και της εντολής για την τελευταία σηματοδότηση.

Στην οθόνη Nextion δημιούργησα αυτό το σύστημα με τον κλασικό τρόπο, δηλαδή, η περιστροφή ενός καταχωρητή «μάσκας» κάθε φορά σας επιτρέπει να εξετάσετε καθένα από τα 16 bit. Όταν το bit που εξετάζεται είναι Υ HIGHΗΛΟ, το σήμα που σχετίζεται με αυτό το bit ανάβει στην οθόνη και απενεργοποιείται όταν το bit είναι LOW.

Η «αρνητική» πλευρά αυτού του συστήματος είναι ότι ο κώδικας που γράφεται στην οθόνη Nextion είναι λιγότερο βολικός για τεκμηρίωση από τον κώδικα Arduino. Επιπλέον, ο κώδικας Nextion κινδυνεύει να διασκορπιστεί σε διάφορα αντικείμενα. Πρέπει να ληφθεί μέριμνα για να τεκμηριωθεί αυτό που κάνετε αμέσως.

Χρησιμοποιώ το Σημειωματάριο ++ για να γράψω τον κώδικα τον οποίο στη συνέχεια αντιγράφω στο αντικείμενο Nextion που βρίσκεται σχεδόν αποκλειστικά στο tm0 της σελίδας 0.

Η σύνταξη της γλώσσας Nextion έχει πολλούς περιορισμούς, αλλά καταφέρνει να τους ξεπεράσει ή να τους ξεπεράσει με ελάχιστο κόπο και να προσπαθήσει να δει τα προβλήματα από άποψη που είναι επίσης ασυνήθιστα.

Για παράδειγμα, αναφέρω τον τρόπο με τον οποίο το Arduino γράφει το μητρώο προς μετάδοση, γραμμένο από εμένα με τον πιο στοιχειώδη δυνατό τρόπο.

Βήμα 1: Πώς διαβιβάζεται το μητρώο

Στο αρχείο ArduinoCode. PDF εμφανίζω όλο το σκίτσο μου. (Διαβάζοντας τον κώδικα εδώ κάτω δεν είναι τόσο σαφές)

Εδώ κάτω, θέλω μόνο να δείξω με ποιον τρόπο το Arduino στέλνει το 16 bit Register στο Nextion, χωρίς τη βοήθεια των βιβλιοθηκών, αλλά τηρώντας τη σύνταξη που περιγράφει το ITEAD.

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

άκυρο NexUpd ()

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

{

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

SRSerial.print (InpReg); // μεταδώστε τα 16 συγκεντρωμένα bits στην Nextion Display

SRSerial.print (InpReg); // μεταδώστε τα 16 συγκεντρωμένα bits στην Nextion Display

SRSerial.write (τερματικό); // 255

SRSerial.write (τερματικό); // 255

SRSerial.write (τερματικό); // 255

}

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

Βήμα 2:.. Αλλά πριν…

.. Αλλά πριν …
.. Αλλά πριν …

Φυσικά ο κώδικας ξεκινά με όλες τις δηλώσεις και το setup ().

Οι είσοδοι είναι INPUT_PULLUP, επομένως οι διακόπτες εισόδου είναι κανονικά ανοιχτοί και όταν κλείνουν, εφαρμόζουν το GND στην αντίστοιχη είσοδο.

(Αυτό είναι το πρώτο μου πρόγραμμα με οδηγίες και λυπάμαι που σας παρουσιάζω τον κωδικό μου με αυτόν τον κακό τρόπο. Κατεβάστε το αρχείο ArduinoCode. PDF ότι είναι πολύ σαφές.

Επιτρέψτε μου να μιλήσω περισσότερο για αυτό

Έχω αναπτύξει τον δικό μου τρόπο να "πω" στην οθόνη Nextion τι πρέπει να κάνει. Συνήθως το MCU (το Arduino στην περίπτωσή μου) στέλνει ένα μήνυμα για κάθε παραλλαγή να ισχύει για το χαρακτηριστικό οποιουδήποτε αντικειμένου. Αυτή η μέθοδος σπαταλά πολύ χρόνο για να κάνει πράγματα όχι πάντα τόσο επείγοντα για τη συνεχή φόρτωση της σειριακής γραμμής. Βρήκα πιο βολικό ότι το Arduino συλλέγει σε καταχωρητές 16 bit τις πληροφορίες σχετικά με τα χαρακτηριστικά που διαφέρουν στο Nextion. Περίπου κάθε 500 mS, το Arduino μου στέλνει στο Nextion ένα μήνυμα που περιέχει τα 16 bit που περιέχονται σε κάθε καταχωρητή κάθε φορά. Προφανώς στο Nextion χρειαζόμαστε τον κώδικα που χειρίζεται αυτό που πρέπει να εκτελεστεί. Αυτή η κατανομή της εργασίας (και του κώδικα) ας πάρει πολλά άλλα πλεονεκτήματα. Για παράδειγμα, σκεφτείτε πώς να κάνετε το φως να αναβοσβήνει! Με την προσέγγισή μου είναι εύκολο: μπείτε λίγο στο μητρώο Arduino και στείλτε το στο Nextion. Οι δίδυμοι καταχωρητές Nextion θα μπορούσαν να ενημερώνονται από το Arduino πολύ σπάνια, επειδή η συχνότητα αναλαμπής είναι ανεξάρτητη από την επικοινωνία. η συχνότητα αναλαμπής εξαρτάται από ένα αντικείμενο Χρονοδιακόπτη στο Nextion και μπορεί να τρέξει με την ελάχιστη χρονική βάση κοντά στα 50 mS. Έτσι, με τη μέθοδό μου μπορούμε να αναβοσβήνουμε ένα φως στο Nextion σε συχνότητα σχετικά υψηλή (ας υποθέσουμε 2 Hz), ακόμη και αν το Arduino μου στέλνει μηνύματα κάθε 10 δευτερόλεπτα, μόνο για ένα ακραίο παράδειγμα. Αυτό μπορεί να προτείνει το αντίθετο πρόβλημα: πώς να το κάνετε εάν η επικοινωνία αποτύχει; Αυτό δεν είναι το αντικείμενο αυτής της συζήτησης, αλλά έχω ήδη λύσει αυτό το πρόβλημα με ένα είδος Watch Dog: ένα μέσα στον κώδικα Arduino, ένα άλλο στον κώδικα Nextion.

Το αναβοσβήνει ρυθμίζεται από τον κώδικα Nextion, όπου κάθε φως ακολουθεί τους κατάλληλους κανόνες του: ON/OFF ή GREEN/RED ή επίσης αλλάζει το γραμμένο μέσα (ή άλλο περισσότερο). Θα μπορούσα να πω κάποια άλλα πράγματα για το έργο μου, αλλά προτιμώ να περιμένω τις ερωτήσεις σας, πριν προσθέσω πάρα πολλές λέξεις που δεν είναι τόσο εύκολο για μένα να μεταφράσω καλά όπως θα ήθελα.

Βήμα 3: Επεξεργασία των αντικειμένων Nextion

Επεξεργασία των αντικειμένων Nextion
Επεξεργασία των αντικειμένων Nextion

Εδώ είναι ένα μέρος του κώδικα που έγραψα με το Nextion Editor στο αντικείμενο tm0.

Δεν μας διαφεύγει ότι με τα 16 bits που λαμβάνονται από το Arduino, η οθόνη Nextion δεν ενεργοποιεί και απενεργοποιεί απλώς τα σήματα. Προς το παρόν παραλείπω τις εξηγήσεις για να μην περιπλέξω την κατανόηση.

Είμαι αρχάριος και επομένως είναι καλύτερο να κατεβάσετε τον κώδικα Nextion. Αντί για να διαβάσετε τον μπερδεμένο κώδικα εδώ. (Λυπάμαι που είναι η πρώτη μου διδάσκουσα)

Εάν επιθυμείτε, μπορείτε να κατεβάσετε τον πλήρη κωδικό "HMI" για αυτήν την εφαρμογή μου. Το όνομα αρχείου αυτού του κωδικού είναι POW1225. HMI. Μπορεί να τρέξει στην οθόνη Nextion NX4024T032, αλλά για να το καταλάβετε πρέπει να κολυμπήσετε σε πολλά αντικείμενα και να δείτε τον κώδικα μέσα στο μικρό παράθυρο του προγράμματος επεξεργασίας. Έτσι νομίζω ότι θα είναι πιο εύκολο να δούμε τον κύριο κώδικα, γραμμένο στο αρχείο Nextion code. PDF

// Έργο POW1225. HMI 15 Μαΐου 2019

// vACC (va0) Συσσωρευτής

// vINP (va1) Μητρώο εισόδου xxxx xxxx xxxx xxxx

tm0.en = 1 // tm0 Έναρξη

tm0.tim = 50 // tm0 Βάση χρόνου 50 mS

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

vACC.val = vINP.val & 0x0001 // Μάσκα

εάν (vACC.val! = 0) // Δοκιμή RDY

{

tRDY.pco = ΜΠΛΕ // ΚΟΚΚΙΝΟ

}αλλού

{

tRDY.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ

}

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

vACC.val = vINP.val & 0x0002

εάν (vACC.val! = 0) // Δοκιμή PWR

{

tPWR.pco = ΠΡΑΣΙΝΟ // ανοιχτο ΠΡΑΣΙΝΟ

tPON.txt = "ON" // ON

tPON.pco = ΠΡΑΣΙΝΟ // ανοιχτο ΠΡΑΣΙΝΟ

}αλλού

{

tPWR.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ 33808

tPON.txt = "OFF" // OFF

tPON.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ 33808

}

// ΞΗΡΟΣ ***************

vACC.val = vINP.val & 0x0004

εάν (vACC.val! = 0) // Δοκιμή ΣΤΕΓΝΗΣ

{

tDRV.pco = ΜΠΛΕ // ΜΠΛΕ

tDRY.pco = ΜΠΛΕ // ΜΠΛΕ

}αλλού

{

tDRV.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ 33808

tDRY.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ 33808

}

// ΤΡΕΞΙΜΟ ***************

vACC.val = vINP.val & 0x0018

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

{

tRUN.bco = RED // MARCIA RED (on)

tRUN.pco = ΜΑΥΡΟ // στο ΜΑΥΡΟ

tDIR.bco = RED // DIR RED

tDIR.pco = ΜΑΥΡΟ // στο ΜΑΥΡΟ

}αλλού

{

tRUN.bco = 32768 // MARCIA GRAY (απενεργοποιημένο)

tRUN.pco = ΓΚΡΙ // σε ΓΚΡΙ

tDIR.bco = 32768 // DIR σκούρο ΠΡΑΣΙΝΟ 1024

tDIR.pco = ΓΚΡΙ // ΝΤΡΙ ΓΚΡΙ

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

}

// ΑΡΙΣΤΕΡΑ **************

vACC.val = vINP.val & 0x0008

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

{

tDIR.txt = "<<<" // DIR ΑΡΙΣΤΕΡΑ

}

// ΣΩΣΤΑ *************

vACC.val = vINP.val & 0x0010

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

{

tDIR.txt = ">>>" // DIR ΔΕΞΙΑ

}

// ΚΑΙ ΤΑ ΔΥΟ **************

vACC.val = vINP.val & 0x0018

if (vACC.val == 24) // Test RUN και τα δύο

{

tDIR.txt = ">>! <<" // ΝΤΥΡΑ ΚΑΙ ΤΑ ΔΥΟ

}

// ΔΟΚΙΜΗ **************

vACC.val = vINP.val & 0x0020

εάν (vACC.val! = 0) // ΔΟΚΙΜΗ ΔΟΚΙΜΗΣ

{

tTEST.pco = ΛΕΥΚΟ // ΛΕΥΚΟ

tsw tTEST, 1 // Ενεργοποίηση συμβάντων αφής

}αλλού

{

tTEST.pco = ΓΚΡΙ // σκούρο ΓΚΡΙ 33808

tsw tTEST, 0 // Απενεργοποίηση συμβάντων αφής

}

// ΒΛΑΒΗ *************

vACC.val = vINP.val & 0x0040

εάν (vACC.val == 0) // Δοκιμή Βλάβης

{

tFLT.pco = ΓΚΡΙ // ΒΛΑΒΟΣ απουσιάζει

}

εάν (vACC.val! = 0)

{

tFLT.pco = ΚΙΤΡΙΝΟ // ΒΛΑΒΟΣ παρόν

}

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

vACC.val = vINP.val & 0x0080

if (vACC.val == 0) // Δοκιμή EME

{

tEME.pco = ΓΚΡΙ // Η ΕΜΕ απουσιάζει

}

εάν (vACC.val! = 0)

{

tEME.pco = RED // EME παρόν

}

}

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

vACC.val = vINP.val & 0x0100

εάν (vACC.val! = 0) // Δοκιμή FERMO

{

tFER.pco = ΜΑΥΡΟ // ΜΑΥΡΟ

tFER.bco = ΠΡΑΣΙΝΟ // ΠΡΑΣΙΝΟ

}αλλού

{

tFER.pco = ΓΚΡΙ // ΓΚΡΙ

tFER.bco = 672 // σκούρο ΠΡΑΣΙΝΟ

}

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

Αναγνώριση

Θέλω να δώσω τις ευχαριστίες μου στον Gideon Rossouwv γιατί διαβάζοντας το Instructables του έχω κερδίσει γρήγορα μέρος των στόχων μου. Ευχαριστώ κ. Γκίντεον Ροσούββ

Συνιστάται: