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

Εξοικονόμηση ζωής μπαταρίας με βαθύ ύπνο: 20 βήματα
Εξοικονόμηση ζωής μπαταρίας με βαθύ ύπνο: 20 βήματα

Βίντεο: Εξοικονόμηση ζωής μπαταρίας με βαθύ ύπνο: 20 βήματα

Βίντεο: Εξοικονόμηση ζωής μπαταρίας με βαθύ ύπνο: 20 βήματα
Βίντεο: LW31 AGPTEK Smart Watch IP68: Things To Know Before Buy // For Android and iPhone 2024, Νοέμβριος
Anonim
Image
Image
Τρόποι αφύπνισης του ESP32
Τρόποι αφύπνισης του ESP32

Σας ενδιαφέρει να χρησιμοποιήσετε μια μπαταρία με το ESP32; Αν ναι, θα συζητήσω σήμερα μερικές σημαντικές τεχνικές πληροφορίες σχετικά με αυτό το θέμα. Γνωρίζουμε ότι αυτός ο μικροελεγκτής ξοδεύει πολύ ενέργεια όταν μεταδίδει πληροφορίες. Καταναλώνει κοντά στα 190 milliamps. Σε αυτό το βίντεο, θα δείξω πώς να εξοικονομείτε ενέργεια από το ESP32 με τη λεγόμενη λειτουργία "ΒΑΘΟΣ ΥΠΝΟΣ". Θα ορίσουμε το τσιπ να εισέρχεται σε αυτήν τη λειτουργία, θα μάθουμε τους τρόπους εξόδου από αυτήν τη λειτουργία και θα δημιουργήσουμε ένα παράδειγμα που θα δείχνει τρεις διαφορετικούς τρόπους αφύπνισης του ESP32.

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

Βήμα 1: Εισαγωγή

Το ESP32 διαθέτει λειτουργία εξοικονόμησης ενέργειας, που ονομάζεται "Deep Sleep". Σε αυτήν τη λειτουργία, οι CPU, η περισσότερη RAM και όλα τα ψηφιακά περιφερειακά είναι απενεργοποιημένα. Τα μόνα μέρη του τσιπ που μπορούν ακόμα να συνδεθούν είναι ο ελεγκτής RTC, τα περιφερειακά RTC (συμπεριλαμβανομένου του συμπαραγωγέα ULP) και οι μνήμες RTC.

Έχουμε πολλούς τρόπους να ξυπνήσουμε το ESP32 όταν κοιμόμαστε. Οι πηγές αφύπνισης μπορούν να ρυθμιστούν ανά πάσα στιγμή πριν από την είσοδο στη λειτουργία Deep Sleep.

Βήμα 2: Τρόποι αφύπνισης του ESP32

Υπάρχουν πέντε τρόποι αφύπνισης του ESP32:

• Χρονόμετρο

• Εξωτερική αφύπνιση (ext0)

• Εξωτερική αφύπνιση (ext1)

• Ξυπνητήρας ULP με τον επεξεργαστή

• Επιφάνεια αφής

Βήμα 3: Χρονόμετρο

Ο ελεγκτής RTC διαθέτει ενσωματωμένο χρονοδιακόπτη που μπορεί να χρησιμοποιηθεί για την ενεργοποίηση του τσιπ μετά από προκαθορισμένο χρονικό διάστημα. Ο χρόνος καθορίζεται με ακρίβεια μικροδευτερολέπτου.

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> είναι ο χρόνος σε μικροδευτερόλεπτα

Βήμα 4: Εξωτερική αφύπνιση (ext0)

Η ενότητα RTC IO περιέχει λογική για την ενεργοποίηση του συναγερμού όταν ένας από τους RTC GPIO εισέλθει σε ένα προκαθορισμένο λογικό επίπεδο. Το RTC IO είναι μέρος του τομέα ισχύος των περιφερειακών RTC, επομένως τα περιφερειακά RTC θα διατηρηθούν ζωντανά κατά τη διάρκεια του Deep Sleep εάν ζητηθεί αυτή η πηγή ενεργοποίησης.

esp_deep_sleep_enable_ext0_wakeup (gpio_num_t gpio_num, int επίπεδο)

gpio_num> αριθμός GPIO που χρησιμοποιείται ως πηγή ενεργοποίησης. Μπορούν να χρησιμοποιηθούν μόνο GPIO που λειτουργούν με RTC: 0, 2, 4, 12-15, 25-27, 32-39.

επίπεδο> επίπεδο εισόδου που θα ενεργοποιήσει τον συναγερμό (0 = ΧΑΜΗΛΟ, 1 = Υ HIGHΟΣ)

Βήμα 5: Εξωτερική αφύπνιση (ext1)

Ο ελεγκτής RTC περιέχει λογική για την ενεργοποίηση του ξυπνητηριού χρησιμοποιώντας πολλαπλούς RTC GPIO.

esp_deep_sleep_enable_ext1_wakeup (uint64_t mask, esp_ext1_wakeup_mode_t mode)

mask> bit mask των αριθμών GPIO που θα προκαλέσει ενεργοποίηση. Σε αυτό το bitmap μπορούν να χρησιμοποιηθούν μόνο GPIO με δυνατότητα RTC: 0, 2, 4, 12-15, 25-27, 32-39.

mode> επιλέξτε τη λογική συνάρτηση που χρησιμοποιείται για τον προσδιορισμό της συνθήκης ενεργοποίησης:

• ESP_EXT1_WAKEUP_ALL_LOW: αφυπνίζεται όταν όλα τα επιλεγμένα GPIO είναι σε LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: αφυπνίζεται όταν κάποιο από τα επιλεγμένα GPIO είναι Υ HIGHΗΛΑ

Βήμα 6: Ξύπνημα ULP με τον επεξεργαστή

Ο συνεπεξεργαστής ULP μπορεί να λειτουργήσει ενώ το τσιπ βρίσκεται σε Deep Sleep και μπορεί να χρησιμοποιηθεί για αναζήτηση αισθητήρων, παρακολούθηση τιμών ADC ή χωρητικών αισθητήρων αφής και ενεργοποίηση του τσιπ όταν εντοπιστεί ένα συγκεκριμένο συμβάν.

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

Βήμα 7: Επιφάνεια αφής

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

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

// Διαμόρφωση της επιφάνειας αφής ως πηγής αφύπνισης esp_sleep_enable_touchpad_wakeup ();

Βήμα 8: Εισαγωγή στη λειτουργία Deep Sleep

Μετά τη ρύθμιση της λειτουργίας αφύπνισης, αρκεί μια μόνο εντολή για να τοποθετήσετε το ESP32 στη λειτουργία Deep Sleep (δαπάνη 2,5 μA ή λιγότερο). Τονίζω εδώ ότι αυτή η δαπάνη είναι από το τσιπ ESP και όχι το πιάτο, καθώς το τελευταίο ξοδεύει περισσότερα.

esp_deep_sleep_start ();

Από αυτήν την εντολή, το ESP32 αποκοιμιέται και δεν εκτελεί τις επόμενες γραμμές κώδικα για παράδειγμα.

Σημαντικό: Όλες οι ρυθμίσεις αφύπνισης πρέπει να πραγματοποιηθούν πριν από την εκτέλεση της παραπάνω εντολής.

Βήμα 9: Εδώ είναι μερικές πιο σημαντικές πληροφορίες

Εδώ είναι μερικές πιο σημαντικές πληροφορίες
Εδώ είναι μερικές πιο σημαντικές πληροφορίες

Η παρακάτω κλήση επιστρέφει την αιτία της αφύπνισης ESP32.

1: EXT0 2: EXT1 3: ΧΡΟΝΟΣ 4: TOUCHPAD 5: ULP

esp_sleep_get_wakeup_cause ();

Εάν ορίσουμε την αφύπνιση από την επιφάνεια αφής, μπορούμε να ανακτήσουμε ποιο GPIO ότι το άγγιγμα πραγματοποιήθηκε μέσω της εντολής

esp_sleep_get_touchpad_wakeup_status ();

Κάθε φορά που το ESP32 ξυπνάει, θα περνά ξανά από τη ρύθμιση. Έτσι όλες οι μεταβλητές που δεν ορίζονται στη μνήμη RTC θα επιστρέψουν στην αρχική τους κατάσταση.

Για να διατηρήσετε τις μεταβλητές στη μνήμη ακόμη και μετά τον ύπνο, χρησιμοποιήστε τη δήλωση μεταβλητής στο παρακάτω παράδειγμα:

// RTC_DATA_ATTR aloca a variável and memória RTCRTC_DATA_ATTR int bootCount = 0;

Βήμα 10: Επίδειξη

Επίδειξη
Επίδειξη

Το βίντεο δείχνει το πρόγραμμα να λειτουργεί, σύμφωνα με την εικόνα.

Βήμα 11: WiFi NodeMCU-32S ESP-WROOM-32

WiFi NodeMCU-32S ESP-WROOM-32
WiFi NodeMCU-32S ESP-WROOM-32

Βήμα 12: Συναρμολόγηση

Συνέλευση
Συνέλευση

Βήμα 13: Πρόγραμμα

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

Βήμα 14: Απαιτείται βιβλιοθήκη

Απαιτείται βιβλιοθήκη
Απαιτείται βιβλιοθήκη

Για τον έλεγχο της οθόνης OLED, χρειαζόμαστε μια εξωτερική βιβλιοθήκη. Για αυτό, θα κατεβάσουμε τη βιβλιοθήκη U8g2.

Στο Arduino IDE, μεταβείτε στο μενού Sketch >> Include Library >> Manage Libraries….

Βήμα 15: Βιβλιοθήκες και μεταβλητές

Έχουμε συμπεριλάβει τη βιβλιοθήκη για τον έλεγχο της οθόνης OLED, καθώς και έναν κατασκευαστή της παρουσίας του ελεγκτή οθόνης. Επίσης, διαθέτουμε τη μεταβλητή στη μνήμη RTC. Ρυθμίζουμε την ευαισθησία για αποδοχή αφής, τον συντελεστή μετατροπής μικροδευτερολέπτου για δευτερόλεπτα και την ώρα που το ESP32 μεταβαίνει σε κατάσταση αναστολής λειτουργίας (σε δευτερόλεπτα).

#include // biblioteca para controle do display oled

// construtor da instancia do controlador do display // SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C display (SCL, SDA, U8X8_PIN_NONE); // RTC_DATA_ATTR aloca a variável na memoria RTC RTC_DATA_ATTR int bootCount = 0; // sensibilidade para aceitação do toque #define Threshold 40 // fator de conversão de microsegundos para segundos #define uS_TO_S_FACTOR 1000000 // tempo que o ESP32 ficará em modo sleep (em segundos) #define TIME_TO_SLEEP

Βήμα 16: Ρύθμιση

Στη ρύθμιση, αυξάνουμε τον αριθμό των φορών που προέκυψε η εκκίνηση. Καλούμε τη λειτουργία εκτύπωσης του μοτίβου εκκίνησης. Εάν ο αριθμός εκκίνησης είναι PAR, ρυθμίζουμε το ESP32 να ξυπνά μέσω του κουμπιού (EXT0). Εάν είναι πολλαπλάσιο του 3, θέτουμε το ESP32 να ξυπνά μετά από καθορισμένο χρόνο. Διαφορετικά, ρυθμίζουμε τις χωρητικές ακίδες αφής για να ξυπνήσουμε το ESP32. Τέλος, ορίζουμε το Touchpad ως πηγή αφύπνισης και αναγκάζουμε το ESP32 να εισέλθει σε κατάσταση αναστολής λειτουργίας.

