สารบัญ:

ประหยัดแบตเตอรี่ด้วยการนอนหลับลึก: 20 ขั้นตอน
ประหยัดแบตเตอรี่ด้วยการนอนหลับลึก: 20 ขั้นตอน

วีดีโอ: ประหยัดแบตเตอรี่ด้วยการนอนหลับลึก: 20 ขั้นตอน

วีดีโอ: ประหยัดแบตเตอรี่ด้วยการนอนหลับลึก: 20 ขั้นตอน
วีดีโอ: เคล็ดลับการนอนให้สดชื่น เพิ่มภูมิต้านทาน และอ่อนวัยอยู่เสมอ by หมอแอมป์ (Sub Eng, Chinese, Arabic) 2024, พฤศจิกายน
Anonim
Image
Image
วิธีปลุกเครื่อง ESP32
วิธีปลุกเครื่อง ESP32

คุณสนใจที่จะใช้แบตเตอรี่กับ ESP32 ของคุณหรือไม่? ถ้าใช่ วันนี้ฉันจะมาพูดถึงข้อมูลทางเทคนิคที่สำคัญเกี่ยวกับเรื่องนี้ เรารู้ว่าไมโครคอนโทรลเลอร์นี้ใช้พลังงานมากเมื่อส่งข้อมูล กินไฟเกือบ 190 มิลลิแอมป์ ในวิดีโอนี้ ฉันจะแสดงวิธีประหยัดพลังงานจาก ESP32 ด้วยฟังก์ชันที่เรียกว่า "DEEP SLEEP" เราจะตั้งค่าให้ชิปเข้าสู่โหมดนี้ เรียนรู้วิธีออกจากโหมดนี้ และสร้างตัวอย่างที่แสดงสามวิธีในการปลุก ESP32

สิ่งสำคัญคือต้องจำไว้ว่าวิทยุใช้พลังงานเป็นจำนวนมาก แทนที่จะเป็นตัวประมวลผล การประหยัดพลังงานเป็นสิ่งสำคัญมาก เนื่องจากอุปกรณ์ปลายทาง (วงจรที่ส่งข้อมูล) มักใช้พลังงานจากแบตเตอรี่และควรใช้งานได้นานถึงห้าปี มีผู้ผลิตบางรายที่รับประกันว่าจะมีอายุการใช้งานยาวนานถึง 10 ปี และสิ่งนี้ใช้ได้กับแบตเตอรี่คุณภาพสูงที่ไม่ได้ใช้อุปกรณ์ปลายทางมากนัก ในกรณีอื่นๆ ฉันแนะนำให้คุณใช้ Deep Sleep เพื่อประหยัดพลังงานจากวงจรของคุณ

ขั้นตอนที่ 1: บทนำ

ESP32 มีโหมดประหยัดพลังงานที่เรียกว่า "Deep Sleep" ในโหมดนี้ CPU, RAM ส่วนใหญ่ และอุปกรณ์ต่อพ่วงนาฬิกาดิจิตอลทั้งหมดจะถูกปิด ส่วนเดียวของชิปที่ยังคงเชื่อมต่อได้คือตัวควบคุม RTC, อุปกรณ์ต่อพ่วง RTC (รวมถึงตัวประมวลผลร่วม ULP) และหน่วยความจำ RTC

เรามีหลายวิธีในการปลุกเครื่อง ESP32 เมื่ออยู่ในโหมดสลีป คุณสามารถตั้งค่าแหล่งที่มาของการปลุกได้ตลอดเวลาก่อนเข้าสู่โหมด Deep Sleep

ขั้นตอนที่ 2: วิธีปลุก ESP32

มีห้าวิธีในการปลุก ESP32:

• ตัวจับเวลา

• การปลุกภายนอก (ต่อ0)

• การปลุกภายนอก (ต่อ 1)

• ปลุกตัวประมวลผลร่วม ULP

• ทัชแพด

ขั้นตอนที่ 3: ตัวจับเวลา

