本帖最后由 DI玩 于 2025-2-3 11:30 编辑
#K10信息科技真实情境案例
#修远智慧体验中心天窗控制系统原型

目标:
掌握连续量与开关量的转换方法,运用逻辑运算实现天窗的智能控制。
任务:
- 分析数据类型特点:理解连续量和开关量的特点,讨论它们在天窗控制系统中的不同应用。
- 转换连续量为开关量:设计算法,将光线传感器的连续量数据(如光照强度)转换为开关量(如是否开启天窗)。
- 应用逻辑运算:理解开关量的与、或运算规则,将其应用于天窗控制的逻辑设计中。如通过“与”运算,当光线充足且不下雨时,开启天窗;通过“或”运算,当光线不充足或下雨时,关闭天窗。
前情提要
在子项目二中,我们已经成功使系统具备感知光线、水分等环境条件的能力。


接下来我们就要让这些环境数据化身一只无形的手,像子项目一的手动操作那样精准控制天窗开合。
按下开关时发生了什么?
要塑造这只无形的“手”,首先要了解下当有形的手按下开关时,系统内部发生了什么。

这里我们做一个小实验来验证下,请参考下面的例程编写程序,然后写入K10

可以看到,当按键A(或B)被按下时,屏幕显示“1”,当它们被松开时屏幕显示“0”。这里的“0”和“1”就是书本上描述的开关量。系统就是根据按键输入的开关量来进行判断,并控制天窗开合的。

“在控制系统运行过程中,为了表示设备的开和关,信号的通和断,通常用数字‘1’和‘0’表示两种状态,这样的二值数据称为开关量。” 开关量除了用数字“0”和“1”表示,也可用True(真)和(False)(假)表示。
那传感器感知的环境亮度和水分数据又是叫哪种“量”呢?
以光线传感器感知的光照强度数据为例,在子项目二的实验中,我们可以观察到,它的数据变化是连续的。在控制系统运行过程中,像这样数值大小可以在一定范围内连续变化的量被称为连续量。
连续量“变身”开关量
如何根据光线传感器和水分传感器产生的连续量来自动控制天窗开合呢?这就涉及到用连续量生成开关量了。
这里需要提及一个概念:阈值。教材上对于阈值的解释是:“为了保持系统安全稳定地运行,系统可设定一个数值,当系统运行到临界状态,数据大于、小于或等于这个数值时,就执行相应的控制动作,这个设定的数值称为阈值。”
直白点解读的话,阈值就像是一个“分界线”。当某个数据(比如光线、声音、温度)超过了这个分界线,系统就会做出相应的反应和动作。
比如我们将光照强度的阈值设定为300,那么当光照强度大于300时,条件判断为真,变量“天窗开关”赋值“1”,打开天窗;如果条件判断为假,变量“天窗开关”赋值“0”,关闭天窗。

同理,我们可以通过设定一个水分阈值,将水分传感器的连续量转换为开关量来控制天窗。当传感器检测到的水分值低于阈值时,天窗保持开启状态;一旦水分值达到或超过阈值,表明可能下雨了,则天窗自动关闭。

天窗的“与”协奏
很多时候,控制系统的决策并非取决于单一因素。以智能天窗系统为例,实际需求是在光照强度大于阈值(天亮光照充分),并且水分小于阈值(没有下雨)的情况下自动开窗,否则自动关窗。要达成这样的控制效果,就要用到“与”运算,其系统框架图如下:

我们可以先让学生基于框架图,通过讨论和推演完成“与”运算的逻辑真值表,然后让学生编程实测,验证推演结果。


Mind+图形化样例代码

系统根据光线条件自动开合天窗

系统根据水分条件自动开合天窗
以下是配套浙教版的MicroPython代码:
- # 修远智慧体验中心天窗控制系统——“与”运算
- from unihiker_k10 import screen, light, servo, pin
- import time
-
- # 初始化屏幕
- screen.init(dir=2)
-
- # 初始化舵机
- s1 = servo(1) # 将舵机连接到P1引脚
-
- # 初始化水分传感器
- p0 = pin(0) # 实例化P0引脚
-
- # 光线强度和水分的阈值
- light_threshold = 300
- rain_threshold = 100
-
- # 初始化天窗状态,初始状态为关闭
- sunroof_open = False
- s1.angle(value=30) # 舵机转动到30°,确保初始状态为关闭
-
- def open_sunroof():
- """打开天窗"""
- global sunroof_open
- s1.angle(value=110) # 舵机转动到110°
- sunroof_open = True
-
- def close_sunroof():
- """关闭天窗"""
- global sunroof_open
- s1.angle(value=30) # 舵机转动到30°
- sunroof_open = False
-
- def display_status(light_value, rain_value, sunroof_status):
- """显示光线强度、水分和天窗状态"""
- screen.clear() # 清除屏幕显示
- screen.draw_text(text=f"Light: {light_value}", line=1, font_size=24, color=0xFFFFFF) # 显示光线强度
- screen.draw_text(text=f"Rain: {rain_value}", line=2, font_size=24, color=0xFFFFFF) # 显示水分
- if sunroof_status:
- screen.draw_text(text="Sunroof: Open", line=3, font_size=24, color=0xFFFFFF) # 显示天窗状态为打开
- else:
- screen.draw_text(text="Sunroof: Closed", line=3, font_size=24, color=0xFFFFFF) # 显示天窗状态为关闭
- screen.show_draw() # 显示绘制的内容
-
- while True:
- # 读取光线传感器的数值
- light_value = light.read()
-
- # 读取水分传感器的数值
- rain_value = p0.read_analog() # 读取P0引脚的模拟量
-
- # 根据光线强度和水分控制天窗状态
- if light_value > light_threshold and rain_value < rain_threshold:
- open_sunroof()
- else:
- close_sunroof()
-
- # 显示光线强度、水分和天窗状态
- display_status(light_value, rain_value, sunroof_open)
-
- # 间隔0.5秒,防止过快的刷新导致屏幕闪烁
- time.sleep(0.5)
复制代码
天窗的“或”智慧
对于“与”运算,我们通常会用“既……又……”、“……并且……”的自然语言来描述。相对地,下图展示的是“或”运算的逻辑,我们可以用“要么……要么……”、“……或者……”来描述,表示只要满足其中一个条件即可。使用“或”运算,也可以满足我们对智能天窗控制系统的设计要求。

或运算系统框架图


Mind+图形化样例代码
- # 修远智慧体验中心天窗控制系统——“或”运算
- from unihiker_k10 import screen, light, servo, pin
- import time
-
- # 初始化屏幕
- screen.init(dir=2)
-
- # 初始化舵机
- s1 = servo(1) # 将舵机连接到P1引脚
-
- # 初始化水分传感器
- p0 = pin(0) # 实例化P0引脚
-
- # 光线强度和水分的阈值
- light_threshold = 300
- rain_threshold = 100
-
- # 初始化天窗状态,初始状态为打开
- sunroof_open = True
- s1.angle(value=110) # 舵机转动到110°,确保初始状态为打开
-
- def open_sunroof():
- """打开天窗"""
- global sunroof_open
- s1.angle(value=110) # 舵机转动到110°
- sunroof_open = True
-
- def close_sunroof():
- """关闭天窗"""
- global sunroof_open
- s1.angle(value=30) # 舵机转动到30°
- sunroof_open = False
-
- def display_status(light_value, rain_value, sunroof_status):
- """显示光线强度、水分和天窗状态"""
- screen.clear() # 清除屏幕显示
- screen.draw_text(text=f"Light: {light_value}", line=1, font_size=24, color=0xFFFFFF) # 显示光线强度
- screen.draw_text(text=f"Rain: {rain_value}", line=2, font_size=24, color=0xFFFFFF) # 显示水分
- if sunroof_status:
- screen.draw_text(text="Sunroof: Open", line=3, font_size=24, color=0xFFFFFF) # 显示天窗状态为打开
- else:
- screen.draw_text(text="Sunroof: Closed", line=3, font_size=24, color=0xFFFFFF) # 显示天窗状态为关闭
- screen.show_draw() # 显示绘制的内容
-
- while True:
- # 读取光线传感器的数值
- light_value = light.read()
-
- # 读取水分传感器的数值
- rain_value = p0.read_analog() # 读取P0引脚的模拟量
-
- # 根据光线强度和水分控制天窗状态
- if light_value <= light_threshold or rain_value >= rain_threshold:
- close_sunroof()
- else:
- open_sunroof()
-
- # 显示光线强度、水分和天窗状态
- display_status(light_value, rain_value, sunroof_open)
-
- # 间隔0.5秒,防止过快刷新导致屏幕闪烁
- time.sleep(0.5)
复制代码

模拟天黑的测试(遮挡光线传感器)

模拟下雨的测试(酒精喷雾)
拓展:当前的阈值设定,对于一个真实的天窗系统合理么?会不会出现在临界状态天窗频繁开合的抽风情况?怎么解决这个问题呢?可以让学生参考#浙江省信息科技实验板# 跨学科真实情境案例:蚕宝宝智能育婴室(二)与区间恒温算法的缠斗 进行思辨和讨论。
|