跳到主要内容

第 7 课 · 光照感知

这一课学什么?

这一课只讲一个核心点:光线变化。

光照模块不会告诉你“前面有没有障碍物”,它更适合用来判断环境是在变亮还是变暗,再让程序切换界面或状态。

数字光照模块

学习目标

  • 会读取光照模块的当前数值
  • 会根据阈值判断环境明暗
  • 会把明暗变化变成屏幕状态切换
  • 理解“输入 -> 判断 -> 反馈”的基本结构

用到的硬件和功能

这一课需要接入数字光照模块。

会用到的接口主要有:

  • cm.power_on():给扩展模块上电。
  • cm.dlight_level():读取光照原始值。数值越大通常表示环境越亮。
  • display.init():初始化屏幕并返回 tft 对象。入门阶段直接空参调用即可;如果以后需要,也支持屏幕朝向等参数。
  • display.write(text, x, y, color=display.WHITE, bg=display.BLACK, size="normal"):显示文字。text 是字符串;x / y 是坐标;color 是字色;bg 是背景色;size 可选 smallnormalbig
  • tft.fill(color):整屏填色。color 一般传 display.BLUEdisplay.YELLOW 这类颜色常量。

先认识这个能力

光照模块最适合拿来练“阈值判断”。

程序不会直接知道“现在是白天还是夜间”,
它只会先拿到一个数值,然后由你决定:

  • 小于多少算偏暗
  • 大于多少算偏亮

开始编程

1. 先看看当前环境有多亮

import time
import cocube_module as cm

cm.power_on()
time.sleep_ms(300)

while True:
print("light =", cm.dlight_level())
time.sleep_ms(200)

先在自己的环境里观察一会儿数值,再决定后面阈值大概要设在哪里。

2. 根据明暗切换屏幕状态

import time
import cocube_module as cm
import display

cm.power_on()
time.sleep_ms(300)
tft = display.init()

while True:
light = cm.dlight_level()

if light < 20:
tft.fill(display.BLUE)
display.write("偏暗", 88, 104, display.WHITE, display.BLUE, size="big")
else:
tft.fill(display.YELLOW)
display.write("明亮", 88, 104, display.BLACK, display.YELLOW, size="big")

print("light =", light)
time.sleep_ms(200)

这段程序做了三件事:

  1. 读取亮度值
  2. 判断当前更接近亮还是暗
  3. 把判断结果显示到屏幕上

运行时观察什么

运行这段程序时,重点看这些现象:

  • 手遮住模块时,数值会不会明显下降
  • 阈值附近时,界面会不会来回切换
  • 不同环境光下,原始值范围会不会差很多
  • 屏幕配色是否能清楚表达当前状态

常见问题 / 使用提醒

  • 阈值不是固定答案,先看实际读数再调
  • 初次上电后,建议先等一小段时间再开始读取
  • 如果切换太频繁,可以适当拉开两个状态的判断范围
  • 先把屏幕切换做清楚,再考虑叠加移动或别的传感器

挑战一下

试着做一个“双模式状态屏”:

  • 明亮时显示一种颜色和提示语
  • 变暗时切换成另一种颜色和提示语

如果想继续升级,可以再加一层:

  • 在屏幕上显示当前亮度值
  • 给不同亮度区间配不同的界面主题

快速参考

这一课最常用的写法是:

import cocube_module as cm

cm.power_on()
print(cm.dlight_level())
  • cm.power_on():打开扩展模块电源
  • cm.dlight_level():读取光照原始值
  • display.init():初始化屏幕
  • tft.fill(...):切换背景色
  • display.write(...):显示当前状态

如果想继续查外设接口,可以查看 cocube_module 快速参考