加热箱 - 使用 Arduino Nano 进行温度控制
本文介绍了我的一项实验:一个用于纸板箱的温度控制系统。
引言
本文介绍了我的一项实验:一个用于纸板箱的温度控制系统。
该“系统”的*特点*
- 四个独立的温度测量点
- 一个两级加热器
- 一个冷却风扇
- Arduino Nano
背景
要完全理解该实验,只需要基础的数学、物理和电子知识。
另一方面,*构建*这个小东西是很有趣的;如果你真的(你愿意吗?)想自己构建一个类似的系统,那么你必须动手做一些事情:剪电线、焊接等等。
想法
这个实验背后的想法是利用 Arduino Nano 的模拟和数字功能来*监控*和*改变(增加)*适宜环境中的温度。
具体来说,我们的 Nano 负责上面图片中所示的功能模块
- 温度传感器,用于监测封闭系统和外部环境的温度。
- 一个加热器。它可以开启以产生一些热量。
- 一个风扇,用于散发产生的热量,从而加速热化过程。
它是如何工作的(或者不工作)
“适宜的环境”
一个合适的环境是温度控制的基本前提:我们必须向系统中注入热量(即能量)来提高其温度。
大型系统需要大量的能量。任意大的系统需要任意多的能量。简单来说,我只能负担加热图 2 所示的纸板箱。这个箱子还有一个好处,就是提供了一些隔热效果。
温度监测
监测是通过四个极好的(也就是说*便宜*的)*模拟*温度传感器实现的,即 Microchip MCP9700A
传感器。
虽然完整的传感器数据手册可在此处获取,但足以说明 MCP9700 输出的电压与测量的温度成正比,遵循以下公式
vout(t) = (0.5 + 0.010 t/°C) V
例如,在30 °C
(86 °F
) 时,它输出0.8 V
。
传感器被策略性地放置并相应命名
名称 | 职位 |
NEAR | 在箱子内部的侧面,靠近加热器,空气侧 |
FAR | 在箱子内部的侧面,远离加热器,面向气流 |
HEATER | 在箱子地板上(同样在内部),靠近加热器 |
EXTERNAL | 在箱子外部,用于监测环境温度 |
一个0.33 µF
的陶瓷电容器连接每个传感器的VOUT
和GND
。
加热
热量是由流过三个1 Ω
(5 W
)水泥功率电阻的大电流的焦耳效应产生的。
Arduino 既不能提供也不能处理如此大的电流,因此需要外部电源和继电器板。
我使用了我的实验室直流电源,能够提供高达3 A
的电流,以及另一块“极好的”硬件,即图 1 中您已经欣赏过的廉价 8 路继电器板。
两级加热是通过使用相同的电源电压5 V
,交替地与 3 个电阻串联(第一级),或与两个电阻串联(第二级)来实现的。
第一级提供总功率...
P<sub>1 </sub>= V*V/R = 5*5/3 W ≅ 8.3 W
...而第二级提供
P<sub>2</sub>= 5*5/2 = 12.5 W
值得注意的是,在第二级配置中,功率超过了电阻的额定功率。
散发热量
一个5 V
的吸力风扇,是从我的一个 Raspberry Pi 外壳上借来的,用于散发热量,气流方向如图所示(图 2)。
与加热器一样,风扇需要相当大的电流(约200 mA
),Arduino 无法直接提供。再次,继电器板派上了用场。
整合所有内容
下图显示了完整的电气电路。
注意两个电源
- 外部大电流电源已明确标记(另请参阅原理图片段,图 8、9),它为继电器板、电阻、风扇供电。
- 低电流电源来自 Arduino USB 端口,为 Nano 和模拟电路供电。
上图显示了模拟传感器的连接:VDD
来自 Arduino + 5 V
引脚,VOUT
连接到 Arduino 板的 A0, A1, A2, A3
模拟引脚,GND
与电路的高功率数字部分共用,
另一方面,下图 9 显示了两级加热器的工作原理。
继电器 1 是加热器ON/OFF
:当ON
时,它为继电器 2 提供5 V
。
继电器 2 反过来将电压分流到 {R1, R2, R3} 串联(OFF
位置)或 {R2, R3} 串联(ON
位置)。
继电器 1、2 的状态对加热器的净效应总结如下表
继电器 1 | 继电器 2 | 对加热器的影响 |
关 | 关 | 关闭 |
关 | 开启 | 关闭 |
开启 | 关 | 开启,正常功率(8.3 W ) |
开启 | 开启 | 开启,高功率(12.5 W ) |
相比之下,风扇独立工作,由继电器 3 控制。
代码
与硬件组装的努力相比,代码真的很简单,Arduino <ocde>IDE 让它变得更简单。
在Setup
函数中,串行端口被初始化,控制继电器的数字引脚配置为OUTPUT
,并设置为HIGH
逻辑电平,以开始一个干净的*“什么都不做”*状态(因为驱动继电器的逻辑是反向的:Arduino 引脚LOW
会驱动继电器ON
)。
在永无止境的Loop
函数中(欢迎来到微控制器世界!),从串行端口读取可用的字符,然后使用一个简单的switch
语句识别执行的基本单字符命令
- '
0
' - 切换继电器 1 的状态 - '
1
' - 切换继电器 2 的状态 - '
2
' - 切换继电器 3 的状态 - '
v
' - 切换详细报告模式
然后读取传感器值并进行记忆以进行报告。
使用 Arduino 读取模拟值非常简单,只需调用analogRead
,这要归功于底层库,就可以完成工作。将 ADC 原始测量值转换为温度值也相当简单,下面的代码片段计算温度的整数部分和小数部分(十分之度),而无需使用不必要的浮点变量。
int millivolt = map(adc, 0, 1023, 0, 5000);
int degree = (millivolt - 500) / 10;
int fracdegree = (millivolt - 500) - (degree * 10);
最后,报告测量值以及继电器的当前状态。有两种报告模式:*默认*和*详细*。
两种模式报告相同独立的*信息*,但*详细*模式适合直接人工解释,而*默认模式*是原始的类 CSV 格式,旨在自动数据采集。
下面从串行终端复制的文本显示了两种模式:第 22 次迭代以*详细*模式报告,而第 23..32 次迭代以*默认*模式报告。
...
ITERATION 22
HEATER is OFF
HEATMAX is OFF
FAN is OFF
NEAR sensor value is adc = 168, V = 821 mV, temp = 32.1 Celsius
FAR sensor value is adc = 170, V = 830 mV, temp = 33.0 Celsius
HEATHER sensor value is adc = 166, V = 811 mV, temp = 31.1 Celsius
EXTERNAL sensor value is adc = 168, V = 821 mV, temp = 32.1 Celsius
************************************************
23;0;0;0;167;169;167;168
24;0;0;0;167;171;168;168
25;0;0;0;166;169;167;168
26;0;0;0;167;169;167;167
27;0;0;0;168;168;167;168
28;0;0;0;167;168;167;170
29;0;0;0;167;169;168;170
30;0;0;0;167;169;166;169
31;0;0;0;169;169;169;169
32;0;0;0;167;169;167;169
...
首次测试运行
此测试于 8 月 6 日晚上进行。
测试计划是
步骤 | 分钟数 | 加热器状态 | 风扇状态 |
1 | 10 | 关 | 关 |
2 | 10 | 标准开启 | 关 |
3 | 10 | 高功率开启 | 关 |
4 | 30 | 标准开启 | 开启 |
5 | 30 | 关 | 开启 |
即:缓慢开始,全部关闭,然后无风扇加热,然后*疯狂加热*同时保持风扇关闭。
最终启动风扇,先进行标准加热,然后不进行加热。
测试结果如下图所示
显然,加热器工作正常(比预期效果更好:它变得非常热)。高功率加热在图表中被高估了,可能是因为*加热器传感器*靠近一个“过载”的电阻。风扇的效果相当显著。NEAR 和 FAR 传感器在箱子内部温度值上基本一致,不出所料,该温度远高于外部环境温度。
关注点
- 对于软件人员来说,焊接、剪电线、组装是非常辛苦的工作。另一方面,一个可用的 DIY 硬件能带来一些满足感和乐趣。
- 使用 Arduino 构建原型非常快速且令人愉快。尽管如此,一个快速的原型可能不是最先进的技术。在我看来,温度监测的准确性可以(也应该)得到提高。
- 实际上,仅仅一次测试运行是对验证的一种糟糕的方式。但是,正如*Lou Reed*曾经唱过的:《没有时间》
- 更多的乐趣还在等待:现在我们有了数据,现在我们可以用 PID 或模糊逻辑实现*自动*温度控制。
历史
- 2018 年 8 月 8 日 - 02:05:50 CET:首次发布