- ข้อกำหนด
- แผนภาพวงจรโหมดสลีป ESP32
- ภาพรวมของโหมดสลีปใน ESP32
- การเขียนโปรแกรม ESP32 สำหรับโหมด Deep Sleep
- การทดสอบ ESP32 ในโหมด Deep Sleep
ESP32 เป็นหนึ่งในความนิยมมากที่สุด Wi-Fi ตามโมดูลไมโครคอนโทรลเลอร์และมันก็เป็นทางเลือกที่นิยมในหลายงานแบบพกพา IOT เป็นคอนโทรลเลอร์ที่ทรงพลังที่รองรับการเขียนโปรแกรมแบบ Dual Core และยังรองรับ Bluetooth Low Energy (BLE) ในตัวทำให้เป็นตัวเลือกที่ดีสำหรับแอพพลิเคชั่นพกพาเช่นในอุปกรณ์ iBeacon, GPS Trackers เป็นต้นอย่างไรก็ตามในแอพพลิเคชั่นที่ใช้แบตเตอรี่เช่นนี้ ปัญหาสำคัญคือแบตเตอรี่สำรอง แบตเตอรี่สำรองนี้สามารถเพิ่มขึ้นได้โดยการควบคุมอย่างชาญฉลาดกว่าหน่วยไมโครคอนโทรลเลอร์เช่นเดียวกับที่สามารถตั้งโปรแกรม ESP32 ในโหมดสลีประหว่างสภาวะที่เหมาะสมเพื่อเพิ่มการสำรองแบตเตอรี่ของอุปกรณ์
ในโครงการนี้เราจะตรวจสอบการใช้งานปัจจุบันของหน่วยไมโครคอนโทรลเลอร์ที่เปิดใช้งาน Wi-Fi และ Bluetooth ที่เป็นที่นิยมอย่างแพร่หลาย ESP32 ในโหมดการทำงานปกติและโหมดหลับลึก นอกจากนี้เราจะทดสอบความแตกต่างและตรวจสอบวิธีทำให้ ESP32 อยู่ในโหมดหลับลึก คุณยังสามารถอ่านบทความเกี่ยวกับวิธีลดการใช้พลังงานในไมโครคอนโทรลเลอร์สำหรับเคล็ดลับอื่น ๆ ที่สามารถใช้เพื่อทำให้การออกแบบของคุณประหยัดพลังงานมากขึ้น นอกจากนี้หากคุณสนใจโหมดสลีปของไมโครคอนโทรลเลอร์อื่น ๆ คุณสามารถเลือก Arduino Sleep mode และ ESP8266 NodeMCU Sleep mode ได้เช่นกัน
ข้อกำหนด
ในการทำเช่นนี้เราจะใช้ Devkit V4.0 ที่ใช้ ESP32 จาก Espressif ที่มี USB ไปยังสะพาน UART รวมถึงพินอื่น ๆ ของ ESP32 เพื่อการเชื่อมต่อที่ง่าย การเขียนโปรแกรมจะทำด้วย Arduino IDE หากคุณเป็นมือใหม่สำหรับการเริ่มต้นกับ ESP32 โดยใช้ Arduino โปรดอ่านบทความที่เชื่อมโยงก่อนดำเนินการต่อ
ข้อกำหนดของโครงการนี้มีดังต่อไปนี้ -
- มันจะเข้าสู่โหมดหลับลึกโดยการกดปุ่ม
- มันจะตื่นจากโหมดหลับลึกโดยการกดปุ่มอื่น
- ในการตรวจจับสถานะของ ESP32 ไฟ LED จะกะพริบพร้อมเวลาเปิดเครื่อง 1,000 มิลลิวินาที ในระหว่างโหมดสลีปเครื่องจะปิด
ดังนั้นส่วนประกอบเพิ่มเติมที่จำเป็น -
- LED - 1 ชิ้น
- ปุ่มกด (สวิตช์สัมผัส) - 2 ชิ้น
- ตัวต้านทาน 4.7k - 2 ชิ้น
- ตัวต้านทาน 680R - 1 ชิ้น
- เขียงหั่นขนม
- เกี่ยวลวด
- อะแดปเตอร์ 5V หรือหน่วยจ่ายไฟ
- สายไมโคร USB
- Arduino IDE พร้อมอินเทอร์เฟซการเขียนโปรแกรม ESP32 ในพีซีหรือแล็ปท็อป
แผนภาพวงจรโหมดสลีป ESP32
แผนผังที่จะทำให้ ESP32 เข้าสู่โหมดสลีปด้วยปุ่มกดแสดงอยู่ด้านล่าง
แผนผังค่อนข้างเรียบง่าย มันมีสองปุ่ม ปุ่มสลีปจะทำให้ ESP32 อยู่ในโหมดหลับลึกและสวิตช์อื่นใช้สำหรับปลุก ESP32 จากโหมดสลีป ปุ่มทั้งสองเชื่อมต่อกันใน PIN 16 และ PIN 33 ปุ่มทั้งสองได้รับการกำหนดค่าให้ใช้งานได้ต่ำเมื่อกดดังนั้นจึงมีการดึงขึ้นเพิ่มเติม อย่างไรก็ตามในการตรวจสอบว่า ESP 32 อยู่ในโหมดสลีปหรือโหมดสภาวะการทำงานปกติ LED จะเชื่อมต่อกับ IO Pin 4
ภาพรวมของโหมดสลีปใน ESP32
มีโหมดพลังงานที่แตกต่างกันมากมายสำหรับ ESP32ได้แก่ โหมดแอคทีฟโหมดสลีปของโมเด็มโหมดสลีปเบาโหมดหลับลึกและโหมดไฮเบอร์เนต
ในระหว่างสภาวะการทำงานปกติ ESP32 จะทำงานในโหมดแอคทีฟ ระหว่างโหมดแอคทีฟ ESP32 CPU, ฮาร์ดแวร์ WiFi / BT, หน่วยความจำ RTC และอุปกรณ์ต่อพ่วง RTC, โปรเซสเซอร์ร่วม ULP ทั้งหมดจะเปิดใช้งานและทำงานขึ้นอยู่กับปริมาณงาน อย่างไรก็ตามในโหมดพลังงานที่แตกต่างกันอุปกรณ์ต่อพ่วงอย่างน้อยหนึ่งอย่างจะถูกปิด หากต้องการตรวจสอบการทำงานของโหมดพลังงานต่างๆให้ทำตามตารางด้านล่าง -
ฮาร์ดแวร์ |
โหมดแอคทีฟ |
โหมดสลีปโมเด็ม |
โหมด Light Sleep |
โหมดหลับลึก |
ไฮเบอร์เนต |
ซีพียู |
บน |
บน |
หยุด |
ปิด |
ปิด |
WiFi / BT |
บน |
ปิด |
ปิด |
ปิด |
ปิด |
RTC และ RTC อุปกรณ์ต่อพ่วง |
บน |
บน |
บน |
บน |
ปิด |
โปรเซสเซอร์ ULP-Co |
บน |
บน |
บน |
เปิดปิด |
ปิด |
ดังที่เราเห็นในตารางด้านบนว่าในโหมดดีพสลีป 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 และพินโหมดสลีป
การตั้งค่าเป็นโมฆะ () { // ใส่รหัสการตั้งค่าของคุณที่นี่เพื่อเรียกใช้ครั้งเดียว: // ตั้งค่าพอร์ตอนุกรมที่ 115200 Serial.begin (115200); ล่าช้า (1,000); // ตั้งค่าพิน pushButton เป็นอินพุตด้วยพิน PullUp ภายใน (pushBtn.pin, INPUT_PULLUP); // ตั้งค่าตัวจัดการขัดจังหวะด้วยพิน pushButton ในโหมด Falling attachInterrupt (pushBtn.pin, isr_handle, FALLING); // ตั้งค่าขา Led เป็น ouput pinMode (led_pin, OUTPUT); // สร้างงานที่จะดำเนินการในฟังก์ชัน blinkLed () โดยมีลำดับความสำคัญ 1 และดำเนินการบน core 0 xTaskCreate ( blinkLed, / * Task function. * / "blinkLed", / * name of task. * / 1024 * 2, / * ขนาดกองของงาน * / NULL, / * พารามิเตอร์ของงาน * / 5, / * ลำดับความสำคัญของงาน * / & taskBlinkled); / * ตัวจัดการงานเพื่อติดตามงานที่สร้างขึ้น * / ล่าช้า (500); // กำหนดค่า Pin 33 เป็นแหล่งปลุก ext0 ด้วยระดับลอจิก LOW 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, / * Task function. * / "blinkLed", / * name of task. * / 1024 * 2, / * Stack size of task * / NULL, / * พารามิเตอร์ของงาน * / 5, / * ลำดับความสำคัญ ของงาน * / & taskBlinkled); / * ตัวจัดการงานเพื่อติดตามงานที่สร้างขึ้น * / ล่าช้า (500);
นอกจากนี้พิน 33 ยังได้รับการกำหนดค่าโดยใช้ข้อมูลโค้ดด้านล่างเป็นแหล่งปลุกภายนอกที่ระบุว่าเป็น ext0
esp_sleep_enable_ext0_wakeup ((gpio_num_t) wakeUp_pin, 0);
ถัดไปใน while loop-
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 = เท็จ; // ไปนอนได้แล้ว 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 จากโหมดสลีป"); หยุดพัก; กรณี ESP_SLEEP_WAKEUP_TIMER: Serial.println ("ใช้สัญญาณจับเวลาสำหรับ WakeUp จากโหมดสลีป"); หยุดพัก; กรณี ESP_SLEEP_WAKEUP_TOUCHPAD: Serial.println ("ใช้สัญญาณทัชแพดสำหรับ WakeUp From sleep"); หยุดพัก; กรณี ESP_SLEEP_WAKEUP_ULP: Serial.println ("ใช้สัญญาณ ULP สำหรับ WakeUp From sleep"); หยุดพัก; ค่าเริ่มต้น: ทำลาย; Serial.printf ("ดำเนินงาน 'blinkLed' ต่อ \ n"); // รีสตาร์ทงาน blinkLed vTaskResume (taskBlinkled); } }
ห่วง while ตรวจสอบอย่างต่อเนื่องว่ากดปุ่มสลีปหรือไม่ หากกดปุ่มปุ่มนี้จะหยุดหรือพักงาน LED กะพริบและเรียกใช้ฟังก์ชันเริ่มการนอนหลับโดยเฉพาะ
esp_deep_sleep_start ();
ในสถานการณ์นี้หากกดปุ่มขัดจังหวะภายนอก ext0 ปุ่มดังกล่าวจะตื่นขึ้นมาทันทีจากโหมดพักลึกและดำเนินการกะพริบไฟ LED ต่อ
สุดท้ายฟังก์ชั่นกะพริบ LED สามารถมองเห็นได้ในตัวอย่างด้านล่างซึ่งจะกะพริบ LED 1,000 ms วินาที
โมฆะ blinkLed (โมฆะ * พารามิเตอร์) { ในขณะที่ (1) { uint32_t pin_val = 0; // สลับค่าพิน pin_val ^ = 1; digitalWrite (led_pin, pin_val); Serial.printf ("Led -----------------% s \ n", pin_val? "On": "Off"); / * เพียงแค่สลับ LED ทุกๆ 1,000ms หรือ 1 วินาที * / vTaskDelay (1000 / portTICK_PERIOD_MS); } taskBlinkled = NULL; vTaskDelete (NULL); }
การทดสอบ ESP32 ในโหมด Deep Sleep
วงจรถูกสร้างขึ้นในเขียงหั่นขนมและใช้มัลติมิเตอร์รุ่น Metravi XB เพื่อวัดกระแส กระแสที่วงจรดึงออกมาในโหมดแอคทีฟเกือบ 58 mA แต่ในโหมดหลับลึกกระแสจะอยู่ที่เกือบ 4.10 mA ภาพด้านล่างแสดงการใช้กระแสโหมดแอคทีฟ ESP32 -
ในโหมดหลับลึกการบริโภคปัจจุบันจะถูกบันทึกลดลงเหลือประมาณ 3.95mA ภาพด้านล่างแสดงการบริโภคปัจจุบันของโหมด Deep SleepของESP32 -
อย่างไรก็ตามในโหมดหลับลึกการบริโภคปัจจุบันของ ESP32 อยู่ที่เกือบ 150 uA แต่การใช้กระแสไฟฟ้าที่บันทึกไว้สำหรับบอร์ด ESP32 Devkit นี้อยู่ที่เกือบ 4.10 mA นี่เป็นเพราะ CP2102 และ Linear Regulator สองตัวนี้เชื่อมต่อกับสายไฟ 5V นอกจากนี้ยังมีไฟ LED ที่เชื่อมต่ออยู่ในสายไฟที่ใช้กระแสไฟฟ้าเกือบ 2mA
ดังนั้นจึงสามารถระบุได้อย่างง่ายดายว่า ESP32 ใช้พลังงานในปริมาณที่ต่ำมากในโหมดหลับลึกซึ่งมีประโยชน์มากสำหรับการใช้พลังงานแบตเตอรี่ สำหรับข้อมูลเพิ่มเติมเกี่ยวกับวิธีการทำงานโปรดดูวิดีโอที่ลิงก์ด้านล่าง หากคุณมีคำถามใด ๆ ทิ้งไว้ในส่วนความคิดเห็นด้านล่างหรือใช้ฟอรัมของเราสำหรับคำถามทางเทคนิคอื่น ๆ