用 CounterFit 虚拟硬件构建夜灯:在 IoT-For-Beginners 中从零驱动 Grove LED 执行器

发布时间:2026/9/14 18:32:54
用 CounterFit 虚拟硬件构建夜灯:在 IoT-For-Beginners 中从零驱动 Grove LED 执行器 用 CounterFit 虚拟硬件构建夜灯在 IoT-For-Beginners 中从零驱动 Grove LED 执行器【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本文是 Microsoft Azure 官方开源课程IoT-For-Beginners第 3 课《传感器与执行器》中构建夜灯Virtual IoT Hardware部分的完整技术指南。你将学会在不接触任何物理硬件的情况下借助CounterFit虚拟 IoT 平台在浏览器中创建一颗 LED并通过 Python 的counterfit_shims_groveshim 库读取虚拟光敏传感器数据、按阈值自动点亮或熄灭 LED最终完成一个完整的夜灯闭环程序。读完本文你将掌握数字执行器的核心概念、CounterFit 的图形化配置流程以及一套可直接运行在虚拟设备上的 Python 代码模板。从传感器到执行器夜灯的闭环逻辑在前一部分课程virtual-device-sensor.md中我们已经在 CounterFit 中创建了光敏传感器并编写了循环读取光线强度的程序。现在要引入 IoT 系统的另一半——执行器Actuator。传感器负责感知物理世界执行器则相反它将 IoT 设备发出的电信号转换为对物理世界的交互例如发光、发声或驱动电机。本课程使用的执行器是LED发光二极管——当电流流过时它会发光。在物理设备中这是一个数字执行器只有两种状态发送数字值1LED 点亮对应高电压发送数字值0LED 熄灭对应 0V夜灯的核心业务逻辑用伪代码表示为检查光线强度。 如果光线强度小于 300 点亮 LED 否则 熄灭 LED这个读传感器 → 阈值判断 → 驱动执行器的模式是几乎所有 IoT 闭环应用的通用骨架后续课程如连接互联网、遥测上报都会在此基础上扩展。CounterFit为虚拟设备添加 LED 执行器虚拟 IoT 方案的核心是 CounterFit 应用——一个运行在本地的 Web 工具用于在浏览器中模拟传感器与执行器。夜灯需要在其Actuator执行器面板中创建一个虚拟 LED。操作步骤创建虚拟 LED确认上一部分任务启动的 CounterFit Web 应用仍在运行如果已关闭重新启动并重新添加光敏传感器Pin 0。创建 LED在Actuator面板的Create actuator区域打开Actuator type下拉框选择LED将Pin设置为5点击Add按钮即可在 Pin 5 上创建 LED。LED 创建成功后会出现在执行器列表中创建完成后还可以使用Color取色器更改 LED 的颜色选中颜色后点击Set按钮生效。提示Pin编号是虚拟设备与 CounterFit 之间的通信标识。光敏传感器占用 Pin 0LED 占用 Pin 5两者通过不同引脚号区分这与物理设备上 GPIO 引脚的使用方式一致。为什么 LED 是数字执行器从课程 README.md 对执行器类型的讲解可知执行器分为模拟与数字两类模拟执行器如可调光灯泡输出效果随电压连续变化需要数模转换器DAC或 PWM 技术驱动数字执行器如 LED只有高/低两个电压状态由数字信号1/0直接控制是最简单的一类执行器。LED 恰好是数字执行器最典型的代表当设备输出数字信号1时引脚输出高电压点亮 LED输出0时电压降为 0VLED 熄灭。这也解释了为何后续代码中只需要调用on()/off()两个方法即可完成控制。编写夜灯程序GroveLed 驱动的完整实现建立完整代码含传感器部分在上一部分任务中创建的 VS Code 夜灯项目中打开app.py。完整的程序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)分步讲解关键代码1. 导入 GroveLed 库在文件顶部其他import行下方添加from counterfit_shims_grove.grove_led import GroveLedfrom counterfit_shims_grove.grove_led import GroveLed语句从 CounterFit Grove shim Python 库中导入GroveLed类。该库封装了与 CounterFit 应用中 LED 交互的全部代码。注意前缀counterfit_shims_——它把真实 Grove 硬件库的 API 重新实现为shim垫片让代码可以无缝运行在虚拟硬件上当迁移到真实 Raspberry Pi 时仅需将导入语句改为from grove.grove_led import GroveLed即可业务逻辑完全不变可对照 code-actuator/pi/nightlight/app.py 验证。2. 创建 LED 实例在light_sensor声明之后添加led GroveLed(5)led GroveLed(5)创建GroveLed类的实例并将它连接到Pin 5——即刚才在 CounterFit 中创建 LED 时所指定的 Grove 引脚。引脚号必须与 CounterFit 中的配置严格一致否则数据无法送达。3. 在 while 循环内添加阈值判断在while循环内、time.sleep之前添加if light 300: led.on() else: led.off()这段代码检查light变量的值若小于 300调用GroveLed类的on()方法——向 LED 发送数字值 1将其点亮若大于或等于 300调用off()方法——发送数字值 0将其熄灭。 这段代码的缩进必须与print(Light level:, light)行保持一致确保它位于while循环内部这样每次轮询光线后都会立即更新 LED 状态。while True循环每迭代一次执行一次读光强 → 打印 → 判断 → 驱动 LED → 休眠 1 秒的完整流程。time.sleep(1)的存在是因为光线强度无需连续监测——适当的休眠可以降低设备功耗这一设计考量也沿用了传感器部分的代码。运行与验证观察虚拟夜灯工作在 VS Code 终端中运行python3 app.py光线强度值会持续输出到控制台(.venv) ➜ GroveTest python3 app.py Light level: 143 Light level: 244 Light level: 246 Light level: 253此时回到 CounterFit 应用修改光敏传感器的Value数值或勾选Random并设置Min/Max范围后点击Set让光线强度在 300 上下变化。当数值低于 300 时CounterFit 中的虚拟 LED 会点亮高于 300 时则熄灭 本部分完整代码位于 code-actuator/virtual-device 目录传感器阶段的基础代码见 code-sensor/virtual-device/nightlight/app.py。从虚拟到物理同一套逻辑的三种实现值得强调的是本课的夜灯在仓库中提供了三种硬件形态的完整实现业务逻辑完全同构差异仅在硬件访问层形态驱动库/APILED 控制参考实现虚拟设备本文counterfit_shims_groveled.on()/led.off()code-actuator/virtual-deviceRaspberry Pigrove.grove_ledled.on()/led.off()接 D5 数字口code-actuator/piWio TerminalArduinodigitalWritedigitalWrite(D0, HIGH/LOW)code-actuator/wio-terminal从源码对比可以看出设计的一致性Raspberry Pi 版pi-actuator.md将 Grove LED 接在 Grove Base hat 的D5数字插座上代码仅将 shim 库替换为真实 Grove 库GroveLed(5)、if light 300: led.on()的写法与虚拟版一字不差Wio Terminal 版wio-terminal-actuator.md在setup()中用pinMode(D0, OUTPUT)配置右侧 Grove 插座的 D0 引脚在loop()中用digitalWrite(D0, HIGH)/digitalWrite(D0, LOW)实现相同逻辑见 main.cpp。这为学习者提供了一条平滑的升级路径先在虚拟环境里吃透业务逻辑再迁移到真实硬件时只需替换硬件访问层。从源码结构可以推断这正是课程设计 CounterFit shim 的用意——屏蔽硬件差异让初学者聚焦于 IoT 应用本身。常见问题与调试技巧LED 不亮检查 CounterFit 中 LED 的 Pin 是否为 5并确认代码中GroveLed(5)的引脚参数与之一致同时确认光敏传感器的Value或Random设置确实让读数低于 300。光线值始终为 0回到 CounterFit 的Sensors面板确认光敏传感器已重新添加Pin 0并通过Value或Random手动注入一个大于 0 的读数。缩进错误if/else块必须与print(Light level:, light)处于同一缩进层级都在while True内否则会出现缩进异常或逻辑判断不在循环内的问题。迁移真实硬件将导入行替换为对应的真实 Grove 库Pi 用grove.grove_led并确保GroveLed构造参数与硬件所接的 D 口编号一致——Pi 上所有插座引脚编号唯一0、2、4、6 为模拟引脚5、16、18、22、24、26 为数字引脚。小结至此你已经用完全虚拟的硬件完成了一台功能完整的 IoT 夜灯通过 CounterFit 创建虚拟光敏传感器与虚拟 LED用GroveLightSensor读取光线强度用GroveLed在阈值 300 上下自动切换 LED 状态。这套传感器 阈值判断 执行器的闭环模式与 Raspberry Pi、Wio Terminal 等真实硬件的实现完全同构后续课程将在其上叠加物联网连接与云端通信而本次学到的执行器控制能力将成为所有后续应用的基础。想要进一步练习可完成本课的课后作业 assignment.md调研一种传感器与一种执行器说明其工作原理、内部电子元件、模拟/数字类型以及输入或测量单位与范围。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询