ตัวควบคุม RTC มีตัวจับเวลาในตัวที่สามารถใช้เพื่อเปิดใช้งานชิปหลังจากระยะเวลาที่กำหนดไว้ล่วงหน้า เวลาถูกระบุด้วยความแม่นยำระดับไมโครวินาที

esp_deep_sleep_enable_timer_wakeup (uint64_t time_in_us)

time_in_us> คือเวลาในไมโครวินาที

ขั้นตอนที่ 4: การปลุกภายนอก (ต่อ0)

โมดูล RTC IO มีตรรกะที่จะทริกเกอร์การเตือนเมื่อหนึ่งใน RTC GPIO เข้าสู่ระดับตรรกะที่กำหนดไว้ล่วงหน้า RTC IO เป็นส่วนหนึ่งของโดเมนพลังงานของอุปกรณ์ต่อพ่วง RTC ดังนั้นอุปกรณ์ต่อพ่วง RTC จะคงอยู่ในระหว่างการหลับลึกหากมีการร้องขอแหล่งที่มาของการเปิดใช้งานนี้

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 = สูง)

ขั้นตอนที่ 5: การปลุกภายนอก (ต่อ 1)

ตัวควบคุม RTC มีตรรกะในการเรียกนาฬิกาปลุกโดยใช้ RTC GPIO หลายตัว

esp_deep_sleep_enable_ext1_wakeup (หน้ากาก uint64_t, โหมด esp_ext1_wakeup_mode_t)

mask> bit mask ของหมายเลข GPIO ที่จะทำให้เกิดการเปิดใช้งาน เฉพาะ GPIO ที่เปิดใช้งาน RTC เท่านั้นที่สามารถใช้ได้ในบิตแมปนี้: 0, 2, 4, 12-15, 25-27, 32-39

โหมด> เลือกฟังก์ชันลอจิกที่ใช้กำหนดเงื่อนไขการเปิดใช้งาน:

• ESP_EXT1_WAKEUP_ALL_LOW: ปลุกเมื่อ GPIO ที่เลือกทั้งหมดอยู่ใน LOW

• ESP_EXT1_WAKEUP_ANY_HIGH: ปลุกเมื่อ GPIO ที่เลือกมีค่าสูง

ขั้นตอนที่ 6: ตัวประมวลผลร่วม ULP Wakeup

ตัวประมวลผลร่วม ULP สามารถทำงานได้ในขณะที่ชิปอยู่ในโหมด Deep Sleep และสามารถใช้เพื่อค้นหาเซ็นเซอร์ ตรวจสอบ ADC หรือค่าเซ็นเซอร์สัมผัสแบบ capacitive และเปิดใช้งานชิปเมื่อตรวจพบเหตุการณ์เฉพาะ

ตัวประมวลผลร่วม ULP เป็นส่วนหนึ่งของโดเมนกำลังของอุปกรณ์ต่อพ่วง RTC และรันโปรแกรมที่เก็บไว้ใน RTC หน่วยความจำที่ช้า ดังนั้น อุปกรณ์ต่อพ่วง RTC และหน่วยความจำช้า RTC จะถูกเปิดใช้งานระหว่างโหมด Deep Sleep หากมีการร้องขอโหมดการเปิดใช้งานนี้

ขั้นตอนที่ 7: ทัชแพด

ตัวควบคุม RTC มีตรรกะในการทริกเกอร์การเตือนโดยใช้เซ็นเซอร์สัมผัสแบบ capacitive คำจำกัดความของหมุดสัมผัสนั้นแตกต่างกัน เราต้องใช้ทัชอินเทอร์รัปต์สำหรับแต่ละพินที่ต้องการ

หลังจากตั้งค่าอินเตอร์รัปต์ เราเปิดใช้งานโหมดปลุกเพื่อใช้เซ็นเซอร์

//กำหนดค่าทัชแพดเป็นแหล่งการปลุก 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: TIMER 4: ทัชแพด 5: ULP

