MicroPython ESP32 : โหมดประหยัดพลังงาน Deep Sleep ด้วย ESP32
Deep Sleep คือโหมดประหยัดพลังงานที่มีใน ESP32 หมายถึง การใช้วงจรไฟฟ้าภายใน ESP32 เป็นตัวกระตุ้น แล้วทำให้ ESP32 ตื่นขึ้นมา มักจะหมายถึงการปลุกให้ตื่นตามเวลาด้วย RTC โดยปกติแม้ส่วนวงจรอื่น ๆ ของ ESP32 จะถูกปิดการทำงาน แต่ส่วนของ RTC จะยังนับ และจดจำค่าเวลาต่อไปเรื่อย ๆ ตราบใดที่ยังมีการจ่ายพลังงานไฟฟ้าเลี้ยงอยู่ตลอด เพื่อรอการดึงค่าเวลาออกมาใช้งาน
โมดูล WiFi, แกนการประมวลผลและโมดูล Bluetooth นั้นต้องใช้กระแสไฟจำนวนมากในการทำงานดังนั้นหากเราต้องการประหยัดพลังงานเราต้องปิดการใช้งานเมื่อไม่ใช้งาน นี่คือสิ่งที่เรากำลังจะทำตอนนี้ คือเราจะนำ ESP32 ไปยังโหมด Deep – Sleep ที่จะปิดการใช้งานทุกอย่างยกเว้นโมดูล RTC
โหมดการใช้งาน Deep Sleep จะแบ่งได้ตามวิธีการ “ปลุกให้ตื่น” โดยสามารถแบ่งลักษณะการปลุกให้ตื่นด้วยเหตุการณ์ภายนอก และ ตื่นด้วยเหตุการณ์ภายใน
การปลุกให้ตื่นด้วยเหตุการณ์ภายนอก หมายถึง การทำให้ ESP32 กลับมาเริ่มทำงานใหม่ด้วยการกระตุ้นจากภายนอก แบ่งการกระตุ้นได้ 2 แบบ คือ
- ใช้เซ็นเซอร์สัมผัส – เหมาะสำหรับการใช้นิ้วสัมผัสโดยตรงเพื่อให้ ESP32 สามารถกลับมาทำงานได้
- เปลี่ยนสถานะ GPIO – ใช้เมื่อต้องการให้อุปกรณ์อื่นกระตุ้นทำให้เกิดการตื่นขึ้นมา เช่น การใช้งานเซ็นเซอร์ต่าง ๆ เพื่อกระตุ้นให้เกิดการส่งข้อมูลทันที
โดยในบทความนี้จะเลือกใช้แบบที่ 1 คือ ปลุกให้ตื่นโดยใช้เซ็นเซอร์สัมผัส
โดยมีขั้นตอนการทำงานดังนี้
1 : อุปกรณ์ที่ใช้
- 1. TTGO T8 V1.7 ESP32 Development Board 4MB PSRAM TF Card
- 2. Micro USB Cable Wire 1m for NodeMCU
- 3. หลอดไฟ LED 5mm สีแดง
- 4. รีซิสเตอร์ 220 OHM 1/4W 5%
- 5. รีซิสเตอร์ 10K Ohm 1/4W 5%
- 6. Push Button Switch สวิตช์กดติดปล่อยดับ 2 ขา
- 7. Jumper (M2M) cable 20cm Male to Male
- 8. Breadboard 700 Points SYB-120 จำนวน 2 ชิ้น
2 : ทดลองใช้งาน โปรแกรมแรก Blink
โปรแกรมแรกของ การใช้งานไมโครคอนโทรลเลอร์มักจะเป็น Blink ไฟกะพริบ ซึ่งเป็นหนึ่งในโปรแกรมที่ง่ายที่สุดเท่าที่จะเป็นไปได้ในการเขียนภาษาโปรแกรมต่างๆ โดยทำตามขั้นตอนลิงค์ด้านล่าง
3 : โหมดประหยัดพลังงาน Deep Sleep ด้วย ESP32
เชื่อมต่ออุปกรณ์ ตามรูปด้านล่าง

