- Απαιτήσεις
- Διάγραμμα κυκλώματος κατάστασης ύπνου ESP32
- Επισκόπηση των λειτουργιών ύπνου στο ESP32
- Προγραμματισμός ESP32 για λειτουργία Deep Sleep
- Δοκιμή ESP32 σε κατάσταση βαθιάς ύπνου
Το ESP32 είναι μια από τις πιο δημοφιλείς μονάδες μικροελεγκτή με βάση το Wi-Fi και είναι μια δημοφιλής επιλογή σε πολλές φορητές εφαρμογές IoT. Είναι ένας ισχυρός ελεγκτής που υποστηρίζει προγραμματισμό διπλού πυρήνα και διαθέτει επίσης ενσωματωμένη υποστήριξη Bluetooth χαμηλής ενέργειας (BLE), καθιστώντας την μια καλή επιλογή για φορητές εφαρμογές όπως σε συσκευές iBeacon, GPS Trackers κ.λπ. Ωστόσο, σε εφαρμογές με μπαταρία όπως αυτές, το κύριο μέλημα είναι η δημιουργία αντιγράφων ασφαλείας της μπαταρίας. Αυτό το αντίγραφο ασφαλείας της μπαταρίας μπορεί να αυξηθεί με τον εξυπνότερο έλεγχο της μονάδας μικροελεγκτή, όπως μπορεί να προγραμματιστεί το ESP32 σε κατάσταση αναστολής κατά τη διάρκεια της ιδανικής κατάστασης για αύξηση του αντιγράφου ασφαλείας της μπαταρίας της συσκευής.
Σε αυτό το έργο, θα ελέγξουμε την τρέχουσα κατανάλωση ευρέως δημοφιλούς μονάδας μικροελεγκτή με δυνατότητα Wi-Fi και Bluetooth ESP32 σε κανονική λειτουργία και σε κατάσταση βαθιάς ύπνου. Επίσης, θα δοκιμάσουμε τη διαφορά και θα ελέγξουμε πώς να θέσουμε το ESP32 σε κατάσταση βαθιάς ύπνου. Μπορείτε επίσης να δείτε το άρθρο σχετικά με τον τρόπο ελαχιστοποίησης της κατανάλωσης ενέργειας σε μικροελεγκτές για άλλες συμβουλές που μπορούν να χρησιμοποιηθούν για να κάνουν το σχέδιό σας πολύ πιο αποδοτικό. Επιπλέον, εάν σας ενδιαφέρει η κατάσταση αναστολής άλλων μικροελεγκτών, μπορείτε επίσης να δείτε τη λειτουργία ύπνου Arduino και τη λειτουργία αναστολής ESP8266 NodeMCU.
Απαιτήσεις
Για να γίνει αυτό, θα χρησιμοποιήσουμε το Devkit V4.0 με βάση το ESP32 από το Espressif που διαθέτει γέφυρα USB σε UART, καθώς και άλλα pinouts ESP32 για εύκολη σύνδεση. Ο προγραμματισμός θα γίνει με το Arduino IDE. Εάν είστε εντελώς νέος, τότε για να ξεκινήσετε με το ESP32 χρησιμοποιώντας το Arduino, διαβάστε το συνδεδεμένο άρθρο προτού συνεχίσετε.
Οι απαιτήσεις αυτού του έργου είναι οι εξής:
- Θα μεταβεί στη λειτουργία βαθιάς αναστολής με το πάτημα ενός κουμπιού.
- Θα ξυπνήσει από τη λειτουργία βαθιάς αναστολής με το πάτημα ενός άλλου κουμπιού.
- Για την ανίχνευση της κατάστασης του ESP32, ένα LED θα αναβοσβήνει με χρόνο ενεργοποίησης 1000 χιλιοστά του δευτερολέπτου. Κατά τη λειτουργία αναστολής λειτουργίας, θα απενεργοποιηθεί.
Επομένως, απαιτούνται πρόσθετα συστατικά-
- LED - 1 τεμ
- Κουμπί (διακόπτης αφής) - 2 τεμ
- 4.7k αντιστάσεις - 2 τεμ
- Αντίσταση 680R - 1 τεμ
- Ψωμί
- Συνδέστε το καλώδιο
- Προσαρμογέας 5V ή μονάδα τροφοδοσίας
- Καλώδιο micro-USB
- Arduino IDE με διεπαφή προγραμματισμού ESP32 σε υπολογιστή ή φορητό υπολογιστή.
Διάγραμμα κυκλώματος κατάστασης ύπνου ESP32
Το σχηματικό για να θέσετε το ESP32 σε αναστολή λειτουργίας με το πλήκτρο εμφανίζεται παρακάτω.
Το σχηματικό είναι πολύ απλό. Έχει δύο κουμπιά. Το κουμπί ύπνου θα θέσει το ESP32 σε κατάσταση νάρκης βαθιάς και ένας άλλος διακόπτης χρησιμοποιείται για την αφύπνιση του ESP32 από τη λειτουργία αναστολής λειτουργίας. Και τα δύο κουμπιά είναι συνδεδεμένα στο PIN 16 και το PIN 33. Και τα δύο κουμπιά έχουν διαμορφωθεί ως ενεργό χαμηλό όταν πατηθεί, επομένως δίνεται ένα επιπλέον pull-up. Ωστόσο, για να ανιχνευθεί εάν το ESP 32 βρίσκεται σε κατάσταση αναστολής λειτουργίας ή σε κατάσταση κανονικής λειτουργίας, το LED είναι συνδεδεμένο στο IO Pin 4.
Επισκόπηση των λειτουργιών ύπνου στο ESP32
Υπάρχουν πολλοί διαφορετικοί τρόποι λειτουργίας για το ESP32, δηλαδή ενεργός τρόπος λειτουργίας, modem sleep mode, light sleep mode, deep sleep mode και hibernation mode.
Κατά την κανονική κατάσταση λειτουργίας, το ESP32 λειτουργεί σε ενεργή λειτουργία. Κατά τη διάρκεια της ενεργής λειτουργίας ESP32, η CPU, το υλικό WiFi / BT, η μνήμη RTC και τα περιφερειακά RTC, οι συν-επεξεργαστές ULP, όλοι ενεργοποιούνται και λειτουργούν ανάλογα με τον φόρτο εργασίας. Ωστόσο, σε διαφορετικούς τρόπους λειτουργίας, ένα ή περισσότερα περιφερειακά απενεργοποιούνται. Για να ελέγξετε διαφορετικές λειτουργίες λειτουργίας, ακολουθήστε τον παρακάτω πίνακα-
Σκεύη, εξαρτήματα |
Ενεργή λειτουργία |
Λειτουργία modem-sleep |
Λειτουργία ελαφρού ύπνου |
Λειτουργία βαθύ ύπνου |
Χειμέρια νάρκη |
ΕΠΕΞΕΡΓΑΣΤΗΣ |
ΕΠΙ |
ΕΠΙ |
ΠΑΥΣΗ |
ΜΑΚΡΙΑ ΑΠΟ |
ΜΑΚΡΙΑ ΑΠΟ |
WiFi / BT |
ΕΠΙ |
ΜΑΚΡΙΑ ΑΠΟ |
ΜΑΚΡΙΑ ΑΠΟ |
ΜΑΚΡΙΑ ΑΠΟ |
ΜΑΚΡΙΑ ΑΠΟ |
Περιφερειακά RTC και RTC |
ΕΠΙ |
ΕΠΙ |
ΕΠΙ |
ΕΠΙ |
ΜΑΚΡΙΑ ΑΠΟ |
Επεξεργαστής ULP-Co |
ΕΠΙ |
ΕΠΙ |
ΕΠΙ |
ON / OFF |
ΜΑΚΡΙΑ ΑΠΟ |
Όπως μπορούμε να δούμε στον παραπάνω πίνακα ότι σε λειτουργία βαθιάς ύπνου ESP32 που ονομάζεται συχνά μοτίβο παρακολούθησης αισθητήρα ULP - η CPU, το WiFi / BT, η μνήμη RTC και τα περιφερειακά, όλοι οι επεξεργαστές ULP είναι απενεργοποιημένοι. Μόνο η μνήμη RTC και τα περιφερειακά RTC είναι ενεργοποιημένα.
Κατά τη διάρκεια της κατάστασης αφύπνισης, το ESP32 πρέπει να ειδοποιηθεί από μια πηγή αφύπνισης που θα ξυπνήσει το ESP32 από τη λειτουργία βαθιάς αναστολής. Ωστόσο, δεδομένου ότι τα περιφερειακά RTC είναι ενεργοποιημένα, το ESP32 μπορεί να ενεργοποιηθεί μέσω GPIO με δυνατότητα RTC. Υπάρχουν και άλλες επιλογές. Μπορεί να ξυπνήσει μέσω εξωτερικών ακίδων διακοπής αφύπνισης ή χρησιμοποιώντας χρονοδιακόπτη για να ξυπνήσει το ESP32. Σε αυτό το έργο, χρησιμοποιούμε ext0 wakeup στον ακροδέκτη 33
Προγραμματισμός ESP32 για λειτουργία Deep Sleep
Το πλήρες πρόγραμμα βρίσκεται στο κάτω μέρος αυτής της σελίδας. Είναι γραμμένο για το Arduino IDE και ως εκ τούτου μπορεί εύκολα να προσαρμοστεί στις απαιτήσεις σας. Η εξήγηση του κώδικα έχει ως εξής.
Στην αρχή του κώδικα, // Δημιουργία μεταβλητής PushButton PushBnt pushBtn = {GPIO_NUM_16, 0, false}; // καθορισμός Led Pin uint8_t led_pin = GPIO_NUM_4; // καθορισμός καρφίτσας αφύπνισης uint8_t wakeUp_pin = GPIO_NUM_33;
Οι παραπάνω τρεις γραμμές καθορίζουν τον πείρο αφύπνισης, τον πείρο LED και τον πείρο λειτουργίας αδράνειας.
void setup () { // βάλτε τον κωδικό εγκατάστασης εδώ, για να εκτελεστεί μία φορά: // ορίστε τη σειριακή θύρα σε 115200 Serial.begin (115200); καθυστέρηση (1000) // ορίστε τον πείρο pushButton ως είσοδο με εσωτερικό PullUp pinMode (pushBtn.pin, INPUT_PULLUP); // ρυθμίστε το χειριστή Interrupt με τον πείρο pushButton σε κατάσταση πτώσης attachInterrupt (pushBtn.pin, isr_handle, FALLING); // ορίστε το Led pin ως ouput pinMode (led_pin, OUTPUT); // δημιουργήστε μια εργασία που θα εκτελεστεί στη συνάρτηση blinkLed (), με προτεραιότητα 1 και θα εκτελεστεί στον πυρήνα 0 xTaskCreate ( blinkLed, / * Λειτουργία εργασίας. * / "blinkLed", / * όνομα εργασίας. * / 1024 * 2, / * Μέγεθος στοίβας εργασίας * / NULL, / * παράμετρος της εργασίας * / 5, / * προτεραιότητα της εργασίας * / & taskBlinkled); / * Λαβή εργασιών για παρακολούθηση της δημιουργημένης εργασίας * / καθυστέρηση (500). // Διαμόρφωση Pin 33 ως πηγή αφύπνισης ext0 με χαμηλό επίπεδο λογικής esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0); }
Στα παραπάνω, η διακοπή ρυθμίζεται σε κατάσταση πτώσης από το απόσπασμα κώδικα
attachInterrupt (pushBtn.pin, isr_handle, FALLING);
Επομένως, όποτε πατηθεί ο διακόπτης, το επίπεδο λογικής θα αλλάξει από τη λογική 1 (3.3V) σε λογική 0 (0V). Η τάση του πείρου κουμπιού θα μειωθεί και το ESP32 θα αναγνωρίσει ότι έχει πατηθεί ο διακόπτης. Υπάρχει επίσης μια εργασία που δημιουργήθηκε για να αναβοσβήνει το LED.
xTaskCreate (λειτουργία blinkLed, / * Εργασία. * / "blinkLed", / * όνομα εργασίας. * / 1024 * 2, / * Μέγεθος στοίβας εργασίας * / NULL, / * παράμετρος της εργασίας * / 5, / * προτεραιότητα της εργασίας * / & taskBlinkled); / * Λαβή εργασιών για παρακολούθηση της δημιουργημένης εργασίας * / καθυστέρηση (500).
Ο πείρος 33 διαμορφώνεται επίσης χρησιμοποιώντας το παρακάτω απόσπασμα κώδικα ως εξωτερική πηγή αφύπνισης που αναγνωρίζεται ως ext0.
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
Στη συνέχεια, στο βρόχο while-
void loop () { // βάλτε τον κύριο κωδικό σας εδώ, για να εκτελείται επανειλημμένα: if (pushBtn.pressed) { Serial.printf ("PushButton (% d) Pressed \ n", pushBtn.pin); Serial.printf ("Αναστολή της εργασίας" blinkLed '\ n "); // Αναστολή της εργασίας blinkLed vTaskSuspend (taskBlinkled); digitalWrite (led_pin, LOW); Serial.printf ("Θα κοιμηθεί….. \ n", pushBtn.pin); pushBtn.pressed = false; // Πηγαίνετε για ύπνο τώρα esp_deep_sleep_start (); } esp_sleep_wakeup_cause_t wakeupReason; wakeupReason = esp_sleep_get_wakeup_cause (); διακόπτης (wakeupReason) { case ESP_SLEEP_WAKEUP_EXT0: Serial.println ("using external signal ext0 for WakeUp From sleep"); Διακοπή; υπόθεση ESP_SLEEP_WAKEUP_EXT1: Serial.println ("χρησιμοποιώντας εξωτερικό σήμα ext1 για WakeUp From sleep"); Διακοπή; υπόθεση ESP_SLEEP_WAKEUP_TIMER: Serial.println ("χρησιμοποιώντας σήμα χρονοδιακόπτη για WakeUp From sleep"); Διακοπή; υπόθεση ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("χρησιμοποιώντας σήμα TouchPad για WakeUp From sleep"); Διακοπή; υπόθεση ESP_SLEEP_WAKEUP_ULP: Serial.println ("χρησιμοποιώντας σήμα ULP για WakeUp From sleep"); Διακοπή; προεπιλογή: break; Serial.printf ("Συνέχιση της εργασίας" blinkLed '\ n "); // επανεκκινήστε το blinkLed Task vTaskResume (taskBlinkled); } }
Ο βρόχος while ελέγχει συνεχώς εάν πατάτε το κουμπί ύπνου ή όχι. Εάν πατηθεί το κουμπί, θα σταματήσει ή θα αναστείλει την εργασία αναλαμπής LED και θα εκτελέσει τη λειτουργία εκκίνησης deep deep-
esp_deep_sleep_start ();
Σε αυτήν την περίπτωση, εάν πατηθεί το εξωτερικό κουμπί διακοπής ext0, θα ξυπνήσει αμέσως από τη λειτουργία βαθιάς αναστολής και θα συνεχίσει την εργασία αναβοσβήνει με led.
Τέλος, η λειτουργία LED αναβοσβήνει στα παρακάτω αποσπάσματα, θα αναβοσβήνει το LED 1000 ms δευτερόλεπτα.
void blinkLed (void * param) { ενώ (1) { static uint32_t pin_val = 0; // εναλλαγή της τιμής pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * Απλώς εναλλαγή του LED κάθε 1000ms ή 1sec * / vTaskDelay (1000 / portTICK_PERIOD_MS). } taskBlinkled = NULL; vTaskDelete (NULL); }
Δοκιμή ESP32 σε κατάσταση βαθιάς ύπνου
Το κύκλωμα είναι κατασκευασμένο σε breadboard και χρησιμοποιείται ένα πολύμετρο Metravi XB για τη μέτρηση του ρεύματος. Το ρεύμα που αντλείται από το κύκλωμα σε ενεργή λειτουργία είναι σχεδόν 58 mA, αλλά σε κατάσταση βαθιάς ύπνου, το ρεύμα είναι σχεδόν 4,10 mA. Στην παρακάτω εικόνα εμφανίζεται η τρέχουσα κατανάλωση ενεργού τρόπου ESP32 -
Στη λειτουργία βαθύ ύπνου, η τρέχουσα κατανάλωση καταγράφεται μειώθηκε στα 3,95mA περίπου, η παρακάτω εικόνα δείχνει την τρέχουσα κατανάλωση κατάστασης ύπνου ESP32-
Ωστόσο, σε κατάσταση βαθιάς ύπνου, η τρέχουσα κατανάλωση ESP32 είναι σχεδόν 150 uA. Ωστόσο, η καταγραμμένη τρέχουσα κατανάλωση για αυτήν την πλακέτα ESP32 Devkit είναι σχεδόν 4,10 mA. Αυτό οφείλεται στο CP2102 και στο Linear Regulator. Αυτά τα δύο συνδέονται με το καλώδιο 5V. Υπάρχει επίσης ένα LED τροφοδοσίας συνδεδεμένο στη γραμμή τροφοδοσίας που καταναλώνει σχεδόν 2mA ρεύματος.
Επομένως, μπορεί εύκολα να αναγνωριστεί ότι το ESP32 καταναλώνει πολύ χαμηλή ποσότητα ενέργειας σε κατάσταση λειτουργίας βαθύ ύπνου που είναι πολύ χρήσιμο για λειτουργίες με μπαταρία. Για περισσότερες πληροφορίες σχετικά με το πώς λειτούργησε, ρίξτε μια ματιά στο παρακάτω βίντεο. Εάν έχετε οποιεσδήποτε ερωτήσεις, αφήστε τις στην παρακάτω ενότητα σχολίων ή χρησιμοποιήστε τα Φόρουμ μας για άλλες τεχνικές ερωτήσεις.