Arduino 驱动的家用风量计:构建与监测指南
组件与物料
| Arduino UNO | × | 1 |
| 杜邦线 (共 25 根) | × | 25 |
| 面包板 | × | 1 |
| 旋转电位器 10kΩ | × | 1 |
| Adafruit RGB 背光 LCD 16x2 | × | 1 |
| 直插电阻 220kΩ | × | 1 |
| Diymall 电压传感器 DC0-25V | × | 1 |
| DROK 信号放大模块 AD620 | × | 1 |
| 杯式风速计 (风杯转速输出电压) | × | 1 |
所需工具
| 电烙铁 (通用) |
项目详解
背景
我们的任务是制作一款适用于家庭环境的风量计。当前暖通空调 (HVAC) 行业的风量传感器多面向工业系统,要么体积过大无法安装在家用风口,要么因家用系统风量较小而无法准确测量。
工作原理
信号产生:使用杯式风速计捕捉气流。我们用 Autodesk Inventor 设计并 3D 打印定制风杯叶片与外壳,优化气动性能。
信号调理:风速计输出微弱电压信号,经电压传感器采集,再经 AD620 仪表放大器 放大 10 倍(增益可调 1.5~1000 倍),再送入 Arduino 读取。
数据处理与显示:Arduino Uno 读取模拟量,换算为风速 (CFM,立方英尺/分) 并在 LCD 显示。
硬件构建
电子部分
首先改造风速计。原装风杯连接处呈 L 型薄弱结构,高速下易断。我们设计了更厚实的叶片与加强连接柄,减小叶片与外壳间隙,增加捕风面积与输出电压。
在 Autodesk Inventor 中进行应力分析,新叶片在高速下变形应力显著降低(见下图)。STL 文件见附件,**暂不安装新叶片**。
将无叶片的风速计装入外壳(STL 见附件):风速计从底部穿入,底部用强力胶固定两块薄木圆片 (Hobby Lobby),钻 4 个小孔:一孔穿线,三孔螺丝固定。
接线放大器(AD620 模块,所有接线均为公对公):
- 红线焊接 +S (右侧) → 风速计红线
- 黑线焊接 -S (右侧) → 风速计黄线
- 黄线焊接 GND (右侧) → 电池盒黑线
- 白线焊接 Vln (右侧) → 电池盒红线
- 蓝线焊接放大器 GND → 电压传感器 VCC
- 绿线焊接放大器 Vout → 电压传感器 GND
电压传感器至 Arduino 接线见原理图。
收尾与封装
- 用泡沫板封顶风机外壳,强力胶固定,电子模块置于泡沫板上,再用泡沫板包裹电子仓
- 泡沫板预留孔位供 Arduino 与放大器分别接入 9V 电池供电
集风漏斗制作:用 PVC 板制 4 块梯形板,强力胶+密封胶拼接,大端贴泡棉密封条以贴合风口。大端截面 14″×14″。
标定标定
用已知风量的标准装置标定。初版代码仅显示电压,据实测数据拟合出 CFM 换算公式:
曲线显示“初始风速”与“实际风速”因集风漏斗收缩而有差异。采用实际风速最佳拟合:
y = 1.1409 x² + 44.958 x (大风量段)
y = 40 x + 20 (中小风量段)
y = 0 (零风速)
代码按电压分段计算 CFM,完整代码见下文。上传后风量计即可使用。
自行标定指南 (可选)
若需自定单位 (m/s, mph 等):
- 获取参考风速:最廉价方式买一支手持风速计
- 对着多档位风扇测量各档风速并记录
- 上传“电压传感器代码”让风量计读取输出电压
- 记录各档位对应电压
- Excel 绘制“风速 vs 电压”散点图
- 添加趋势线拟合方程,非线性可分段拟合
- 将方程替换进“风量计代码”上传即可
代码
风量计主代码 (Flowmeter Code)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2); // LCD 引脚
float R1 = 30000; // 电压传感器分压电阻
float R2 = 7500;
void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
}
void loop() {
int sensorValue = analogRead(A0);
float voltage = ((5 * sensorValue * (R1 + R2)) / (1024 * R2)); // 还原真实电压
// 分段函数计算 CFM
if (voltage > 1) { // 大风量段
float cfm = 1.1409 * voltage * voltage + 44.258 * voltage;
Serial.println(cfm);
lcd.print("CFM = "); lcd.setCursor(0, 1); lcd.print(cfm);
delay(1000); lcd.clear(); delay(1000);
}
else if (voltage > 0.01) { // 中小风量段 (原代码条件 .01 < voltage < 1 在 C++ 需拆写)
float cfm = 40 * voltage + 20;
Serial.println(cfm);
lcd.print("CFM = "); lcd.setCursor(0, 1); lcd.print(cfm);
delay(1000); lcd.clear(); delay(1000);
}
else { // 静止
float cfm = 0;
Serial.println(cfm);
lcd.print("CFM = "); lcd.setCursor(0, 1); lcd.print(cfm);
delay(1000); lcd.clear(); delay(1000);
}
}
电压传感器读取代码 (自行标定用)
float R1 = 30000, R2 = 7500;
void setup() { Serial.begin(9600); }
void loop() {
int sensorValue = analogRead(A0);
float voltage = ((5 * sensorValue * (R1 + R2)) / (1024 * R2));
Serial.println(voltage);
delay(1000);
}
带 LCD 显示电压代码 (Voltage Sensor Code)
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
float R1 = 30000, R2 = 7500;
void setup() { Serial.begin(9600); lcd.begin(16, 2); }
void loop() {
int sensorValue = analogRead(A0);
float voltage = ((5 * sensorValue * (R1 + R2)) / (1024 * R2));
Serial.println(voltage);
lcd.print("V = "); lcd.setCursor(0, 1); lcd.print(voltage);
delay(1000); lcd.clear(); delay(1000);
}
原理图
制造工艺
- 空气净化器:设计、历史与未来趋势
- 氧气瓶制造:从原材料到质量保证全流程
- 空气清新剂:从古老香料到现代插电式技术
- 氧气:从古老发现到现代工业动力
- 空调系统:设计、制造与未来趋势
- 热气球:从蒙戈尔菲耶兄弟到现代飞行
- 安全气囊系统:设计原理、历史沿革与未来创新
- Arduino UNO + MAX7219 自制《UFO攻击》复古射击游戏机
- 3D RGB Arduclock — 蓝牙控制全彩LED时钟带RTC与闹钟
- MyRiver:基于 Arduino MKR FOX 1200 的河流水质远程监测系统
- DIY 钢铁侠人偶:Arduino 控制超声波触发音效与灯光
- Arduino + 模拟摇杆互动游戏:五向 LED 反馈