ในตัวอย่างนี้เรากำลังใช้ GPIO32 เพื่อปลุก ESP32 แต่คุณสามารถใช้ GPIO อื่นๆได้
เขียนโค้ดดังนี้
โค้ดต่อไปนี้แสดงให้เห็นว่า ext0 ทำงานอย่างไร: โดยใช้ขา GPIO32 เป็นแหล่งสัญญาณปลุกจากภายนอก และให้ขา GPIO27 แสดงผล LED ติด-ดับ
import machine
import esp32
from machine import Pin
from time import sleep
led = Pin(27, Pin.OUT)
wake1 = Pin(32, mode = Pin.IN)
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
led.value(1)
print('Im awake. Going to sleep in 10 seconds')
sleep(10)
print('Going to sleep now')
led.value(0)
machine.deepsleep()

กดที่ปุ่ม RTS 1 ครั้ง เพื่อเริ่มการทำงาน ของ ESP32

เมื่อเริ่มการทำงาน ไฟ LED จะติด

ที่ Shell จะขึ้นข้อความ “Im awake. Going to sleep in 10 seconds” คืออีก 10 วินาที บอร์ด ESP32 จะเข้าสู่โหมดประหยัดพลังงาน หรือ Deep Sleep

เมื่อถึงเวลา 10 วินาที ต่อมา LED จะดับ ก็คือบอร์ด ESP32 จะเข้าสู่โหมดประหยัดพลังงาน หรือ Deep Sleep ที่จะปิดการใช้งานทุกอย่างยกเว้นโมดูล RTC
ที่ Shell จะขึ้นข้อความ “Going to sleep now” คือ บอร์ด ESP32 จะเข้าสู่โหมดประหยัดพลังงาน หรือ Deep Sleep แล้ว

LED จะดับ หรือ บอร์ด ESP32 หลับอยู่

ถ้าต้องการ “ปลุกให้ตื่น” ให้กดที่ สวิตช์ 1 ครั้ง หมายถึง การทำให้ ESP32 กลับมาเริ่มทำงานใหม่ด้วยการกระตุ้นจากภายนอก

ไฟ LED จะกลับมาติด ก็คือ บอร์ด ESP32 กลับมาทํางานตามปกติ แล้วอีก 10 วินาที จะเข้าสู่โหมดประหยัดพลังงาน หรือ Deep Sleep ตามที่เราเขียนโค้ดไว้

4 : โค้ดทำงานอย่างไร
ก่อนอื่นคุณต้องนำเข้าโมดูลที่จำเป็น คือ โมดูล machine
import machine
การแสดงผล LED ติด-ดับ เรากำลังใช้ขา GPIO27 และเราให้ตัวแปรนี้ ชื่อว่า led และต้องตั้งค่า GPIO นี้เป็นเอาต์พุต (Pin.OUT)
led = Pin(27, Pin.OUT)
นำเข้าโมดูล esp32 ที่มีวิธีการ ให้เราสามารถกำหนดขาใด ให้เป็นแหล่งสัญญาณปลุก หลังจากนั้น เรากำหนดให้เป็นขา GPIO32 และเราให้ตัวแปรนี้ ชื่อว่า wake1 และต้องตั้งค่า GPIO นี้เป็นอินพุต (Pin.IN)
wake1 = Pin(32, mode = Pin.IN)
จากนั้นตั้งค่า ext0 เป็นแหล่งสัญญาณปลุกโดยใช้วิธี wake_on_ext0 () ดังต่อไปนี้:
esp32.wake_on_ext0(pin = wake1, level = esp32.WAKEUP_ANY_HIGH)
เมธอด wake_on_ext0 ()
pin: ชนิดของขา (GPIO ที่ทำหน้าที่เป็นแหล่งสัญญาณปลุก)
level: กำหนดสถานะของ GPIO ที่ปลุก ESP32
ระดับสามารถเป็นหนึ่งในพารามิเตอร์ต่อไปนี้:
- WAKEUP_ANY_HIGH
- WAKEUP_ALL_LOW
ในกรณีนี้เราใช้เมธอด WAKEUP_ANY_HIGH ที่ทำให้ ESP32 เกิดขึ้นเมื่อ GPIO เป็น HIGH
ให้ GPIO27 แสดงผล LED ติด
led.value(1)
เพิ่มการหน่วงเวลา 10 วินาทีก่อนเข้า Deep Sleep
sleep(10)
ให้ GPIO27 แสดงผล LED ดับ
led.value(0)
ในการทำให้ ESP32 เข้าสู่โหมดหลับลึกคุณเพียงแค่ใช้เมธอด deepsleep ()
machine.deepsleep()
credit : https://micropythonthai.blogspot.com/2019/08/micropython-upycraft-ide.html