esp_sleep_get_wakeup_cause();

หากเราตั้งค่าการปลุกด้วยทัชแพด เราสามารถกู้คืน GPIO ที่สัมผัสได้ผ่านคำสั่ง

esp_sleep_get_touchpad_wakeup_status();

ทุกครั้งที่ ESP32 ตื่นขึ้น เครื่องจะวนรอบการตั้งค่าอีกครั้ง ดังนั้นตัวแปรทั้งหมดที่ไม่ได้กำหนดไว้ในหน่วยความจำ RTC จะกลับสู่สถานะเดิม

หากต้องการเก็บตัวแปรไว้ในหน่วยความจำแม้ว่าจะหลับไปแล้วก็ตาม ให้ใช้การประกาศตัวแปรในตัวอย่างด้านล่าง:

//RTC_DATA_ATTR เปลี่ยน a ความทรงจำ 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 ให้ Boot เพื่อกำหนดค่าวิธีการปลุก

ขั้นตอนที่ 14: ห้องสมุดที่จำเป็น

ห้องสมุดที่ต้องการ
ห้องสมุดที่ต้องการ

เพื่อควบคุมจอแสดงผล OLED เราจำเป็นต้องมีไลบรารีภายนอก สำหรับสิ่งนี้ เราจะดาวน์โหลดไลบรารี U8g2

ใน Arduino IDE ให้ไปที่เมนู Sketch >> Include Library >> Manage Libraries ….

ขั้นตอนที่ 15: ไลบรารีและตัวแปร

เราได้รวมไลบรารี่เพื่อควบคุมจอแสดงผล OLED รวมถึงตัวสร้างของอินสแตนซ์ตัวควบคุมการแสดงผล นอกจากนี้เรายังจัดสรรตัวแปรในหน่วยความจำ RTC เราตั้งค่าความไวสำหรับการยอมรับการสัมผัส ปัจจัยการแปลงไมโครวินาทีเป็นวินาที และเวลาที่ ESP32 เข้าสู่โหมดสลีป (เป็นวินาที)

#include //biblioteca para controle do display oled

// ตัวสร้างดาอินสแตนเซียทำ controlador ทำจอแสดงผล //SDA = 21 e SCL = 22 U8X8_SSD1306_128X64_NONAME_SW_I2C แสดง (SCL, SDA, U8X8_PIN_NONE); //RTC_DATA_ATTR แบ่งปันกับหน่วยความจำ 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 3

ขั้นตอนที่ 16: ตั้งค่า

ในการตั้งค่า เราเพิ่มจำนวนครั้งที่เกิดการบู๊ต เราเรียกใช้ฟังก์ชันเพื่อพิมพ์ลวดลายการบูต หากหมายเลข Boot คือ PAR เราจะตั้งค่าให้ ESP32 ทำงานโดยใช้ปุ่ม (EXT0) หากเป็นทวีคูณของ 3 เราจะตั้งค่าให้ ESP32 ทำงานหลังจากเวลาที่กำหนด มิฉะนั้น เราจะตั้งค่าหมุดสัมผัสแบบ capacitive เพื่อปลุก ESP32 สุดท้าย เราตั้งค่าทัชแพดเป็นแหล่งการปลุกและบังคับให้ ESP32 เข้าสู่โหมดสลีป

