用 CounterFit 虚拟光传感器点亮 IoT 夜灯:IoT-For-Beginners 虚拟设备传感器实战指南
用 CounterFit 虚拟光传感器点亮 IoT 夜灯IoT-For-Beginners 虚拟设备传感器实战指南【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners本指南对应 IoT-For-Beginners 课程第 3 课传感器与执行器中的「虚拟设备传感器」实操小节讲解如何在无物理硬件的情况下借助 CounterFit 应用模拟一颗光传感器并用 Python 代码完成读取。读完本文你将掌握虚拟光传感器的创建流程、GroveLightSensor的编程接口、CounterFit 数据注入的两种调试方式并能将同一套代码平滑迁移到真实的树莓派硬件上。虚拟硬件路线为什么用 CounterFit在 1-getting-started/lessons/1-introduction-to-iot/virtual-device.md 中项目介绍了虚拟单板计算机方案与其购买 IoT 开发板与传感器不如用本地应用CounterFit模拟传感器和执行器再通过本地 Python 代码以「与树莓派上完全一致」的写法访问它们。虚拟设备路线需要以下前置准备详见 虚拟设备环境搭建安装 Python 33.6 及以上与 VS Code并安装 Pylance 扩展在nightlight项目目录中创建并激活 Python 虚拟环境.venv在虚拟环境中安装三个 Pip 包pip install CounterFit pip install counterfit-connection pip install counterfit-shims-grove其中counterfit-shims-grove是关键的Grove 硬件 shim 层——它提供了与真实 Grove 传感器/执行器同名的 Python 类使虚拟设备代码与物理设备代码几乎一一对应。安装完成后在 VS Code 终端运行counterfit启动应用并在app.py顶部建立连接from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000)127.0.0.1即本机回环地址localhost5000是 CounterFit 的默认端口。若端口被占用可修改代码端口并使用CounterFit --port port_number指定新端口启动。连接成功后CounterFit 界面右上角状态会从Disconnected变为Connected。光传感器原理从光电二极管到模拟量夜灯需要一个传感器——光传感器Light Sensor。在物理设备上它通常是 光电二极管photodiode能将入射光转换为电信号。关键概念光传感器属于模拟传感器。它向设备返回一个表示「相对光量」的整数值并不对应 lux 对模拟传感器的讲解可以进一步理解模拟传感器通过改变电压来编码物理量IoT 设备是数字系统只认识 0 和 1因此模拟读数必须经模数转换器ADC转为数字信号以 Seeed Grove 光传感器为例其输出范围为0 到 1,023。例如在 3.3V 供电下返回 1V对应数值约为 300设备内部会将其转换为二进制0000000100101100好消息是在代码层面这一切由传感器库封装处理开发者只需读取属性即可无需手工转换。在 CounterFit 中创建虚拟光传感器CounterFit 应用正在运行若未运行先执行counterfit启动然后在Sensors面板创建传感器在Create sensor区域将Sensor type下拉框选为LightUnits保持默认的NoUnits光传感器返回的是相对量无标准单位确保Pin设置为0点击Add按钮在 Pin 0 上创建光传感器。创建完成后光传感器会出现在传感器列表中如下图所示图片对应原文档 1-getting-started/lessons/3-sensors-and-actuators/virtual-device-sensor.md 中的实际操作截图。编写读取光传感器的 Python 程序打开夜灯项目中的app.py依次补充以下代码。仓库中完整的参考实现位于 code-sensor/virtual-device/nightlight/app.pyimport time from counterfit_connection import CounterFitConnection from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor CounterFitConnection.init(127.0.0.1, 5000) light_sensor GroveLightSensor(0) while True: light light_sensor.light print(Light level:, light) time.sleep(1)逐行拆解import time导入 Python 标准库time用于在循环末尾增加暂停from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor从 CounterFit Grove shim 库中导入GroveLightSensor类该类封装了与 CounterFit 应用中光传感器的全部交互逻辑CounterFitConnection.init(127.0.0.1, 5000)建立与本地 CounterFit 应用的连接light_sensor GroveLightSensor(0)实例化光传感器对象并绑定到Pin 0——即上一步在 CounterFit 中创建传感器时使用的引脚编号while True:无限循环持续轮询light light_sensor.light读取light属性该属性从引脚读取模拟值并返回整数print(Light level:, light)将读数输出到控制台time.sleep(1)每次读取后暂停 1 秒。光强不需要连续采样适当的休眠能显著降低设备功耗。运行程序并从 CounterFit 注入数据在 VS Code 终端中确保虚拟环境已激活提示符前有.venv前缀否则通过「Kill 终端 新建终端」重建运行python3 app.py初始状态下光传感器尚未被赋值控制台输出的Light level为0。接下来通过 CounterFit 应用改变传感器值应用会自动读入新值有两种注入方式固定值注入在传感器Value输入框中填写数字点击Set按钮——填写的数字即传感器返回的值随机值注入勾选Random复选框填写Min与Max值点击Set——此后每次传感器被读取时都会返回Min到Max之间的随机整数。调整Value或Random设置控制台输出会随之变化典型输出如下(.venv) ➜ GroveTest python3 app.py Light level: 143 Light level: 244 Light level: 246 Light level: 253至此虚拟夜灯的光传感器读取已成功。 完整代码也可在 code-sensor/virtual-device 目录中查看。源码对照虚拟传感器与真实硬件的差异将虚拟设备代码与仓库中树莓派版本的 code-sensor/pi/nightlight/app.py 对比可以直观看到 shim 层设计的精妙之处# 虚拟设备从 counterfit_shims_grove 导入 from counterfit_shims_grove.grove_light_sensor_v1_2 import GroveLightSensor # 树莓派从 grove 导入 from grove.grove_light_sensor_v1_2 import GroveLightSensor两者唯一的差别是导入路径而light_sensor.light、time.sleep(1)等核心代码完全一致。这正是 CounterFit 的价值开发者先在本机用虚拟传感器完成逻辑开发与调试再把 import 行替换为grove前缀即可直接部署到装有 Grove 库的树莓派上树莓派使用全局安装的 Grove 包无需虚拟环境。可以推断shim 库在内部实现了与真实 Grove 库相同的接口约定仅将「读取引脚」替换为「从 CounterFit 应用拉取模拟值」。下一步从「读传感器」到「驱动执行器」光传感器就绪后夜灯的核心逻辑还差最后一步——执行器。1-getting-started/lessons/3-sensors-and-actuators/virtual-device-actuator.md 继续讲解了如何在 CounterFit 中创建 LED数字执行器Pin 5并给出夜灯的完整伪代码Check the light level. If the light is less than 300 Turn the LED on Otherwise Turn the LED off仓库中合并了传感器与执行器的最终实现位于 code-actuator/virtual-device/nightlight/app.pyimport 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)阈值300与上文提到的 Grove 光传感器 0–1,023 输出范围直接相关——当光线低于 300 时视为「太暗」LED 点亮否则熄灭。这与真实场景中夜灯的「光越暗灯越亮」行为一致也是 第 3 课作业流程图 所描述的「读取光强 → 判断 → 控制 LED」闭环。常见问题排查终端提示符没有.venv前缀虚拟环境未激活。使用 VS Code 的「Kill the active terminal instance」杀掉旧终端再通过Terminal - New Terminal新建终端新终端会自动加载虚拟环境CounterFit 状态一直是Disconnected检查app.py中的CounterFitConnection.init是否与 CounterFit 监听端口默认 5000一致若端口被其他程序占用改用CounterFit --port port_number并同步修改代码输出一直为 0光传感器创建后默认值为 0需在 CounterFit 的Value或Random区域点击Set注入数据运行python3 app.py报模块不存在确认counterfit-connection、counterfit-shims-grove已在当前虚拟环境中通过pip install安装。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考