使用 CounterFit 虚拟硬件构建 IoT 小夜灯:从传感器到 LED 执行器完整实战(IoT-For-Beginners)

发布时间:2026/9/13 15:43:09
使用 CounterFit 虚拟硬件构建 IoT 小夜灯:从传感器到 LED 执行器完整实战(IoT-For-Beginners)
使用 CounterFit 虚拟硬件构建 IoT 小夜灯从传感器到 LED 执行器完整实战IoT-For-Beginners【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本文是 Microsoft 开源课程 IoT-For-Beginners 第 3 课「传感器与执行器」中虚拟硬件篇的核心实战章节。你将学习如何在CounterFit 虚拟 IoT 环境中创建 LED 数字执行器并用 Grove LED 驱动代码把上一节的虚拟光传感器变成一台完整的小夜灯当环境光低于 300 时自动点亮 LED否则熄灭。读完本文你将掌握 CounterFit 中模拟执行器的创建流程、GroveLed的on()/off()调用模型以及虚拟硬件与真实树莓派代码之间的映射关系。一、本节在课程中的位置本教程对应仓库路径 1-getting-started/lessons/3-sensors-and-actuators/ 下的虚拟硬件分支。该课的目标是理解传感器与执行器两大概念并动手把它们组合成一个可运行的小夜灯上一节 virtual-device-sensor.md 已经完成了光传感器的创建与读取本节 virtual-device-actuator.md 在既有工程上追加一个LED 执行器构成完整的「感知 → 判断 → 执行」闭环课程同时提供了 pi-actuator.md树莓派真机与 wio-terminal-actuator.mdWio Terminal两条硬件分支虚拟硬件代码与真机代码在结构上几乎一一对应。小夜灯的整体判定逻辑以伪代码表达如下Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off二、认识 LED典型的数字执行器执行器Actuator与传感器相反——它把 IoT 设备发出的电信号转换为对物理世界的交互例如发光、发声或驱动电机。本夜灯使用的执行器是LED发光二极管当电流流过时发出可见光。从电气行为看它是一个数字执行器只有开on与关off两个状态向引脚发送数字值1输出高电平在 Raspberry Pi Grove 体系下对应 3.3VLED 点亮向引脚发送数字值0输出 0VLED 熄灭。这一点在真实硬件分支 pi-actuator.md 中有更明确的补充发送数字值给执行器时0 代表 0V1 代表设备的最大电压对于使用 Grove 传感器/执行器的树莓派这个 1 对应的电压为 3.3V。课程主文档 README.md 的「Digital actuators」一节也给出了同样的示意LED 在 0V 时熄灭在 5V 时点亮。三、前置条件CounterFit 环境与光传感器在开始本节之前请确保你已完成课程早期步骤具备以下环境详细步骤见 virtual-device.md已安装 Python 3.6、VS Code 与 Pylance 扩展已创建nightlight工程目录并配置 Python 虚拟环境python3 -m venv .venv source ./.venv/bin/activate # Windows 下使用 .venv\Scripts\activate.bat已在虚拟环境中安装 CounterFit 相关 Pip 包pip install CounterFit pip install counterfit-connection pip install counterfit-shims-grove已启动 CounterFit 应用counterfit命令默认监听127.0.0.1:5000并通过from counterfit_connection import CounterFitConnection; CounterFitConnection.init(127.0.0.1, 5000)让代码与 CounterFit 建立连接已在 CounterFit 中创建Light 光传感器Pin 设为0Units 保持 NoUnits步骤见 virtual-device-sensor.md。 若端口 5000 被占用可通过在代码中改端口并用CounterFit --port port_number启动应用。四、在 CounterFit 中创建 LED 执行器虚拟硬件需要在 CounterFit 应用中登记才能被代码访问。本节只需在既有光传感器之外追加一个执行器。操作步骤添加 LED 到 CounterFit确保 CounterFit Web 应用正在运行来自本作业上一节。如果没有重新启动它并重新添加光传感器。创建 LED在Actuator执行器面板的Create actuator输入框中展开Actuator type下拉框选择LED将Pin设为5点击Add按钮在 Pin 5 上创建 LED。LED 创建后会出现在执行器列表中。创建完成后可通过Color取色器修改 LED 颜色选中颜色后点击Set按钮生效。这里选择Pin 5并非随意——它与真实硬件保持一致在树莓派 Grove Base Hat 上LED 连接到数字插座D5见 pi-actuator.md。虚拟环境中同样使用引脚号 5 来模拟这一连接这正体现了 CounterFit 的设计初衷用与真机相同的方式编写代码。从仓库的完整实现看虚拟设备完整代码位于 code-actuator/virtual-device/nightlight/app.py其完整内容为import time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor from counterfit_shims_grove.grove_led import GroveLed CounterFitConnection.init(127.0.0.1, 5000) light_sensor GroveLightSensor(0) led GroveLed(5) while True: light light_sensor.light print(Light level:, light) if light 300: led.on() else: led.off() time.sleep(1)五、编写小夜灯控制代码现在在上一节的app.py基础上按以下顺序添加代码。第 1 步导入 GroveLed在app.py顶部、其他import行的下方加入from counterfit_shims_grove.grove_led import GroveLed该语句从 CounterFit Grove shim Python 库中导入GroveLed类其内部实现了与 CounterFit 应用中 LED 交互的全部逻辑。注意前缀counterfit_shims_grove表明这是虚拟硬件 shim真机版本则使用from grove.grove_led import GroveLed见 pi-actuator.md——两行代码只差一个前缀这直观体现了虚拟硬件与真实硬件代码的高度一致性。第 2 步实例化 LED 对象在light_sensor声明之后加入led GroveLed(5)GroveLed(5)创建GroveLed类的一个实例并将其连接到Pin 5——即 CounterFit Grove 中 LED 所连接的引脚。第 3 步在 while 循环中加入判断逻辑在while循环内部、time.sleep之前加入if light 300: led.on() else: led.off()这段代码检查light变量当光照值小于 300 时调用GroveLed类的on方法向 LED 发送数字值1点亮 LED当光照值大于等于 300 时调用off方法发送数字值0熄灭 LED。 注意缩进这段代码必须与print(Light level:, light)行保持同一缩进层级以确保它位于while循环内部。此外time.sleep(1)位于循环末尾控制采样间隔为 1 秒——在传感器部分virtual-device-sensor.md中已说明光照值无需连续检测1 秒的休眠既满足夜灯实时性又能降低设备功耗。第 4 步运行程序在 VS Code 终端中运行python3 app.py光照值会持续输出到控制台(.venv) ➜ GroveTest python3 app.py Light level: 143 Light level: 244 Light level: 246 Light level: 253 若 VS Code 终端未激活虚拟环境提示符前没有.venv前缀请先杀掉旧终端再通过Terminal - New Terminal新建终端以自动加载虚拟环境。六、验证夜灯行为程序运行后回到 CounterFit 应用通过以下任一方式改变光传感器的值使其在 300 上下波动在光传感器的Value输入框中填写数字并点击Set该数字将作为传感器返回值勾选Random复选框并填写Min/Max范围后点击Set传感器每次读取都会返回 Min 与 Max 之间的随机数。观察 LED 的状态变化当光照值低于 300 时LED 点亮当光照值大于等于 300 时LED 熄灭。如果你手头同时有树莓派真机可以对照 pi-actuator.md 的验证方式用手遮挡/放开光传感器观察 LED 在光照值低于或高于 300 时相应点亮或熄灭。两种场景下的判定逻辑完全一致。七、源码对照虚拟与真实的同构实现为便于理解虚拟硬件与真实硬件的差异这里将两种实现并列对照完整源码分别在 code-actuator/virtual-device/nightlight/app.py 与 code-actuator/pi/nightlight/app.py环节虚拟设备CounterFit树莓派真机导入 LED 库from counterfit_shims_grove.grove_led import GroveLedfrom grove.grove_led import GroveLed创建 LED 对象led GroveLed(5)led GroveLed(5)连接 D5 数字插座控制逻辑led.on()/led.off()led.on()/led.off()物理映射CounterFit 虚拟 Pin 5树莓派 Grove Base Hat 的 D5 数字引脚可见除去导入路径与物理连接方式外控制代码完全复用。这也是本课程在虚拟设备分支上反复强调「用与真机相同方式编码」的意义所在先在没有硬件的条件下完成逻辑验证再无缝迁移到真实设备。 关于引脚号树莓派 Grove Base Hat 上所有插座都有唯一引脚号其中 0、2、4、6 为模拟引脚5、16、18、22、24、26 为数字引脚见 pi-actuator.md。LED 是数字执行器因此必须接在数字引脚上这也是它在虚拟环境中对应 Pin 5 的根据。八、背后的原理数字信号与执行器本节虽以实操为主但理解 LED 的开关本质有助于排查问题数字执行器的两态模型数字执行器如 LED、继电器、电磁阀只有两个状态由高/低电平驱动。发送 1高电平即接通发送 0低电平即断开。课程主文档 README.md 的「Actuator types」一节还介绍了另一类模拟执行器如可调光灯具它们需要数模转换器DAC或脉冲宽度调制PWM来输出连续电压与本节的开关型 LED 形成对比。虚拟环境的接线抽象在 CounterFit 中接线体现为在 Web 界面上指定引脚号而 shim 库则把这些引脚号映射到本机的虚拟设备通信协议。当代码调用GroveLed(5).on()时实际发生的是向 CounterFit 服务发送一条将 Pin 5 置为高电平的指令CounterFit 随即在浏览器界面中渲染出 LED 亮起的效果。九、小结至此你已经在完全无硬件的条件下完成了一个完整的小夜灯应用在 CounterFit 中创建Pin 5 的 LED 执行器导入GroveLed并实例化到 Pin 5在无限循环中读取光传感器值与阈值 300 比较后调用led.on()/led.off()控制 LED通过修改 CounterFit 中的 Value 或 Random 设置验证 LED 随光照值正确亮灭。后续课程如第 4 课「连接互联网」4-connect-internet将在这个夜灯基础上叠加网络连接、遥测上报等能力本节的传感器-执行器闭环是这一切的硬件基础。如果你想进一步验证自己对传感器与执行器的理解可完成课程附带的作业 assignment.md——调研并描述一种传感器和一种执行器的功能、内部电子结构、模拟/数字属性及量程单位。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考