การตั้งค่าเป็นโมฆะ () { Serial.begin (115200); ล่าช้า (1000); // เพิ่มจำนวน o ตัวเลข vezes que o BOOT ocorreu ++bootCount; กำหนดค่าการแสดงผล (); //chama a função para imprimir หรือ motivo do BOOT print_wakeup_reason(); //se o numero de boot สำหรับ PAR configuramos o ESP32 para despertar através do botão (EXT0) if (bootCount % 2 == 0) { esp_sleep_enable_ext0_wakeup (GPIO_NUM_39, 1); //1 = สูง 0 = ต่ำ } // ใช้สำหรับการกำหนดค่าหลายตัว 3 ตัว o ESP32 สำหรับการกำหนดเวลาที่กำหนด อย่างอื่นถ้า (bootCount % 3 == 0) { esp_sleep_enable_timer_wakeup (TIME_TO_SLEEP * uS_TO_S_FACTOR); } // caso contrario configuramos os pinos de touch capacitivo para despertar o ESP32 อื่น ๆ {// ตั้งค่าการขัดจังหวะบนทัชแพด 5 (GPIO12) touchAttachInterrupt (T5, โทรกลับ, เกณฑ์); //กำหนดค่าทัชแพดเป็นแหล่งการปลุก esp_sleep_enable_touchpad_wakeup(); } Serial.println("entrando em modo sleep"); esp_deep_sleep_start(); //força o ESP32 entrar em modo SLEEP }

ขั้นตอนที่ 17: วนซ้ำ โทรกลับ & กำหนดค่าการแสดงผล

ในลูปเราไม่มีอะไรทำ จากนั้นเราจะดำเนินการขัดจังหวะการโทรกลับหากเรามีสิ่งที่ต้องทำเมื่อเกิดการหยุดชะงัก เกี่ยวกับ configurationDisplay เราเริ่มต้นการแสดงผลและกำหนดค่าพารามิเตอร์บางอย่าง เราพิมพ์บนหน้าจอตามจำนวนครั้งที่การบู๊ตเกิดขึ้น

// nada a se fazer no loopvoid loop () { } // callback das interrupções void callback (){ //caso queira fazer algo ao ocorrer a interrupção } void configurationDisplay() { //inicializa o display e configura alguns parametros แสดง เริ่ม(); 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, สตริง(bootCount).c_str()); display.drawString(0, 4, "MOTIVO:"); }

ขั้นตอนที่ 18: Print_wakeup_reason (รู้สาเหตุของการตื่น)

ที่นี่ เรามีฟังก์ชันเพื่อพิมพ์สาเหตุของการปลุก ESP32 ตรวจสอบหมุดและพิมพ์บนจอแสดงผล

// função para imprimir สาเหตุที่ทำ ESP32 despertarvoid print_wakeup_reason () { esp_sleep_wakeup_cause_t wakeup_reason; เหตุผลของสตริง = ""; wakeup_reason = esp_sleep_get_wakeup_cause(); // กู้คืนสาเหตุทำสวิตช์ despertar (wakeup_reason) { กรณีที่ 1:reason = "EXT0 RTC_IO BTN"; หยุดพัก; กรณีที่ 2:reason = "EXT1 RTC_CNTL"; หยุดพัก; กรณีที่ 3:reason = "TIMER"; หยุดพัก; กรณีที่ 4:reason = "TOUCHPAD"; หยุดพัก; กรณีที่ 5:reason = "โปรแกรม ULP"; หยุดพัก; ค่าเริ่มต้น:reason = "ไม่มีสาเหตุ DS"; หยุดพัก; } Serial.println (เหตุผล); display.clearLine(6); //apaga a linha 6 ทำ display.drawString(0, 6, reason.c_str()); // กำหนดสาเหตุที่ทำให้สิ้นหวังไม่มีการแสดงผล // se despertou por TOUCHPAD, então vamos verificar em qual dos pinos ocorreu if (wakeup_reason == 4) { print_wakeup_touchpad (); //ยืนยัน o pino e imprime ไม่แสดงผล } }

ขั้นตอนที่ 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("ไม่ได้ปลุกด้วยทัชแพด"); หยุดพัก; } Serial.println("GPIO:"+GPIO); display.clearLine(7);//apaga a linha 7 do display display.drawString(0, 7, "GPIO: "); display.drawString(6, 7, GPIO.c_str()); // imprime o GPIO }

ขั้นตอนที่ 20: ดาวน์โหลดไฟล์

ไฟล์ PDF

ฉันไม่

แนะนำ: