วันศุกร์, ธันวาคม 13

MicroPython : การใช้โหมดประหยัดพลังงาน 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. เริ่มต้นใช้งาน MicroPython กับ ESP32 ด้วย uPyCraft IDE


2. การปลุกจากภายนอก - ext0

เพื่อแสดงวิธีใช้ ext0 จากการเรียกใช้ภายนอกเราจะใช้ปุ่มกดหนึ่งปุ่มเป็นแหล่งการปลุก ESP32 และ 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()


โค้ดทำงานอย่างไร

ก่อนอื่นคุณต้องนำเข้าโมดูลที่จำเป็น  import machine

การแสดงผล LED ติด-ดับ เรากำลังใช้ GPIO27 และเราเรียกมันว่า led และควรตั้งค่า GPIO นี้เป็นเอาต์พุต (Pin.OUT)

led = Pin(27, Pin.OUT)

คุณต้องนำเข้าโมดูล import 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: ชนิดของ Pin (GPIO ที่ทำหน้าที่เป็นแหล่งสัญญาณปลุก)

level: กำหนดสถานะของ GPIO ที่ปลุก ESP32

ระดับสามารถเป็นหนึ่งในพารามิเตอร์ต่อไปนี้:

  • WAKEUP_ANY_HIGH
  • WAKEUP_ALL_LOW


ในกรณีนี้เราใช้เมธอด WAKEUP_ANY_HIGH ที่ทำให้ ESP32 เกิดขึ้นเมื่อ GPIO เป็น HIGH


ให้ GPIO27 แสดงผล LED ติด

led.value(1) 

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

เราเพิ่มการหน่วงเวลา 10 วินาทีก่อนเข้า Deep Sleep

sleep(10)


ให้ GPIO27 แสดงผล LED ดับ

led.value(0) 


ในการทำให้ ESP32 เข้าสู่โหมดหลับลึกคุณเพียงแค่ใช้เมธอด deepsleep () ดังนี้:

machine.deepsleep()

ทดสอบการทำงาน


อัปโหลดโค้ดไฟล์ main.py ไปยัง ESP32 


ที่ด้านล่างจะแสดงข้อความ Im awake. Going to sleep in 10 seconds




ผลลัพธ์การแสดงผลของ LED จะติด






เมื่อเวลาผ่านไป 10 วินาที ควรเข้าสู่โหมดสลีป ที่ด้านล่างจะแสดงข้อความ Going to sleep now




ผลลัพธ์การแสดงผลของ LED จะดับ






ตอนนี้คุณสามารถกดปุ่มเพื่อปลุกจากการหลับลึก ด้วยการกดสวิตซ์ 1 ครั้ง

ที่ด้านล่างจะแสดงข้อความ Im awake. Going to sleep in 10 seconds




ผลลัพธ์การแสดงผลของ LED จะติด





และเมื่อเวลาผ่านไป 10 วินาที ควรเข้าสู่โหมดสลีปอีกครั้ง ที่ Python shell ด้านล่างจะแสดงข้อความ Going to sleep now




ผลลัพธ์การแสดงผลของ LED จะดับ ( แสดงว่าประสบความสำเร็จแล้ว)






credit :

https://micropythonthai.blogspot.com/2019/08/micropython-upycraft-ide.html

ไม่มีความคิดเห็น:

แสดงความคิดเห็น