MicroPython ESP32 : โหมดประหยัดพลังงาน Deep Sleep ด้วย ESP32

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

โมดูล WiFi, แกนการประมวลผลและโมดูล Bluetooth นั้นต้องใช้กระแสไฟจำนวนมากในการทำงานดังนั้นหากเราต้องการประหยัดพลังงานเราต้องปิดการใช้งานเมื่อไม่ใช้งาน นี่คือสิ่งที่เรากำลังจะทำตอนนี้ คือเราจะนำ ESP32 ไปยังโหมด Deep – Sleep ที่จะปิดการใช้งานทุกอย่างยกเว้นโมดูล RTC

โหมดการใช้งาน Deep Sleep จะแบ่งได้ตามวิธีการ “ปลุกให้ตื่น” โดยสามารถแบ่งลักษณะการปลุกให้ตื่นด้วยเหตุการณ์ภายนอก และ ตื่นด้วยเหตุการณ์ภายใน

การปลุกให้ตื่นด้วยเหตุการณ์ภายนอก หมายถึง การทำให้ ESP32 กลับมาเริ่มทำงานใหม่ด้วยการกระตุ้นจากภายนอก แบ่งการกระตุ้นได้ 2 แบบ คือ

  1. ใช้เซ็นเซอร์สัมผัส – เหมาะสำหรับการใช้นิ้วสัมผัสโดยตรงเพื่อให้ ESP32 สามารถกลับมาทำงานได้
  2. เปลี่ยนสถานะ GPIO – ใช้เมื่อต้องการให้อุปกรณ์อื่นกระตุ้นทำให้เกิดการตื่นขึ้นมา เช่น การใช้งานเซ็นเซอร์ต่าง ๆ เพื่อกระตุ้นให้เกิดการส่งข้อมูลทันที


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


โดยมีขั้นตอนการทำงานดังนี้

1 : อุปกรณ์ที่ใช้


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 ตามที่เราเขียนโค้ดไว้

This image has an empty alt attribute; its file name is 328448-1024x768.jpg



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

Leave a Reply

Your email address will not be published. Required fields are marked *