void setup () {Serial.begin (115200); καθυστέρηση (1000)? // incrementa o numero de vezes que o BOOT ocorreu ++ bootCount; configureDisplay (); // chama a função para imprimir o motivo do BOOT print_wakeup_reason (); // se numero de boot for PAR configuramos or ESP32 at despertar através do botão (EXT0) if (bootCount % 2 == 0) {esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); // 1 = Υψηλός, 0 = Χαμηλός // // για πολλαπλές ρυθμίσεις 3 διαμορφώσεων ή ESP32 για να ρυθμίσετε το τέλος ορισμού άλλου αν (bootCount % 3 == 0) {esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configuramos os pinos de touch capacitivo για despertar o ESP32 else {// Διακοπή εγκατάστασης στο Touch Pad 5 (GPIO12) touchAttachInterrupt (T5, callback, Threshold); // Διαμόρφωση της επιφάνειας αφής ως πηγής αφύπνισης esp_sleep_enable_touchpad_wakeup (); } Serial.println ("entrando em modo sleep"); esp_deep_sleep_start (); // força o ESP32 entrar em modo SLEEP}

Βήμα 17: Loop, Callback & ConfigureDisplay

Στο Loop, δεν έχουμε τίποτα να κάνουμε. Στη συνέχεια, προχωρούμε στη διακοπή της επανάκλησης εάν έχουμε κάτι να κάνουμε όταν προκύψει η διακοπή. Όσον αφορά το configureDisplay, αρχικοποιούμε την οθόνη και διαμορφώνουμε ορισμένες παραμέτρους. Εκτυπώνουμε στην οθόνη πόσες φορές συνέβη το Boot.

// nada a se fazer no loopvoid loop () {} // callback das interrupções void callback () {// caso queira fazer algo ao ocorrer a interrupção} void configureDisplay () {// inicializa o display and configura alguns parametros display. να αρχίσει(); display.setPowerSave (0); // modo powerSave (0-Off? 1-On) display.setFont (u8x8_font_torussansbold8_u); // fonte utilizada // imprime no display os numero de vezes que aconteceu o BOOT display.drawString (0, 0, "BOOT NUM:"); display.drawString (0, 2, String (bootCount).c_str ()); display.drawString (0, 4, "MOTIVO:"); }

Βήμα 18: Λόγος Print_wakeup_re (γνωρίζοντας την αιτία της αφύπνισης)

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

// função para imprimir a causa do ESP32 despertarvoid print_wakeup_reason () {esp_sleep_wakeup_cause_t wakeup_reason; String reason = ""; wakeup_reason = esp_sleep_get_wakeup_cause (); // recupera a causa do despertar switch (wakeup_reason) {case 1: reason = "EXT0 RTC_IO BTN"; Διακοπή; περίπτωση 2: λόγος = "EXT1 RTC_CNTL"; Διακοπή; περίπτωση 3: λόγος = "ΧΡΟΝΟΣ"; Διακοπή; περίπτωση 4: λόγος = "TOUCHPAD"; Διακοπή; περίπτωση 5: λόγος = "ΠΡΟΓΡΑΜΜΑ ULP"; Διακοπή; προεπιλογή: reason = "NO DS CAUSE"; Διακοπή; } Serial.println (λόγος); display.clearLine (6); // apaga a linha 6 do display.drawString (0, 6, reason.c_str ()); // imprime a causa do despertar no display // se despertou por TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) {print_wakeup_touchpad (); // verifica o pino e imprime no display}}

Βήμα 19: Print_wakeup_touchpad (γνωρίζετε το GPIO Touch)

Τώρα, σε αυτό το βήμα, έχουμε τη λειτουργία να εκτυπώσουμε την καρφίτσα που αγγίχθηκε. Ανακτήσαμε το GPIO που ξύπνησε το ESP32 και το εκτυπώσαμε στην οθόνη.

// função para imprimir o pino que foi tocadovoid print_wakeup_touchpad () {touch_pad_t touchPin; touchPin = esp_sleep_get_touchpad_wakeup_status (); // recupera o GPIO que despertou o ESP32 String GPIO = ""; διακόπτης (touchPin) {περίπτωση 0: GPIO = "4"; Διακοπή; περίπτωση 1: GPIO = "0"; Διακοπή; περίπτωση 2: GPIO = "2"; Διακοπή; περίπτωση 3: GPIO = "15"; Διακοπή; περίπτωση 4: GPIO = "13"; Διακοπή; περίπτωση 5: GPIO = "12"; Διακοπή; περίπτωση 6: GPIO = "14"; Διακοπή; περίπτωση 7: GPIO = "27"; Διακοπή; περίπτωση 8: GPIO = "33"; Διακοπή; περίπτωση 9: GPIO = "32"; Διακοπή; προεπιλογή: Serial.println ("Wakeup not by touchpad"); Διακοπή; } Serial.println ("GPIO:"+GPIO); display.clearLine (7); // apaga a linha 7 do display.drawString (0, 7, "GPIO:"); display.drawString (6, 7, GPIO.c_str ()); // imprime o GPIO}

Βήμα 20: Κατεβάστε τα αρχεία

PDF

ΕΓΩ ΔΕΝ

Συνιστάται: