3.29. โหมดประหยัดพลังงานและโหมดสลีป¶
กล้องที่ใช้แบตเตอรี่และเซนเซอร์ที่ทำงานเป็นช่วงๆ ไม่จำเป็นต้องให้ CPU ทำงานด้วยความเร็วเต็มตลอดเวลา โมดูล machine มีสถานะประหยัดพลังงานสี่ระดับที่ลึกขึ้นตามลำดับ ได้แก่ active, idle(), lightsleep() และ deepsleep() แต่ละขั้นที่ลึกขึ้นจะปิดส่วนต่างๆ ของชิปมากขึ้นและประหยัดพลังงานมากขึ้น แต่แลกมาด้วยเวลาปลุกที่นานขึ้น การเลือกสถานะที่เหมาะสมเป็นการสมดุลระหว่างปริมาณพลังงานที่กล้องประหยัดได้กับความเร็วในการตอบสนองเมื่อมีเหตุการณ์เกิดขึ้น
3.29.1. Active¶
สถานะเริ่มต้น CPU กำลังรัน Python อุปกรณ์ต่อพ่วงทุกตัวได้รับสัญญาณนาฬิกา และการดึงกระแสไฟฟ้าสูงที่สุด ซึ่งอยู่ที่หลายสิบมิลลิแอมแปร์บนเส้น logic ของกล้อง บวกกับสิ่งที่อุปกรณ์เสริมที่เชื่อมต่ออยู่ดึงผ่านมัน
3.29.2. idle()¶
machine.idle() หยุดสัญญาณนาฬิกาของ CPU จนกว่าจะมีอินเทอร์รัปต์ใดๆ เกิดขึ้น (อุปกรณ์ต่อพ่วง ตัวจับเวลา หรือ IRQ ของพิน) RAM ยังคงมีชีวิต อุปกรณ์ต่อพ่วงยังทำงานอยู่ สัญญาณนาฬิกายังคงทำงาน มีแค่ CPU เองที่หยุดชั่วคราว และจะปลุกตัวเองภายในไม่กี่ไมโครวินาทีเมื่อมีงานต้องทำ
ใช้ภายในลูป polling ที่รอให้บางสิ่งภายนอกเกิดขึ้น:
import machine
while not button_pressed():
machine.idle()
CPU หยุดเสียพลังงานไปกับการตรวจสอบ while และจะปลุกตัวเองตามธรรมชาติเมื่อเหตุการณ์ถัดไปมาถึง ซึ่งเป็นการประหยัดเล็กน้อยที่สะสมได้มากในลูปที่ทำงานหลายล้านครั้ง
3.29.3. lightsleep()¶
machine.lightsleep() เป็นขั้นถัดไป CPU หยุดทำงานอย่างสมบูรณ์และสัญญาณนาฬิกาภายในส่วนใหญ่ของชิปถูกปิด แต่ RAM และสถานะอุปกรณ์ต่อพ่วงยังคงอยู่ เมื่อแหล่งปลุกทำงาน สคริปต์จะกลับมาทำงานต่อจากจุดที่เรียก lightsleep พร้อมกับตัวแปร หมายเลขอ้างอิงที่เปิดอยู่ และข้อมูลที่รอดำเนินการทั้งหมดครบถ้วน ซึ่งใช้เวลาประมาณหลายมิลลิวินาที
import machine
from machine import Pin
wake_pin = Pin("P0", Pin.IN, Pin.PULL_UP)
wake_pin.irq(lambda _: None, trigger=Pin.IRQ_FALLING, wake=machine.SLEEP)
while True:
do_work()
machine.lightsleep() # wakes on a falling edge on P0
แหล่งปลุก ซึ่งในที่นี้คือ IRQ ของพิน ต้องกำหนดค่า ก่อน การเรียกสลีป การดึงกระแสไฟฟ้าลดลงอย่างมีนัยสำคัญเมื่อเทียบกับโหมด active ตัวเลขที่แน่นอนขึ้นอยู่กับบอร์ดและอุปกรณ์ต่อพ่วงที่ยังกำหนดค่าอยู่
3.29.4. deepsleep()¶
machine.deepsleep() คือสถานะที่ลึกที่สุด CPU หยุดทำงาน อุปกรณ์ต่อพ่วงถูกปิดพลังงาน และเนื้อหาใน RAM อาจสูญหาย สิ่งเดียวที่ยังคงดึงกระแสไฟฟ้าอยู่คือวงจรปลุกและ logic ขนาดเล็กที่เปิดอยู่ตลอด
เมื่อแหล่งปลุกทำงาน ชิปจะ บูตจากจุดเริ่มต้นของสคริปต์หลัก โดย deepsleep จะไม่ return สคริปต์แยกแยะการปลุกจาก deepsleep ออกจากการเปิดเครื่องใหม่หรือรีเซ็ตแบบ hard โดยใช้ machine.reset_cause():
import machine
if machine.reset_cause() == machine.DEEPSLEEP_RESET:
# Woke from deepsleep -- restore state from non-volatile storage,
# take a measurement, etc.
pass
else:
# Fresh boot
pass
do_work()
machine.deepsleep(60_000) # arm RTC wake for 60 s, sleep, then restart
อาร์กิวเมนต์มิลลิวินาทีที่ส่งให้ deepsleep() จะตั้งนาฬิกาปลุก RTC บนชิปภายใน RTC คือสิ่งที่รักษาเวลาการปลุกผ่านการสลีปไว้ เนื่องจากตัวจับเวลาส่วนใหญ่ถูกปิดพลังงาน การเรียก deepsleep() โดยไม่มีอาร์กิวเมนต์จะฝากการปลุกไว้กับแหล่งที่คุณกำหนดค่าแยกต่างหาก (IRQ ของพินหรือนาฬิกาปลุก RTC ที่ตั้งค่าไว้จากภายนอก)
เนื่องจากสคริปต์จะรีสตาร์ท สิ่งที่การทำซ้ำครั้งถัดไปต้องการจะต้องถูกสร้างขึ้นใหม่ที่ต้นไฟล์ main.py หรือบันทึกไว้ใน flash (หรือในรีจิสเตอร์สำรองของ RTC ในรุ่นที่มี) Deepsleep ให้การประหยัดพลังงานสูงสุดแต่ต้องการการปรับโครงสร้างโปรแกรมมากที่สุด แอปพลิเคชันต้องทำงานเป็นชุดของ "ช่วงการวัดสั้นๆ" ที่คั่นด้วยการสลีป แทนที่จะเป็นลูปที่ทำงานต่อเนื่องยาวนานพร้อมสถานะใน RAM
3.29.5. การเลือกสถานะ¶
สถานะที่เหมาะสมขึ้นอยู่กับสิ่งที่กล้องกำลังรอ:
ลูป polling ต่อเนื่อง รอเวลาเป็นมิลลิวินาที ใช้
idle()การประหยัดต่อรอบมีน้อย แต่รวมกันแล้วมาก และการปลุกจะมองไม่เห็นไม่มีการทำงานเป็นวินาทีหรือนาทีระหว่างเหตุการณ์ ใช้
lightsleep()สถานะถูกรักษาไว้ การปลุกรวดเร็ว และการดึงกระแสไฟฟ้าเป็นเพียงส่วนหนึ่งของโหมด activeไม่มีการทำงานเป็นนาทีหรือนานกว่านั้นระหว่างช่วงการทำงานสั้นๆ ใช้
deepsleep()ชิปแทบจะปิดอยู่ระหว่างเหตุการณ์ และโครงสร้างสคริปต์เปลี่ยนเป็นลูปปลุก วัด สลีป
ไม่ว่าจะเป็นสถานะใด แหล่งปลุก มีความสำคัญพอๆ กับสถานะเอง deepsleep ที่ปลุกจากตัวจับเวลาเท่านั้นคือลูปการวัดแบบ duty-cycled lightsleep ที่ปลุกจาก IRQ ของพินคือเซนเซอร์แบบ event-driven ฟังก์ชันสลีปของโมดูล machine การตั้งนาฬิกาปลุก RTC และ irq() รวมกันให้ส่วนประกอบพื้นฐาน