本文将介绍进行的一项实验:为一个卡通盒设计的温度控制系统。这个系统利用Arduino Nano的模拟和数字特性来监控和调节一个适宜环境中的温度。
该系统包含以下特点:
为了充分理解这个实验,需要具备一些基础的数学、物理和电子知识。搭建这个系统的过程非常有趣,但如果真的想要自己搭建一个类似的系统,那么需要做一些手工活:比如剪线、焊接等。
这个实验的理念是利用ArduinoNano的模拟和数字功能来监控和调节(增加)适宜环境中的温度。具体来说,Nano负责以下功能模块:
为了实现温度控制,需要为系统注入热量(即能量)。大型系统需要大量的能量,而任意大型系统需要任意数量的能量。简单来说,负担得起加热图2所示的卡通盒。这个盒子还提供了一些热绝缘性能。
监测是通过四个便宜的模拟温度传感器Microchip MCP9700A实现的。MCP9700A传感器的输出电压与测量到的温度成正比,公式如下:
vout(t) = (0.5 + 0.010 * t/°C) V
例如,在30°C(86°F)时,它输出0.8V。传感器被策略性地放置,并相应地命名:
每个传感器的VOUT和GND之间连接了一个0.33 µF的陶瓷电容器。
热量是通过三个1Ω的水泥功率电阻(5W)的焦耳效应产生的。Arduino无法提供或处理如此大的电流,因此需要一个外部电源和一个继电器板。
两级加热是通过相同的供电电压5V实现的,交替使用三个电阻的串联(第一阶段)或两个电阻的串联(第二阶段)。第一阶段提供的总功率为:
P1 = V*V/R = 5*5/3 W ≅ 8.3 W
...而第二阶段提供的功率为:
P2 = 5*5/2 = 12.5 W
值得注意的是,在第二阶段配置中,功率超过了电阻的名义功率。
使用一个5V的吸风风扇来分散热量,气流方向如图2所示。风扇需要相当大的电流(约200mA),Arduino无法直接提供,继电器板再次派上用场。
下图显示了完整的电路图。注意两个电源:
与硬件组装工作相比,代码实现相对简单,Arduino IDE使它变得更简单。在Setup函数中,初始化串行端口,配置控制继电器的数字引脚为OUTPUT,并设置为HIGH逻辑电平,以开始一个干净的'do nothing'状态(因为驱动继电器的逻辑是反的:Arduino引脚LOW驱动继电器ON)。
在永不结束的Loop函数中(欢迎来到微控制器世界!),从串行端口读取可用字符,然后使用一个简单的switch语句执行识别的基本单字符命令:
然后读取传感器值并记住以供报告。使用Arduino读取模拟值非常简单,一个简单的analogRead调用,感谢底层库,完成了工作。将ADC原始测量值转换为温度值也非常简单,以下代码片段计算温度的整数和小数(十分之一度)部分,而不使用不必要的浮点变量。
int millivolt = map(adc, 0, 1023, 0, 5000);
int degree = (millivolt - 500) / 10;
int fracdegree = (millivolt - 500) - (degree * 10);
最后,报告测量值,以及继电器的当前状态。有两种报告模式:默认和详细。两种模式报告相同的独立信息,然而详细模式适合直接人工解释,而默认模式是原始的CSV格式,旨在自动数据采集。
这次测试是在8月6日的晚上进行的。测试计划如下:
步骤 | 分钟 | 加热器状态 | 风扇状态 |
---|---|---|---|
1 | 10 | OFF | OFF |
2 | 10 | ON STANDARD | OFF |
3 | 10 | ON HIGH POWER | OFF |
4 | 30 | ON STANDARD | ON |
5 | 30 | OFF | ON |
测试结果如下图所示:
显然,加热器工作得很好(超出预期:它变得非常热)。图表中的高功率加热有点被高估了,可能是因为加热器传感器靠近其中一个'超速'电阻。风扇的效果相当令人印象深刻。NEAR和FAR传感器在盒子内部的温度值上相当一致,这并不奇怪,它明显高于外部环境的温度。
焊接、剪线、组装对于软件人员来说是辛苦的工作。另一方面,一个工作的DIY硬件件给人一些满足感和乐趣。使用Arduino构建原型非常快速和愉快。然而,快速原型可能不是最先进的。在看来,温度监测的准确性可以(也应该)提高。
仅仅进行一次测试实际上是一个可怜的验证手段。但是,正如Lou Reed曾经唱的那样:"没有时间",真的。