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() รวมกันให้ส่วนประกอบพื้นฐาน