ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

IoT for Beginners 实战:使用 CounterFit 虚拟硬件与 10 位 ADC 读取土壤湿度

IoT for Beginners 实战:使用 CounterFit 虚拟硬件与 10 位 ADC 读取土壤湿度 IoT for Beginners 实战使用 CounterFit 虚拟硬件与 10 位 ADC 读取土壤湿度【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners导读本文是 IoT for Beginners 课程「2-farm / 检测土壤湿度」单元的虚拟硬件实战指南。课程仓库同时为 Wio TerminalArduino、Raspberry Pi 和虚拟设备三条硬件路线提供了完全对等的实验本文聚焦于无需任何真实硬件的虚拟设备方案在 CounterFit 中创建模拟的 Grove 电容式土壤湿度传感器用 Python 编写程序通过模拟 ADC 持续读取湿度值并完成传感器的校准换算。读完本文你将掌握模拟传感器的物理原理、CounterFit 虚拟传感器环境的搭建与操作、counterfit_shims_grove.adc.ADC的完整用法以及如何用烘干称重法把 0–1023 的原始读数换算成真实的重力含水率。为什么需要检测土壤湿度植物需要水才能生长水主要经根系从土壤吸收用于光合作用、蒸腾作用以及维持细胞结构植物约 90% 由水构成远高于人体的 60%。土壤水分过少植物无法吸收足够水分水分过多根系又无法获得维持功能所需的氧气最终导致烂根。因此对种植者而言理想的土壤状态是不干不湿、恰到好处——IoT 设备通过实时测量土壤湿度让农户仅在需要时才浇水。测量土壤湿度主要有两类传感器见 课程主文档电阻式Resistive两根探针插入土壤向一根探针通电流、另一根接收通过测量土壤电阻来间接反映湿度。水是良好导体土壤含水量越高、电阻越低。这种传感器易受腐蚀。电容式Capacitive测量土壤的电容存储电荷的能力再转换为电压输出。土壤越湿输出电压越低。本课程使用的 Grove 电容式传感器即属此类且耐腐蚀性更好。两者都属于模拟传感器输出的是电压信号因此都需要模拟–数字转换器ADC才能被代码读取。传感器如何与 IoT 设备通信在动手编程前先理解土壤湿度传感器返回的电压如何变成代码里的数字。传感器与 IoT 设备通信需要硬件连接 通信协议两层配合详见 课程主文档GPIO 引脚通用输入输出引脚可提供 3.3V/5V 电压、接地或可编程的输入/输出。按钮、LED 这类只关心高/低的数字器件可直接接 GPIO。模拟引脚Analog pins以 Arduino 系列为代表引脚内置 ADC通常为 10 位分辨率把电压映射为 0–1,023。例如 3.3V 板子上传感器返回 3.3V 时读数为 1,023返回 1.65V 时读数约为 511。土壤湿度传感器依赖电压因此使用模拟引脚并给出 0–1,023 的读数。I²C多控制器/多外设总线协议数据以带设备地址的数据包传输由 SDA串行数据、SCL串行时钟、VCC电源、GND地四条线构成。Raspberry Pi 的 Grove Base Hat 正是通过 I²C 把模拟信号转换为数字信号。UART串行异步通信Tx/Rx 交叉相连以波特率常见 9,600逐位传输需起始位与停止位。SPI控制器/外设模型的短距离高速全双工协议由 COPI、CIPO、SCLK、CS每外设一根构成。无线BLE、LoRaWAN、Zigbee 等适合商用田间土壤湿度传感器这类需要远离主控设备的场景。了解这些背景后下面进入虚拟硬件实验。由于虚拟设备直接模拟了模拟引脚 ADC的行为你无需关心物理接线只需关注与 ADC 打交道的编程逻辑。虚拟硬件方案用 CounterFit 模拟 Grove 电容式土壤湿度传感器虚拟 IoT 设备使用CounterFitCounterFit 是一个在浏览器中运行的传感器/执行器模拟服务提供模拟的 Grove 电容式土壤湿度传感器。这样本实验与使用 Raspberry Pi 物理 Grove 电容传感器的路径完全一致物理设备上电容传感器通过检测土壤电容随湿度变化而变化的属性来测量湿度土壤越湿、输出电压越低虚拟设备则用一个模拟的 10 位 ADC报告 1–1,023 范围内的数值。本实验对应的完整源码存放在 code/virtual-device/soil-moisture-sensor/app.py如果你使用 Raspberry Pi可对照 pi-soil-moisture.md代码见 code/pi/soil-moisture-sensor/app.py其ADC来自 Grove Python 库若使用 Wio Terminal可对照 wio-terminal-soil-moisture.md用analogRead(A0)读取。第一步创建 Python 项目与虚拟环境在电脑上新建名为soil-moisture-sensor的文件夹内含单个文件app.py并创建 Python 虚拟环境、安装 CounterFit 相关 pip 包。项目创建与 CounterFit 环境的完整步骤可参考第一课Getting Started的虚拟设备章节创建并配置 CounterFit Python 项目。⚠️ 需要先运行 CounterFit Web 应用并确保它与代码使用同一个端口。第二步在 CounterFit 中创建土壤湿度传感器在浏览器打开 CounterFit 应用后在Sensors传感器面板的Create sensor创建传感器区域展开Sensor type传感器类型下拉框选择Soil Moisture土壤湿度将Units单位保持为NoUnits无单位确认Pin引脚为0点击Add按钮即可在引脚 0 上创建Soil Moisture传感器。传感器创建后会自动出现在传感器列表中编写土壤湿度传感器程序在 VS Code 中打开soil-moisture-sensor项目编辑app.py。1. 连接 CounterFit在文件顶部加入以下代码把应用连接到本机运行在 5000 端口的 CounterFit 服务from counterfit_connection import CounterFitConnection CounterFitConnection.init(127.0.0.1, 5000)2. 导入依赖库import time from counterfit_shims_grove.adc import ADCimport time导入time模块稍后用于读取间隔的睡眠控制from counterfit_shims_grove.adc import ADC导入ADC类用于与虚拟的模拟–数字转换器交互该转换器可连接到 CounterFit 中的传感器。注意虚拟环境使用的是counterfit_shims_grove兼容层与 Raspberry Pi 上的grove.adc.ADC用法一致这正是实验保持与物理硬件一致的关键。3. 创建 ADC 实例adc ADC()4. 无限循环读取湿度从引脚 0 读取 ADC 数值并打印到控制台每次读取之间休眠 10 秒while True: soil_moisture adc.read(0) print(Soil moisture:, soil_moisture) time.sleep(10)这段代码与仓库中的 app.py 完全一致adc.read(0)即从 0 号引脚也就是刚才在 CounterFit 中创建传感器的 Pin 0读取当前湿度值。运行程序并调整传感器值运行 Python 应用(.venv) ➜ soil-moisture-sensor $ python app.py Soil moisture: 615 Soil moisture: 612 Soil moisture: 498 Soil moisture: 493 Soil moisture: 490 Soil Moisture: 388在 CounterFit 应用中改变传感器返回值有两种方式固定值在传感器的Value数值框中输入一个数字点击Set按钮。该数字即为传感器每次返回的值随机值勾选Random随机复选框输入Min最小与Max最大值点击Set。此后每次读取传感器都会返回Min到Max之间的一个随机数。通过调整上述设置可以模拟土壤湿度变化的过程从输出示例可见随着设定的湿度值从 615 一路下降到 388正好对应土壤越湿、输出电压越低的物理特性对电容式传感器而言。传感器校准把原始读数换算成真实土壤湿度传感器读取到的是 0–1023 的原始电压读数它本身并不是可直接使用的湿度单位。校准Calibration就是把测量值与真实物理量对应起来。有些传感器出厂已校准如上一课的温度传感器直接返回 °C但土壤湿度传感器受土壤类型影响很大——土壤成分会改变其电气特性因此同一读数在不同土壤中代表不同湿度。理想的校准方式是用传感器读数与实验室科学测量结果建立映射关系详见 课程主文档「Sensor calibration」一节 与 课后作业 assignment.md。重力含水率Gravimetric soil moisture的计算土壤湿度可用重力法或体积法测量。课后作业要求用重力含水率校准取土样、称湿重、烘干、再称干重计算公式为土壤湿度 % (W_wet - W_dry) / W_dry × 100其中W_wet为湿土重量W_dry为干土重量。示例某土样湿重 212g烘干后干重 197g212 − 197 1515 / 197 ≈ 0.0760.076 × 100 7.6%即该土壤的重力含水率为 7.6%。校准操作步骤用土壤湿度传感器读取当前土壤的原始值并记录取一份土壤样本称湿重并记录烘干土壤——最理想的方式是在 110°C230°F的烤箱中烘数小时也可放在阳光下或温暖干燥处直到土壤完全干透、呈松散粉末状。实验室精度要求通常需要烘 48–72 小时烘得越久样本越干、结果越准再次称重若用烤箱烘干务必先等土壤冷却。对至少 3 份不同湿度的土壤样本重复上述过程然后将传感器原始读数与重力含水率 %绘制成散点图并拟合一条直线。之后任意一次传感器读数都可以沿这条校准直线换算成真实的重力含水率。 注意对电容式传感器电压读数随土壤湿度增加而下降因此校准曲线是向下倾斜的而电阻式传感器恰好相反曲线向上倾斜。校准评分标准标准优秀合格需改进收集校准数据至少采集 3 份校准样本至少采集 2 份校准样本仅采集 1 份校准样本完成校准读数成功绘制校准图并完成传感器读数到重力含水率的换算成功绘制校准图无法绘制校准图总结与延伸本实验通过虚拟硬件完整复刻了电容式土壤湿度传感器 → 10 位 ADC → Python 程序的数据链路在 CounterFit 中创建传感器、用counterfit_shims_grove.adc.ADC读取引脚 0 的数值、以 10 秒间隔持续采样并通过固定值/随机值两种模式模拟湿度变化。程序代码可以直接在三种硬件路线间平移counterfit_shims_grove与 Raspberry Pi 的grove库接口相同Wio Terminal 则使用analogRead。最后利用烘干称重法完成传感器校准即可把原始读数转换为具有实际农业意义的土壤含水率为下一课自动化植物浇水系统奠定数据基础。如需继续深入可阅读课程主文档含传感器通信协议详解、课后校准作业、Raspberry Pi 硬件版本、Wio Terminal 硬件版本以及 第一课的 CounterFit 项目搭建指引。【免费下载链接】IoT-For-Beginners12 Weeks, 24 Lessons, IoT for All!项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表