Βασικές λειτουργίες σε μια μονάδα wifi ESP8266 από το Arduino

Βασικές λειτουργίες σε μια μονάδα wifi ESP8266 από το Arduino

Βασικές λειτουργίες σε μια μονάδα wifi ESP8266 από το Arduino

Όταν Espressif κυκλοφόρησε τις πρώτες ενότητες στην αγορά Wi-Fi με το ενσωματωμένο ESP8266 και firmware για να το χειριστούμε χρησιμοποιώντας εντολές AT, αυτό που μας ενδιέφερε οι χρήστες ήταν η ενσωμάτωσή του σε συγκροτήματα με μικροελεγκτές και τα προβλήματα περιορίστηκαν στη γνώση του (πρώην) σκοτεινού Πίνακας εντολών ESP8266 AT, ανάγκες σίτισης ή Ενημέρωση υλικολογισμικού ESP8266.

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

    Στη συνέχεια έφτασαν γρήγορα εναλλακτικές για να προγραμματίσουν το ESP8266 και υλοποιήσεις λειτουργικών μονάδων Wi-Fi πολύ διαφορετικών μορφών που προκάλεσαν άλλες ανησυχίες: ποια μονάδα wifi ESP8266 να επιλέξετε ανάλογα με το εύρος των διαφορετικών κεραιών (συμπεριλαμβανομένων των εξωτερικών) ή τη φυσική ενσωμάτωση αυτών των νέων μονάδων στις συναρμολογήσεις μας.

    Σίγουρα, λόγω όλων αυτών των αλλαγών, μπορεί να μην έχει δοθεί έμφαση στις πιο βασικές πτυχές, στην πιο βασική διαχείριση του Μονάδα wifi ESP8266. Παρόλο πολικότητα.εσ Μπορείτε να βρείτε πληροφορίες σχετικά με τη χρήση του ESP8266 και υπάρχουν ορισμένες εφαρμογές που προορίζονται να εξηγήσουν με γενικό τρόπο τη λειτουργία του Μονάδα wifi ESP8266 χρησιμοποιώντας εντολές AT, ειδικά στο άρθρο σχετικά βιβλιοθήκη για να κάνετε ερωτήματα HTTP από το Arduino με τη μονάδα wifi ESP8266, οι εντυπώσεις των αναγνωστών υποδηλώνουν ότι θα ήταν χρήσιμο να προσθέσετε μερικές ακόμη βασικές πληροφορίες για να βοηθήσετε τους χρήστες του ESP8266 να πραγματοποιήσουν τις δικές τους υλοποιήσεις.

    Συζητήστε τις βασικές λειτουργίες για να εργαστείτε με το ESP8266 και η πρόταση γενικών λύσεων είναι ένας στόχος πολλών πολύ διαφορετικών μερών. Για να βοηθήσετε στην παρακολούθηση του περιεχομένου του άρθρου, το ακόλουθο ευρετήριο μπορεί να χρησιμεύσει ως οδηγός:

    Ελέγξτε τη μονάδα wifi ESP8266 από τον υπολογιστή μέσω της σειριακής θύρας

    Από ένα πιάτο Arduino και χρησιμοποιώντας το δικό σας IDE είναι δυνατή η παρακολούθηση της λειτουργίας του α Μονάδα wifi ESP8266, Στείλε το Εντολές ESP8266 AT και δείτε την απάντηση αλλά είναι πολύ πιο βολικό να το κάνετε από υπολογιστή με εφαρμογή τύπου τερματικού.

    Χρησιμοποιώντας το CuteCom για να δοκιμάσετε τη μονάδα wifi ESP8266 μέσω της σειριακής θύρας

    Ανάλογα με ποιο ταμπλό Arduino χρησιμοποιείται, μόνο μία σειριακή θύρα υλικού μπορεί να είναι διαθέσιμη, γεγονός που προσθέτει μια μικρή ταλαιπωρία στην αποστολή και τη λήψη. Η αλλαγή της ταχύτητας επικοινωνίας είναι πολύ πιο άνετη σε μια εφαρμογή σειριακής επικοινωνίας από υπολογιστή και ορισμένες μητρικές πλακέτες. Arduino (και σε ορισμένες περιπτώσεις) δεν υποστηρίζουν καλά τις υψηλότερες ταχύτητες σειριακής επικοινωνίας, ειδικά το 115200 baud, που είναι η προεπιλεγμένη ταχύτητα των τελευταίων εκδόσεων του firmware.

    Περίπου Τι πρόγραμμα να χρησιμοποιήσετε για την παρακολούθηση ESP8266 χρησιμοποιώντας τη σειριακή θύρα, υπάρχουν πολλά για να διαλέξετε ανάλογα με τις ανάγκες και τις προτιμήσεις. τον τελευταίο καιρό χρησιμοποιώ περισσότερο το κλασικό CuteCom (αυτό στο στιγμιότυπο οθόνης παραπάνω) γιατί είναι πολύ άνετο για μένα να επαναλάβω ορισμένα ESP8266 μονάδα wifi AT παραγγελίες σε δοκιμές έργου.

    Ορισμένες συστάσεις έχουν ήδη δοθεί εδώ για προγράμματα που λειτουργούν ως σειριακή κονσόλα. Για παράδειγμα, όταν μιλάμε για PuTTY για τον έλεγχο σειριακών συσκευών UART από τον υπολογιστή. PuTTYΕκτός από εξαιρετική εφαρμογή, είναι διαθέσιμη για τα περισσότερα λειτουργικά συστήματα επιτραπέζιων υπολογιστών. Επιπλέον, όπως PuTTY μπορεί να χρησιμοποιηθεί για να λειτουργήσει ως κονσόλα τόσο με τη σειριακή θύρα όσο και με το Οικογένεια πρωτοκόλλων Διαδικτύου (TCP/IP), συμπεριλαμβανομένων αυτών που λειτουργούν TLS, γίνεται ένα κοινό εργαλείο που ξεπληρώνει περισσότερο από τον (λίγο) χρόνο που αφιερώθηκε για τη διαμόρφωση του και την εξοικείωση με τη χρήση του.

    Χρήση PuTTY για δοκιμή της μονάδας wifi ESP8266 μέσω της σειριακής θύρας

    Εκτός από το λογισμικό σειριακών επικοινωνιών, για να συνδέσετε το Μονάδα wifi ESP8266 στο λιμάνι USB Ένας υπολογιστής απαιτεί επίσης μετατροπέα USB σε σειρές TTL. Όπως και στην περίπτωση του λογισμικού, υπάρχουν αρκετές εκδόσεις, από τις οποίες χρησιμοποιούνται μόνο για τη μετατροπή της θύρας USB σε σειριακή θύρα TTL (τα οποία μπορούν να ληφθούν από ένα Ευρώ) σε αυτά που μπορούν να μιμηθούν διαφορετικά πρωτόκολλα (όπως π.χ SPI o I2C).

    Ακριβώς όπως ένα πρόγραμμα που λειτουργεί ως σειριακή κονσόλα, το υλικό για την επικοινωνία του υπολογιστή μέσω USB με ένα λογικό κύκλωμα (όχι μόνο το ESP8266) θα είναι ένα κοινό εργαλείο στην εργασία ενός μικροελεγχόμενου προγραμματιστή εφαρμογών, αξίζει να το έχετε στην εργαλειοθήκη το συντομότερο δυνατό και να εργαστείτε μαζί του Μονάδα wifi ESP8266 Είναι μια εξαιρετική ευκαιρία να αποκτήσετε ένα.

    Υλικό για σειριακές επικοινωνίες USB UART για την παρακολούθηση της μονάδας wifi ESP8266

    Ο μετατροπέας USB a UART TTL Μπορεί επίσης να χρησιμοποιηθεί για την παρακολούθηση της συμπεριφοράς ενός κυκλώματος που χρησιμοποιεί το ESP8266, για να γίνει αυτό, οι έξοδοι που θέλετε να παρακολουθήσετε συνδέονται σε σειρά στην είσοδο δεδομένων (RX) του μετατροπέα με μια γρήγορη δίοδο (η 1N4148, για παράδειγμα) και μια αντίσταση (2K2, για παράδειγμα) παράλληλα μεταξύ τους. Μια τέτοια εγκατάσταση λειτουργεί σαν σειριακός ανιχνευτής υλικού.

    Παράδειγμα Sniffer για ESP8266 συνδεδεμένο στο Arduino χρησιμοποιώντας μετατροπέα USB UART TTL

    Αν και το sniffer στην παραπάνω εικόνα είναι σίγουρα υποτυπώδες (μεταξύ άλλων δεν έχει ρυθμιστικό) επαρκεί για την παρακολούθηση της λειτουργίας ενός συγκροτήματος με Arduino και ESP8266.

    Αφαιρώντας το sniffer από το προηγούμενο σχήμα, το σχηματικό που δείχνει πώς να συνδέσετε ένα Μονάδα wifi ESP8266 σε ένα πιάτο Arduino. Εκτός από την τροφοδοσία του στα 3V3, ο ακροδέκτης επαναφοράς και ο ακροδέκτης ενεργοποίησης του ενσωματωμένου πρέπει να είναι συνδεδεμένοι σε υψηλό επίπεδο (ενεργοποίηση). Φυσικά, η ακίδα RX του ενός πρέπει να συνδεθεί στο TX του άλλου.

    Για απλοποίηση του προηγούμενου διαγράμματος, έχει αναπαρασταθεί μια πλάκα Arduino τροφοδοτείται στα 3V3 και για τα οποία η τάση στη σειριακή θύρα θεωρείται επίσης ότι είναι 3V3. Εάν χρησιμοποιείτε α μικροελεγκτής με διαφορετικό επίπεδο σήματος στη σειριακή θύρα (συνήθως 5 V) θα είναι απαραίτητο, ώστε να μην προκληθεί ζημιά στο ESP8266, χρησιμοποίησε ένα μετατροπέας στάθμης όπως αυτά στα παρακάτω διαγράμματα. Αυτό το κύκλωμα βρίσκεται συχνά σε πολλές εμπορικές εφαρμογές εκτός ραφιού.

    Μετατροπέας στάθμης σήματος 5V σε 3V3 για μονάδα WiFi ESP8266 και Arduino

    Ενημερώστε το υλικολογισμικό ESP8266

    ο Εντολές ESP8266 AT, ο τερματισμός του, η προεπιλεγμένη ταχύτητα του module... εξαρτώνται από την έκδοση του Υλικολογισμικό ESP8266. Είναι καλύτερο να βεβαιωθείτε ότι έχετε την ίδια έκδοση σε όλες τις μονάδες και, εάν είναι δυνατόν, ότι είναι η πιο πρόσφατη έκδοση.

    Δυστυχώς, τα περισσότερα από τα Μοντέλα μονάδας wifi ESP8266 Έχουν μόνο 4 Mbit, επομένως δεν μπορεί να εγκατασταθεί η τελευταία έκδοση σε αυτά. Η τελευταία (επίσημη) έκδοση υλικολογισμικού που μπορεί να εγκατασταθεί ESP8266 μονάδες wifi με 4 Mbit (τα περισσότερα) είναι 0.9.4 που περιλαμβάνει την έκδοση 0.2 του Εντολές ESP8266 AT.

    Συνοπτικά, για να ενημερώσετε το υλικολογισμικό χρειάζεστε:

    1. Κατεβάστε την αντίστοιχη έκδοση υλικολογισμικού. Ο τελευταία (επίσημη) έκδοση για μονάδα με μνήμη 4 Mbit, που βρίσκεται στο φάκελο Espressif στο github. Στο Ιστοσελίδα Espressif Μπορείτε να κάνετε λήψη της πιο πρόσφατης έκδοσης του υλικολογισμικού, αλλά είναι πολύ σημαντικό να επαληθεύσετε ότι η μονάδα στην οποία είναι εγκατεστημένη έχει αρκετή μνήμη.

    2. Κάντε λήψη της πιο πρόσφατης έκδοσης του εργαλείου εγκατάστασης υλικολογισμικού. Το αγαπημένο μου είναι esptool που είναι γραμμένο στο Python, επομένως λειτουργεί σε οποιαδήποτε πλατφόρμα. Εκτός από τη λήψη, μπορεί επίσης να εγκατασταθεί με pip install esptool (o pip2 o python -m pip…). Φυσικά, Espressif Προσφέρει επίσης το δικό του εργαλείο, αλλά προς το παρόν είναι διαθέσιμο μόνο για Windows.

    3. Προετοιμάστε τα ληφθέντα αρχεία; αποσυμπιέστε τα σε έναν προσβάσιμο φάκελο και, εάν χρειάζεται, κάντε το εργαλείο εκτελέσιμο esptool, στην περίπτωσή μου, από τότε GNU / Linux, Με chmod +x esptool

    4. Συνδέστε τη μονάδα στον υπολογιστή χρησιμοποιώντας έναν μετατροπέα USB UART TTL που λειτουργεί σε 3V3 ή χρησιμοποιήστε έναν μετατροπέα στάθμης εάν λειτουργεί στα 5 V. Εκτός από την ισχύ, θα πρέπει να συνδέσετε το TX στο RX του μετατροπέα USB UART TTL, RX σε TX, GPIO0 σε χαμηλό επίπεδο (GND) και ίσως GPIO2 σε υψηλό επίπεδο (στις δοκιμές μου έχει δουλέψει και συνδέοντάς το σε χαμηλό επίπεδο και αποσυνδέοντάς το). Εάν η μονάδα έχει τη σύνδεση GPIO15 ελεύθερη (όπως συμβαίνει στο ESP-12), πρέπει να συνδεθεί σε χαμηλή στάθμη. Το RESET, το οποίο κανονικά θα ήταν σε υψηλό επίπεδο κατά τη λειτουργία, μπορεί να αφεθεί ασύνδετο ή να συνδεθεί σε υψηλό επίπεδο μέσω μιας αντίστασης (10K, για παράδειγμα), καθώς πριν από την έναρξη της εγγραφής μπορεί να χρειαστεί να επαναφέρετε τη συσκευή συνδέοντάς την σε χαμηλό επίπεδο.
      Με την ενεργοποίηση της μονάδας θα είναι διαθέσιμη για ενημέρωση αλλά, Εάν εμφανιστεί ένα σφάλμα σύνδεσης, θα χρειαστεί να το επαναφέρετε συνδέοντας το RESET σε χαμηλό επίπεδο για μια στιγμή και μετά αφήνοντάς το on air (χωρίς σύνδεση) για τη διαδικασία ενημέρωσης.
      Η ενότητα έχει Η κατανάλωση μισού αμπέρ κορυφώνεται (έως 600 mA, σύμφωνα με ορισμένους χρήστες), επομένως είναι σημαντικό να χρησιμοποιήσετε ένα τροφοδοτικό ικανό να υποστηρίξει αυτήν την κατανάλωση, ειδικά για την ενημέρωση του υλικολογισμικού.

      Σύνδεση μονάδα wifi ESP8266 ESP-01 σε μετατροπέα USB UART TTL ενημέρωση υλικολογισμικού

    5. Εκτελέστε το εργαλείο για να ενημερώσετε το υλικολογισμικό. Στην περίπτωσή μου, έχω αποθηκεύσει τα έγγραφα του εργαλείου και του υλικολογισμικού στο βήμα 3 στον ίδιο φάκελο, επομένως τρέχω από την κονσόλα:
      cd ~/Datos/firmwareESP8266 (αλλαγή στο φάκελο που περιέχει το εργαλείο και το υλικολογισμικό)
      ./esptool.py --baud 115200 --port /dev/ttyUSB0 write_flash \
      0x00000 ./boot_v1.1.bin \
      0x01000 ./user1.bin \
      0x7C000 ./esp_init_data_default.bin \
      0x7E000 ./blank.bin

      --baud ορίζει την ταχύτητα του ESP8266 (115200 baud στην περίπτωσή μου) και --port τη σειριακή θύρα στην οποία συνδέεται (στην περίπτωσή μου, προσομοιωμένη, το πρώτο USB). Τα διάφορα έγγραφα που απαρτίζουν το υλικολογισμικό είναι πίσω write_flash πριν από τη διεύθυνση, με το έγγραφο user1.bin να περιέχει το ωφέλιμο φορτίο ενημέρωσης.

      Ενημέρωση υλικολογισμικού wifi ESP8266 Λήψη κονσόλας esptool

    Στείλτε εντολές στη μονάδα wifi ESP8266

    Για τον έλεγχο του ESP8266 από έναν υπολογιστή με τον οποίο θα πρέπει να ξεκινήσουμε διαμορφώστε την εφαρμογή για την οποία θα αρκεί να ① επιλέξετε τη θύρα στην οποία είναι συνδεδεμένος ο μετατροπέας USB UART TTL, κάτι όπως /dev/USB0 σε GNU/Linux και παρόμοια ή κάτι παρόμοιο COM6 στα Windows, ② επιλέξτε την ταχύτητα με την οποία το ESP8266, πιθανώς 115200 baud, ③ ορίστε 8 bit δεδομένων συν ένα bit stop, χωρίς ισοτιμία ή χειραψία και ④ ορίστε το τέλος της γραμμής, ανάλογα με το firmware, σχεδόν πάντα CR+LF.

    Διαμορφώστε το CuteCom για να παρακολουθεί τη μονάδα wifi ESP8266 χρησιμοποιώντας έναν μετατροπέα USB UART TTL

    Διαμόρφωση PuTTY για παρακολούθηση της μονάδας wifi ESP8266 με μετατροπέα USB UART TTL

    Μόλις διαμορφωθεί η εφαρμογή (ή, όπου χρειάζεται, αποθηκευτεί και επιλεγεί), είναι ανοίξτε τη σύνδεση ("open device" και "open", αντίστοιχα, στα στιγμιότυπα οθόνης των παραπάνω παραδειγμάτων με CuteCom y PuTTY) και μπορείτε να αρχίσετε να στέλνετε παραγγελίες στο ESP8266.

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

    Ο τρόπος στείλετε AT παραγγελίες al Μονάδα wifi ESP8266 από Arduino είναι πολύ απλό: ① διαμόρφωση επικοινωνιών με Serial.begin(115200); (ή Serial1, Serial2… σε πλακέτες με πολλές σειριακές θύρες υλικού) και ② στείλτε τις εντολές χρησιμοποιώντας τη μορφή Serial.print(orden+"\r\n");

    Το παραπάνω παράδειγμα δείχνει πώς να στείλετε το ESP8266 μονάδα wifi AT παραγγελίες από Arduino. Στην περίπτωση αυτή απεικονίζεται AT+CWJAP, το οποίο χρησιμοποιείται για σύνδεση σε σημείο πρόσβασης. Αυτή η εντολή χρησιμοποιεί ως ορίσματα το αναγνωριστικό σημείου πρόσβασης (SSID) και το κλειδί, και τα δύο σε εισαγωγικά, οπότε γίνονται αντικείμενο Srtring και περικλείστε τα σε εισαγωγικά χρησιμοποιώντας τον κωδικό διαφυγής (\"). Για να ολοκληρώσετε την παραγγελία, χρησιμοποιήστε \r\n που αντιστοιχεί σε CR y LF.

    Να θυμάστε ότι η σειριακή θύρα δεν ταυτίζεται πάντα με Serial (σε ορισμένα πιάτα μπορεί να είναι Serial1, Serial2…) το αντικείμενο θύρας που χρησιμοποιείται έχει οριστεί με την ανάθεση του στη μακροεντολή PUERTO_SERIE. Η ανίχνευση του τύπου της πλακέτας που χρησιμοποιείται θα μπορούσε να προσθέσει λίγη ευφυΐα στην επιλογή σειριακής θύρας. Αργότερα θα δούμε πώς μπορείτε να μάθετε τον τύπο Arduino. Οι υπόλοιποι ορισμοί είναι οι συνηθισμένοι που σας επιτρέπουν να "ονομάσετε" τις σταθερές τιμές για να αποφύγετε την επανάληψη τους (και να κάνετε λάθη) και να διευκολύνετε την αλλαγή τους.

    Το παραπάνω παράδειγμα υποτίθεται ότι συνδέει το Μονάδα wifi ESP8266 στο υποδεικνυόμενο σημείο πρόσβασης αλλά ήταν ήδη συνδεδεμένο στο παρελθόν; Έχει λειτουργήσει η σύνδεση; Για να ξέρουμε, πρέπει να «ακούμε» τι το ESP8266

    Λάβετε δεδομένα από τη μονάδα wifi ESP8266

    Συνδέοντας το sniffer δεδομένων που εξηγήθηκε παραπάνω στον υπολογιστή, μπορείτε να δείτε τι Arduino έχει στείλει σε ESP8266 και η απάντησή του. Για να διαβάσετε από Arduino και να επεξεργαστεί τις πληροφορίες σε αυτό, θα είναι απαραίτητο να εντοπιστεί με Serial.available() εάν έχουν φτάσει κάποια δεδομένα και αν ναι, φορτώστε τα Serial.read(). Το ακόλουθο παράδειγμα δείχνει πώς να διαβάσετε την απάντηση από AT+CWJAP?, το οποίο θα αναφέρει εάν υπάρχει σύνδεση με οποιοδήποτε σημείο πρόσβασης.

    Σαν σε πιάτο Arduino Uno (και σε άλλα) το άνοιγμα της σειριακής οθόνης επαναφέρει το πρόγραμμα, μπορεί να χρησιμοποιηθεί για να δει στη σειριακή κονσόλα Arduino τις πληροφορίες που στέλνετε ESP8266 όπως δείχνει το στιγμιότυπο οθόνης της παρακάτω εικόνας.

    Λάβετε δεδομένα από τη μονάδα wifi ESP8266 από το Arduino. Βασικό παράδειγμα

    Αναλύστε την απάντηση που στάλθηκε από τη μονάδα wifi ESP8266

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

    Ένας απλός τρόπος διαχείρισης αυτής της κατάστασης είναι επαναλάβετε τα δεδομένα που ελήφθησαν αναζητώντας συγκεκριμένες απαντήσεις με τα οποία, για παράδειγμα, ενεργοποιούν δείκτες (σημαίες ή μεταβλητές Boolean) που θα καθορίσουν εάν θα συνεχιστεί η αναζήτηση στο ληφθέν κείμενο και ποιες ενέργειες θα πρέπει να πραγματοποιηθούν με βάση τις πληροφορίες που προέρχονται από το ESP8266. Ενώ φτάνει η απάντηση μικροελεγκτής μπορεί να αφιερωθεί σε άλλες εργασίες, για παράδειγμα, λήψη δεδομένων από αισθητήρες και επεξεργασία τους.

    Αναζητήστε ένα κείμενο στις πληροφορίες που λάβατε από το ESP8266

    Για αναζήτηση στο κείμενο που προέρχεται από το ESP8266 μπορείτε συγκρίνετε κάθε γράμμα που λάβατε με αυτό που αντιστοιχεί στο μήνυμα που αναζητάτε. Θα χρειαστεί να χρησιμοποιήσετε έναν μετρητή (ή έναν δείκτη) που δείχνει το γράμμα που πρόκειται να συγκριθεί. Αν ο χαρακτήρας που προέρχεται από το ESP8266 είναι το ίδιο με αυτό που εξετάζεται στο μήνυμα, ο μετρητής προχωρά, εάν είναι διαφορετικός αρχικοποιείται.

    Για να μάθετε ότι έχει φτάσει το τέλος, συμβουλευτείτε τον επόμενο χαρακτήρα του μηνύματος που αναζητήσατε, ο οποίος θα είναι μηδέν (\0) ή το μήκος του μηνύματος αποθηκεύεται ώστε, συγκρίνοντάς το με τον μετρητή, να γνωρίζουμε εάν η σύγκριση έχει ολοκληρωθεί και επομένως η Μονάδα wifi ESP8266 έχει στείλει το καταζητούμενο μήνυμα.

    Το παρακάτω παράδειγμα χρησιμοποιεί την εντολή AT+CWLAP που θα επιστρέψει μια λίστα με σημεία πρόσβασης και μέσα σε αυτά αναζητείται ένα που ονομάζεται "wifi polaridad.es". Αν και επιλέξαμε να επαληθεύσουμε ότι ο τελευταίος χαρακτήρας είναι μηδέν, όπως το ρυθμιστικό Αποθηκεύει μόνο το κείμενο που αναζητήθηκε και το μήκος του είναι γνωστό, θα μπορούσε επίσης να ελεγχθεί εάν έχει ληφθεί τέτοιος αριθμός σωστών γραμμάτων. Με LED συνδεδεμένο με την ακίδα 2 αναφέρεται ότι βρέθηκε το αναμενόμενο κείμενο.

    Στον κώδικα του προηγούμενου παραδείγματος μπορείτε επίσης να δείτε έναν τρόπο επιλέξτε τη σειριακή θύρα ανάλογα με τον τύπο της πλακέτας Arduino μεταχειρισμένος. Αυτό το παράδειγμα προϋποθέτει ότι έχετε τρεις τύπους πινάκων για το έργο: ένα Arduino Uno, Ένα Arduino Mega 2560 και ένα arduino leonardo. Εάν εργάζεστε με ένα Arduino Uno θα χρησιμοποιηθεί Serial και αλλιώς Serial1.

    Εάν εργάζεστε με ένα πιάτο arduino leonardo Μπορείτε να χρησιμοποιήσετε την ίδια μέθοδο για να σταματήσετε το πρόγραμμα και να περιμένετε την κονσόλα (τη σειριακή θύρα που σχετίζεται με Serial) είναι διαθέσιμο.

    Αναζητήστε διάφορα κείμενα στην απόκριση ESP8266

    Ο κώδικας στο προηγούμενο παράδειγμα χρησιμοποιείται για την αναζήτηση κειμένου στις πληροφορίες που αποστέλλονται από το ESP8266 αλλά η απόκριση μπορεί να περιλαμβάνει διαφορετικές πληροφορίες ανάλογα με τη λειτουργία. Ας υποθέσουμε, για να ξεκινήσουμε με μια απλή περίπτωση στο επόμενο παράδειγμα, ότι το κείμενο που στάλθηκε από το MCU ESP8266 es OK όταν η επέμβαση εκτελείται σωστά και ERROR Διαφορετικά, όπως και με την παραγγελία AT+CWJAP?, το οποίο χρησιμεύει για την επαλήθευση εάν το Μονάδα wifi ESP8266 είστε ήδη συνδεδεμένοι σε ένα σημείο πρόσβασης.

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

    Περιορίστε το χρόνο που χρειάζεται για να λάβετε μια απάντηση

    Μέχρι στιγμής δεν έχει γίνει αναφορά σε σχετικό θέμα: το μέγιστος χρόνος αναμονής (timeout) πριν θεωρηθεί ότι μια λειτουργία απέτυχε. Εάν για οποιοδήποτε λόγο η σύνδεση με το Μονάδα wifi ESP8266, η λειτουργική μονάδα με το σημείο πρόσβασης, το σημείο πρόσβασης με το Διαδίκτυο ή, για παράδειγμα, ένας υποθετικός διακομιστής δεν είναι διαθέσιμος, το πρόγραμμα μπορεί να αποκλειστεί σε ένα σημείο σε αναμονή επ' αόριστον, επομένως θα πρέπει να διατυπωθεί μια απάντηση σε τέτοιες περιπτώσεις. Ο μέγιστος χρόνος αναμονής μπορεί να ρυθμιστεί για ολόκληρη την εφαρμογή, συνήθως θα είναι πιο «γενναιόδωρος» σε αυτήν την περίπτωση ή μπορούν να προγραμματιστούν μεμονωμένοι χρόνοι αναμονής για κάθε λειτουργία.

    Για να ελέγξετε ότι (τουλάχιστον) έχει περάσει ένα συγκεκριμένο χρονικό διάστημα Ο "χρόνος" της στιγμής έναρξης του λογαριασμού συνήθως αφαιρείται από τον τρέχοντα "χρόνο" και επαληθεύεται ότι η διαφορά είναι μεγαλύτερη από το επιθυμητό όριο. Αυτός ο "χρόνος" δεν χρειάζεται να είναι πραγματικός χρόνος, συνήθως αντιστοιχεί στο διάστημα που έχει περάσει από το MCU αρχίστε να μετράτε το χρόνο. Αυτό δεν επηρεάζει το πρόγραμμα αφού το ενδιαφέρον είναι ο χρόνος που έχει παρέλθει και όχι ο απόλυτος χρόνος.

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

    Μεταβλητή milisegundos_al_empezar περιέχει την τιμή του millis() μιας ορισμένης στιγμής της εκτέλεσης από την οποία έχει χρονομετρηθεί, επομένως δεν είναι ασυνήθιστο το όνομά του να αναφέρεται στη λέξη "χρονοόμετρο". Η μεταβλητή intervalo_de_tiempo περιέχει τον μέγιστο αριθμό χιλιοστών του δευτερολέπτου που κάνει αληθή την προηγούμενη έκφραση, δηλαδή αντιπροσωπεύει το χρονικό όριο. Είναι συνήθως μια σταθερά (ή μια μακροεντολή) και, όπως στην προηγούμενη περίπτωση, η λέξη "TIMEOUT" εμφανίζεται συχνά στο όνομά της. Εάν εργάζεστε με πολύ μικρά διαστήματα μπορείτε να χρησιμοποιήσετε micros() αντί για millis() (μικροδευτερόλεπτα αντί για χιλιοστά του δευτερολέπτου) αν και είναι πολύ λιγότερο συνηθισμένο και πολύ λιγότερο ακριβές.

    Ένας μακρύς ακέραιος in Arduino (unsigned long) καταλαμβάνει 4 byte (32 bit), επομένως η μεγαλύτερη τιμή που μπορεί να αντιπροσωπεύει είναι 4294967295 (2 στη δύναμη των 32 μείον ένα, επειδή ξεκινά από το μηδέν). σε ένα πιάτο Arduino Ενώ λειτουργεί συνεχώς, ο μετρητής χιλιοστών του δευτερολέπτου θα επαναφέρει (επιστρέφει στο μηδέν) περίπου κάθε 50 ημέρες. Κατά την αφαίρεση με ανυπόγραφους τύπους δεδομένων, αναπαράγεται η ίδια συμπεριφορά (αναστροφή του μετρητή), επομένως είναι βιώσιμος ο επ' αόριστος έλεγχος του χρονικού ορίου.

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

    Εκτελέστε μια πολύπλοκη λειτουργία που ορίζεται από πολλαπλές εντολές AT

    Για να έχετε ένα παράδειγμα αναφοράς του σκοπού της εφαρμογής που εκμεταλλεύεται το Μονάδα wifi ESP8266, ας υποθέσουμε ότι είναι αποθήκευση πληροφοριών σε μια βάση δεδομένων στην οποία έχει πρόσβαση μέσω μιας υπηρεσίας Ιστού για να παρακολουθείτε τη θερμοκρασία. Ο παρακάτω κώδικας διαβάζει έναν αισθητήρα συνδεδεμένο σε μια αναλογική είσοδο κάθε συγκεκριμένο χρονικό διάστημα, υπολογίζει τη μέση τιμή και, μετά από μεγαλύτερο χρονικό διάστημα, τον στέλνει στον διακομιστή web (στυλ IoT) μέσω α αιτήματος HTTP (ΑΝΑΡΤΗΣΗ, ΛΑΒΕ…).

    Σε αυτό το παράδειγμα καταγραφής θερμοκρασίας, γίνεται πρόσβαση σε έναν διακομιστή web κάθε πέντε λεπτά. Αν και η διαθεσιμότητα δεν είναι ιδιαίτερα υψηλή, αναμένεται ότι η πρόταση θα λειτουργούσε, αλλά εάν χρειαζόταν μεγαλύτερη συχνότητα εγγραφής, θα έπρεπε να χρησιμοποιηθούν άλλοι πόροι, για παράδειγμα, προσωρινή μνήμη δεδομένων περιμένει να σταλεί, για να στείλετε πολλά όταν ο διακομιστής μπορεί να παρευρεθεί και να τα αποθηκεύσετε για όταν δεν είναι διαθέσιμο. Εάν η συχνότητα με την οποία πρέπει να καταγράφονται τα δεδομένα ήταν ακόμη μεγαλύτερη, θα έπρεπε να προταθούν άλλοι τύποι πρωτοκόλλων ως εναλλακτική λύση HTTP ή ακόμα και αντικατάσταση TCP με UDP να μπορεί να στείλει τα περισσότερα δεδομένα με την απαιτούμενη ταχύτητα ακόμη και με κόστος απώλειας ορισμένων.

    Οι λειτουργίες που συνθέτουν την εργασία που πρέπει να πραγματοποιηθεί για την αποστολή της θερμοκρασίας θα είναι:

    • Επαναφέρετε τη μονάδα wifi
    • Αποσύνδεση από το τρέχον σημείο πρόσβασης (σε περίπτωση που υπάρχει προεπιλεγμένη σύνδεση)
    • Ορίστε τις ρυθμίσεις. Για το παράδειγμα, θεωρείται ότι πρέπει να διαμορφωθεί η λειτουργία σύνδεσης (απλή) και ο ρόλος στις επικοινωνίες Wi-Fi (σταθμός).
    • Σύνδεση στο σημείο πρόσβασης
    • Βεβαιωθείτε ότι η σύνδεση είναι σωστή (στην πραγματικότητα, αυτό είναι το σημείο εισόδου) Εάν δεν υπάρχει σύνδεση, ξεκινήστε τη διαδικασία από την αρχή
    • Συνδεθείτε στο διακομιστή
    • Στείλτε το αίτημα HTTP με τα δεδομένα που θα αποθηκευτούν

    Η σειρά των λειτουργιών δεν χρειάζεται να είναι ακριβώς έτσι (αν και η λειτουργία είναι) και κάθε βήμα μπορεί να απαιτεί πολλά Εντολές ESP8266 ATΓια παράδειγμα, η διαμόρφωση που αναφέρεται παραπάνω θα χρειαζόταν δύο: AT+CIPMUX=0 y AT+CWMODE=1.

    Μια δομή δεδομένων για την αναπαράσταση λειτουργιών στο ESP8266

    Στα προηγούμενα παραδείγματα, αν και με πολύ βασικό τρόπο, προτείνεται ήδη μια γενική λύση στο πρόβλημα: χρησιμοποιήστε μια δομή δεδομένων που αποθηκεύει τις πιθανές απαντήσεις και τις ενέργειες που πρέπει να γίνουν σε κάθε περίπτωση; στείλτε μια ενέργεια, περιμένετε μια απάντηση και προχωρήστε σύμφωνα με το τι σημαίνει η απάντηση. Δεδομένου ότι κάθε πολύπλοκη λειτουργία θα απαιτήσει αρκετές Εντολές ESP8266 AT, η δομή δεδομένων πρέπει να συνδέει μια λειτουργία με άλλες, μεταγενέστερες ή προηγούμενες, οι οποίες πρέπει να εκτελούνται σε κάθε περίπτωση ανάλογα με την απόκριση του ESP8266.

    Στα προηγούμενα παραδείγματα, έγινε αναζήτηση ενός μηνύματος εντός της απάντησης του ESP8266 και ερμηνεύτηκε ως επιτυχία ή λάθος. Εκτός από λήψη (και ανάλυση) όλου του κειμένου που ελήφθη, Για να έχετε ένα γενικό ελάχιστο, καλό είναι να φροντίζετε και για την ολοκλήρωση του μηνύματος ή, με άλλα λόγια, στη διαθεσιμότητα του Μονάδα wifi ESP8266 για λήψη νέων παραγγελιών. Με αυτόν τον τρόπο, η αλλαγή σε μια κατάσταση που θα μπορούσαμε να ονομάσουμε, για παράδειγμα, "διαθέσιμο wifi", θα μπορούσε να είναι η λήψη του ονόματος του σημείου πρόσβασης και η λήψη του κειμένου ERROR ή το κείμενο OK θα σήμαινε ότι το ESP8266 ολοκληρώσατε την απάντηση και τώρα μπορείτε να στείλετε την επόμενη Εντολή AT στο ESP8266.

    Ο παραπάνω κώδικας χρησιμοποιεί ένα διάνυσμα (operacion) για να αποθηκεύσετε το κείμενο των διαδοχικών πράξεων που αποτελούν την πλήρη εργασία. Χρησιμοποιείται ένας δισδιάστατος πίνακας (mensaje) με τις τρεις απαντήσεις που αναλύονται. Όπως εξηγήθηκε παραπάνω, είναι απαραίτητο να αναζητήσετε τα μηνύματα που αντιπροσωπεύουν το τέλος της απάντησης εκτός από το μήνυμα που αντιπροσωπεύει μια σωστή ή λανθασμένη απάντηση. Δεν θα έχουν όλες οι λειτουργίες τον ίδιο αριθμό πιθανών απαντήσεων. Όταν υπάρχουν λιγότερες απαντήσεις, μπορεί να χρησιμοποιηθεί ένα κενό μήνυμα που καταναλώνει τον μικρότερο δυνατό αριθμό κύκλων στην ανάλυσή του (ακόμα κι έτσι, δεν είναι ο βέλτιστος τρόπος). Λογικά, θα είναι απαραίτητο ο ελάχιστος αριθμός των απαντήσεων που αναζητούνται (τρεις στο παράδειγμα) να περιλαμβάνει όλες τις δυνατότητες λειτουργίας, ακόμη και αν δεν είναι όλες δυνατές.

    Όταν μιλάμε για τις πιθανές απαντήσεις, μπορεί ήδη να φανεί ότι αυτό το παράδειγμα δεν είναι πολύ χρήσιμο για τη λήψη δεδομένων με αυθαίρετη μορφή από Μονάδα wifi ESP8266, αλλά το θέμα είναι ότι, στα πλαίσια χρήσης με μικροελεγκτές δεν ειναι συνηθισμενο? Το πιο συνηθισμένο πράγμα είναι να στέλνετε δεδομένα που συλλέγονται από τους αισθητήρες που έχουν συνδέσει ή/και να λαμβάνετε πληροφορίες σχετικά με το τι πρέπει να κάνετε με τους ενεργοποιητές που ελέγχει. Πολύτιμες πληροφορίες, οι οποίες μπορούν να προβλεφθούν πολύ καλά.

    Στην προηγούμενη δομή δεδομένων, όπως ακριβώς γίνεται για να εκφραστούν οι πιθανές αποκρίσεις που αναλύονται, χρησιμοποιείται επίσης ένας δισδιάστατος πίνακας για τον προσδιορισμό της λειτουργίας που πρέπει να εκτελεστεί σε κάθε περίπτωση.siguiente_operacion). Συγκεκριμένα, επιλέξαμε να απαντάμε σε τρεις τύπους μηνυμάτων: ① ένα αυθαίρετο κείμενο (LITERAL) για να επαληθεύσετε εάν υπάρχει σύνδεση με το σημείο πρόσβασης Wi-Fi και τον διακομιστή, ② ένα κείμενο για τον εντοπισμό σφαλμάτων στη διαδικασία (FALLO) και ③ ένα κείμενο που υποδεικνύει ότι η λειτουργία ολοκληρώθηκε με επιτυχία (ACIERTO).

    Τέλος, υπάρχουν δύο ακόμη διανύσματα για να ορίσετε τον μέγιστο χρόνο αναμονής πριν τα παρατήσετε (timeout) και προσδιορίστε (configuracion) εάν η λειτουργία τελειώσει χωρίς να περιμένει απάντηση (ESPERAR_RESPUESTA) και μηνύματα που υποδεικνύουν το τέλος της επικοινωνίας. Αυτό το τελευταίο διάνυσμα, για να επεξηγήσει ένα παράδειγμα του πώς θα μπορούσε να αποθηκευτεί η μνήμη, λειτουργεί με τα bit ενός byte διαμόρφωσης για να υποδείξει τις διαφορετικές καταστάσεις.

    Ο πρώτος Εντολές ESP8266 AT της δομής δεδομένων αναμένετε πάντα μια απάντηση, η οποία μπορεί να είναι το μήνυμα επιτυχίας ή σφάλματος. Όταν παρουσιαστεί κάποιο σφάλμα, η μονάδα επανεκκινείται και ξεκινά ξανά και εάν το μήνυμα υποδεικνύει ότι η λειτουργία είναι σωστή, προχωρά στην επόμενη.

    Όταν συνδεθείτε στον διακομιστή, το μοτίβο αλλάζει. Σε αυτήν την περίπτωση, είναι απαραίτητο να ① να στείλετε το μήκος του πακέτου δεδομένων που πρόκειται να μεταδοθεί και ② να συντάξετε το αίτημα HTTP με ένα σταθερό κείμενο συν την τιμή (της θερμοκρασίας) που αποστέλλεται για αποθήκευση στον διακομιστή. Η προετοιμασία αυτών των δεδομένων πραγματοποιείται σε κάθε αποστολή και είναι απαραίτητο να χωριστεί σε δύο (γνωστοποιήστε το μήκος) ή τρία (αποστολή του αιτήματος HTTP) Σε ESP8266 κατά παραγγελία. Μόνο το τελευταίο από τα μέρη στα οποία χωρίζεται η λειτουργία θα περιμένει απάντηση.

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

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

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

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

    Λογικά, πολλές ενέργειες βελτιστοποίησης μπορούν να πραγματοποιηθούν στον προηγούμενο κώδικα, αλλά, καθώς αυτό είναι ένα παράδειγμα για να κατανοήσουμε πώς ESP8266 Κατά γενικό τρόπο, αξίζει να εστιάσουμε μόνο σε ορισμένες πτυχές, η πρώτη είναι η δομή δεδομένων. Φαίνεται ότι το λογικό είναι χρησιμοποιήστε μια δομή δεδομένων γλώσσας προγραμματισμού (struct) για την αναπαράσταση των πληροφοριών που υποβάλλονται σε επεξεργασία: ο Εντολές ESP8266 AT και τα μηνύματα που αναλύονται.

    Χρησιμοποιήστε μια δομή (struct) η αποθήκευση των δεδομένων αντί για τους πίνακες παραδειγμάτων (με βάση αυτούς) είναι ασήμαντη και, αν και μπορεί να οδηγήσει σε πιο κομψό κώδικα, δεν συνεπάγεται καμία βελτίωση στο αποτέλεσμα. Η αληθινή εναλλακτική που τίθεται από τη χρήση του struct πρόκειται να εφαρμοστεί, όπως εξηγείται παρακάτω, μεταβλητά μήκη σε δομές που περιέχουν «εσωτερικά» δεδομένα που αναφέρονται από αυτούς. Με αυτόν τον τρόπο, για παράδειγμα, δεν θα ήταν απαραίτητο για μια λειτουργία να έχει σταθερό αριθμό απαντήσεων προς ανάλυση.

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

    Στη γραμμή της βελτιστοποίησης του κώδικα, είναι ενδιαφέρον να θυμόμαστε ότι, σε ένα πρόγραμμα αυτού του τύπου, το οποίο χρησιμοποιεί μεγάλη ποσότητα κειμένου, μπορεί να εξοικονομήσει χώρο στη μνήμη SRAM αποθήκευση συμβολοσειρών κειμένου στη μνήμη προγράμματος (φλας) με τη μακροεντολή F(). Στα παρακάτω στιγμιότυπα οθόνης μπορείτε να δείτε το διαφορετικό πρόγραμμα και τη δυναμική κατανομή μνήμης με κανονική χρήση κειμένου και χρήση της μακροεντολής F().

    Παράδειγμα κώδικα Arduino με χρήση κειμένου που είναι αποθηκευμένο στη μνήμη προγράμματος (flash)
    Παράδειγμα κώδικα Arduino με χρήση κειμένου σε SRAM

    Όσον αφορά τις ενέργειες που εκτελούνται σύμφωνα με τις πληροφορίες που προέρχονται από το Μονάδα wifi ESP8266, ως εναλλακτική λύση για τον έλεγχο του μηνύματος από τον κώδικα και την εκτέλεση του ενός ή του άλλου σύμφωνα με αυτό που λαμβάνεται, μπορεί να αποθηκευτεί σε αυτήν τη δομή δεδομένων δείκτες σε λειτουργίες που εκτελούν κάθε εργασία αντί για δείκτες κατάστασης (σημαίες) που προειδοποιούν για μια συγκεκριμένη κατάσταση ότι η εφαρμογή είναι υπεύθυνη για τη διαχείριση, για παράδειγμα, εντός του κύριου βρόχου.

    Το παρακάτω είναι ένα παράδειγμα δομών για την αποθήκευση των δεδομένων των αιτημάτων στο ESP8266 (ο τύπος δεδομένων operacion_esp8266) και τις απαντήσεις τους (τον τύπο δεδομένων respuesta_esp8266).

    Ως δομή που αντιπροσωπεύει τη λειτουργία (τα δεδομένα που αποστέλλονται στο Μονάδα wifi ESP8266) αναφέρεται στη δομή με την οποία ορίζονται οι αποκρίσεις και στη δομή των αποκρίσεων στη δομή των πράξεων, είναι απαραίτητο να δηλώσετε πρώτα και τα δύο, ορίζοντας τον νέο τύπο δεδομένων και, στη συνέχεια, ορίζοντας τα περιεχόμενά του.

    Το προηγούμενο παράδειγμα θεωρεί ότι το πρόγραμμα που το περιλαμβάνει έχει επιλέξει να χρησιμοποιήσει a ένδειξη κατάστασης, το οποίο πρέπει να αντιστοιχεί σε μια μεταβλητή προσβάσιμη από τον κωδικό που είναι υπεύθυνη για την εκτέλεση μιας ή άλλης λειτουργίας όπως υποδεικνύεται από την εν λόγω τιμή. Αν στην απάντηση του ESP8266 Όταν αναλύεται ένα συγκεκριμένο κείμενο, η κατάσταση παίρνει την τιμή που υποδεικνύει τη δομή της αντίστοιχης απόκρισης.

    Όπως αναφέρθηκε προηγουμένως, μια άλλη εναλλακτική λύση, είτε για αντικατάσταση είτε για συμπλήρωση ενός δείκτη κατάστασης, θα ήταν αποθηκεύστε μια συνάρτηση στη δομή αναφοράς (ένας δείκτης) που θα καλούνταν όταν συναντήσετε συγκεκριμένο κείμενο στην απάντηση από το Μονάδα wifi ESP8266.

    Στο προηγούμενο παράδειγμα, έχει προστεθεί στη δομή δεδομένων που χρησιμοποιείται για την επεξεργασία της απόκρισης από το Μονάδα wifi ESP8266 ένας δείκτης σε μια (υποτιθέμενη) συνάρτηση που επιστρέφει δεδομένα τύπου float (θα μπορούσε να είναι η σταθμισμένη τιμή μιας αναλογικής ανάγνωσης) και στην οποία παρέχονται δύο byte ως ορίσματα (δύο unsigned char που θα μπορούσε να είναι η ακίδα από την οποία διαβάζεται η αναλογική είσοδος και αυτή που ενεργοποιεί το ΕΝΕΡΓΟΠΟΙΗΣΗ ενός υποθετικού ολοκληρωμένου).

    Σε ανάπτυξη για MCU, σε αντίθεση με ό,τι συμβαίνει στο στυλ ανάπτυξης για μεγαλύτερα συστήματα, δεν είναι τόσο ασυνήθιστο να χρησιμοποιούνται καθολικές μεταβλητές κατά τον καθορισμό της (καθολικής) συμπεριφοράς της εφαρμογής που ελέγχει ένα συγκρότημα, επομένως δεν θα είναι ιδιαίτερα σπάνιο να βρεθεί αυτός ο τύπος ορισμών ως συναρτήσεις χωρίς παραμέτρους και που δεν επιστρέφουν τιμές, κάτι σαν void (*accion)();

    Εάν εργάζεστε με αυτόν τον τρόπο αναπαράστασης των δεδομένων, χρησιμοποιώντας struct δεδομένων μεταβλητού μήκους, θα είναι απαραίτητο να εκχωρηθεί δυναμικά η μνήμη με malloc() (o new(), εάν χρησιμοποιούνται αντικείμενα), το οποίο θα χρησιμοποιήσει την ποσότητα μνήμης που έχει εκχωρηθεί ως παράμετρο και θα επιστρέψει έναν δείκτη στην αρχή της περιοχής μνήμης που έχει δεσμευτεί. Με sizeof() Στον τύπο που είναι αποθηκευμένος, πολλαπλασιασμένος με τον αριθμό των στοιχείων που χρησιμοποιούνται, μπορείτε να λάβετε την ποσότητα μνήμης που απαιτείται. Ένα παράδειγμα με και χωρίς τη χρήση του μπορείτε να δείτε στα στιγμιότυπα οθόνης παρακάτω. malloc(); Να είστε προσεκτικοί με τη μνήμη που χρησιμοποιεί το πρόγραμμα στην πρώτη περίπτωση, πρέπει να φορτώσετε τη βιβλιοθήκη που περιέχει αυτή τη λειτουργία.

    Παράδειγμα εκχώρησης μνήμης με malloc στο Arduino

    Παράδειγμα ανάθεσης κειμένου χωρίς malloc στο Arduino

    Εάν οι λειτουργίες στο Μονάδα wifi ESP8266 θα διαφέρει κατά τη διάρκεια της εκτέλεσης του προγράμματος, θα χρειαστεί να ελευθερώσετε τη μνήμη που δεν χρησιμοποιείται free() (o delete(), στην περίπτωση που είναι αντικείμενα). Αν και είναι λογικό να αναμένεται ότι ο μεταγλωττιστής (GCC) θα βελτιστοποιήσει το πρόγραμμα για να αποφύγει την κατάτμηση της μνήμης, σίγουρα η απόδοση δεν θα είναι τόσο βέλτιστη όσο η εργασία με στατικά εκχωρημένη μνήμη.

    Αν και σε αυτό το παράδειγμα (και στις δύο υλοποιήσεις) δεν έχει πολύ νόημα, για να γενικεύσουμε τη λειτουργία για να μπορέσουμε να την εφαρμόσουμε σε άλλες περιπτώσεις, θα πρέπει να σημειωθεί ότι η αποστολή δεδομένων επαναλαμβάνει πάντα το ίδιο πρωτόκολλο: ειδοποιήστε τον αριθμό των byte που θα σταλούν, περιμένετε την ένδειξη (>) και στείλτε τα δεδομένα.

    Δεδομένου ότι σε αυτό το παράδειγμα χρησιμοποιείται μόνο μία φορά (ολόκληρο το αίτημα γίνεται σε ένα πακέτο), δεν φαίνεται πολύ χρήσιμο, αλλά, γενικά, μπορεί να είναι απαραίτητο να πραγματοποιηθούν πολλές αποστολές στην ίδια λειτουργία, συμπεριλαμβανομένων των περιπτώσεων στις οποίες πρέπει να μεταδοθούν σημαντικές ποσότητες δεδομένων που πρέπει να κατακερματιστούν για να αποφευχθεί η υπερχείλιση της μνήμης του ESP8266.

    Για την υλοποίηση αυτής της συμπεριφοράς, τα δύο τελευταία στοιχεία της σύνδεσης μπορούν να χρησιμοποιηθούν έτσι ώστε κάθε φορά που αποστέλλονται τα δεδομένα, τα δεδομένα να συμπληρώνονται με τις αντίστοιχες τιμές: στην πρώτη περίπτωση, ο αριθμός των byte που αποστέλλονται και στη δεύτερη, το (( μέρος του) αιτήματος.να διαβιβαστεί.

    Για να επαναλάβετε την ανάθεση και την αποστολή των διαφορετικών στοιχείων που πρέπει να μεταδοθούν μπορούν να αποθηκευτούν σε ένα διάνυσμα. Αυτό το νέο διάνυσμα θα είναι εκείνο που καθορίζει το τέλος της σύνθετης πράξης και όχι η τελευταία πράξη όπως μέχρι τώρα.

    1 σχόλιο

    σχόλια χρήστη
    ดูบอลสด

    Υπάρχουν σίγουρα πολλά να μάθετε για αυτό το θέμα. Μου αρέσουν όλα τα σημεία που έθεσες

    Δημοσίευση σχολίου

    Μπορεί να έχετε χάσει