亿迅智能制造网
工业4.0先进制造技术信息网站!
首页 | 制造技术 | 制造设备 | 工业物联网 | 工业材料 | 设备保养维修 | 工业编程 |
home  MfgRobots >> 亿迅智能制造网 >  >> Manufacturing Technology >> 制造工艺

Arduino 冷镜湿度计

组件和用品

Arduino UNO
× 1
12V 10A 电源
× 1
12V 40mm 大功率风扇
× 1
12V 40mm TEC
× 1
40mm 散热器
× 1
小镜子
× 1
导热胶
× 1
导热膏
× 1
BTS7960 电机驱动器
× 1
3 毫米 LED:黄色
× 1
OPT101 光传感器
× 1
IRF520 MOSFET 模块
× 1
Maxim Integrated DS18B20 可编程分辨率单线数字温度计
× 1
SparkFun 湿度和温度传感器突破 - Si7021
× 1

必要的工具和机器

热胶枪(通用)

应用和在线服务

Arduino IDE

关于这个项目

关于

可以通过多种不同的方式测量湿度。最流行的方法是使用电容式湿度传感器。不幸的是,这些传感器在非常潮湿的环境中连续运行时很快就会失去准确性。冷镜式湿度计没有这个问题,而且精度也更高,尤其是在高湿度范围内。不幸的是,商用冷镜湿度计要花费数千美元。基本操作虽然很简单,所以可以自己制作一个。它不会像商用设备那样具有 0.1 度的精度,但对于大多数用途来说,它已经足够好了,而且肯定比电容式传感器更准确。

该项目是概念验证,绝不是生产就绪。可以进行很多改进,但它证明了它有效的事实。

工作原理

冷镜式湿度计使用珀耳帖 (TEC) 来冷却反射表面,直到出现冷凝。冷凝是通过光源和光学传感器检测的。出现冷凝时记录镜面温度。该温度相当于露点温度。然后可以使用露点和环境温度计算相对湿度。

简化

与商用设备相比,这款 DIY 冷镜湿度计存在一些差异。

商用冷镜湿度计不使用传统镜子,因为它不能很好地传导和散发热量,从而导致精度和效率降低。这些设备大多使用镀铂或镀铑的铜作为镜子。由于这既不容易获得,也不具有成本效益,因此这款 DIY 冷镜湿度计中使用了普通镜子。小方镜比圆镜好,但我找不到。作为替代方案,抛光的不锈钢板会更好。

商用冷镜湿度计使用嵌入镜子下方的铂电阻温度计 (PRT),而不是安装在镜子表面的 SMD 温度计。 PRT 需要额外的电子设备并将其安装在珀耳帖和反射镜之间,同时提供良好的导热性是有问题的。将温度计安装到镜面的缺点是会改变热分布特性,降低精度。但是表面贴装温度计更容易构建并且足够准确。

商用冷镜湿度计使用约 5 毫米而不是 4 厘米的小得多的镜子。因为它需要更少的功率并且具有更小的外形尺寸。然而,一个小镜子和匹配的 Peltier 并不像更大的变体那样容易获得。此外,小型 Peltier 需要非常低的电压,需要定制驱动器。将 SMD 温度计安装到小镜面同时留出足够的空间反射一些光线也更加困难。

当前版本没有遮光罩。这可以很容易地进行 3D 打印,强烈建议使用它来阻挡来自外部光源的干扰。它还可用于将光源和光传感器固定到位。如果您制作 3D 打印外壳,请确保其通风良好。您可以使用 Peltier 风扇进行通风,但请确保将空气吸入外壳,而不是吹入外壳。内部还必须便于镜子清洁。

目前的实现方式无法测量冰点,因为这需要区分冰粒和水滴,这需要第二个光学传感器来测量散射光。

如何构建

取出 Peltier,清洁两个表面,然后在热侧放置导热粘合剂。确保它均匀分布。如果没有导热胶,可以使用导热膏,在边缘附近滴几滴强力胶。这同样有效。清洁散热片表面,将散热片和珀耳帖压在一起,让胶水干燥。

将散热器安装到 Peltier 并且胶水干燥后,以相同的方式安装镜子,确保先清洁底面。重要的是导热膏分布均匀,没有气隙,否则镜面上的热量分布会不均匀。

当所有胶水干燥后,安装风扇。确保使用足够强大的风扇来冷却散热器,因为它会变得很热。如何将风扇连接到散热器取决于您使用的散热器类型。我只是用热胶枪把两者粘在一起。

打开风扇,然后打开 Peltier,检查镜子上是否至少有两个区域同时出现冷凝。不要为 Peltier 通电时间过长,因为这肯定会产生均匀的冷凝曲线。您想看看凝结刚刚变得可见时的样子。如果您对结果不满意,请使用新的 Peltier、镜子和散热器再试一次,因为您不太可能移除零件并恢复光滑的表面。

我没有均匀地分布导热膏,导致不规则的冷凝曲线,如上图所示。

拍摄照片或同时标记出现冷凝的区域很重要,因为这是您必须安装镜面温度传感器并测量镜面反射光量的区域。

在这个项目中,我使用 Si7021 来测量镜面温度,因为它提供低噪声输出。不幸的是,I2C 地址是硬编码的,因此您只能使用其中一个传感器。对于环境温度,我使用 DS18B20 温度传感器,但它的精度不高。我使用这些传感器的唯一原因是我碰巧有它们可用。

要将 Si7021(或任何基于 PCB 的温度传感器)安装到镜子上,首先在温度传感器上放置一大滴不导电的导热膏。 PCB 也应覆盖导热膏,以防止电子设备上出现冷凝。然后在 PCB 的每个角上放置 4 大块热胶。你必须快速移动。将传感器按在镜子上均匀出现冷凝水的位置。确保水平放置传感器,并将传感器紧紧地压在镜子上。热胶一碰到镜子就会快速凝固。如果您需要重新定位传感器,您可以轻松地用开箱刀刀头将其刮掉,剥掉胶水,然后再试一次。如果PCB上有冷凝水,请用热胶或喷塑进行绝缘处理。

风扇由 IRF520 MOSFET 模块控制。

使用的光传感器为OPT101,灵敏度高,输出噪声低,使用方便。

对于光源,您可以使用低功率激光二极管或普通 LED。我都试过,它们都工作正常。激光的优点是响应更好,但更难排队。 LED 具有更平坦的响应,因为更多的光被散射到周围,但更容易对齐。如果您使用 LED,请确保它输出聚焦光束。

LED 和激光的光输出可能太高,使用 PWM 来降低输出不是一个选择,因为这会导致光传感器的干扰。相反,只需在 LED 或激光器上串联一个电阻即可降低输出。

为了安装 LED 或激光器和 OPT101 光传感器,我使用了一些铜线拧成锁定线以使其更具刚性。两端用热胶固定。这对于概念证明很有用,但它也太脆弱了,不能在实验室(或地下室)环境外使用。不过,很容易将传感器和光源对齐。更好的方法是为这些设备 3d 打印一个支架,这也是因为 3d 打印的外壳是防止外界光线干扰的必要条件。

为了控制 Peltier,使用了 BTS7960 电机驱动器。驱动 Peltier 的最有效方法是改变电流,而不是使用 PWM。然而,Peltier 控制器不像 BTS7960 电机驱动器那样容易获得,对于这个概念验证,功耗不是一个因素。

组装完成后,将代码上传到 Arduino 并使用电位计调整 OPT101 的灵敏度范围。对于相同的光量,更高的电阻意味着更高的电压输出。请参阅 OPT101 数据表,图 3 - 电压响应度与辐照度的关系。为了调试,您可以对镜子吹气以产生冷凝,或在传感器前面放置一个物体。如果您有空调,请尝试打开(或关闭)并等待。您将能够看到湿度变化。

在下图中,您可以看到温度(蓝色)、光学读数(红色)和测得的露点(绿色)。刚关掉空调就可以看到露点升高了。

安全

尽管提供的代码不支持此功能,但硬件除了冷却镜子外还可以加热镜子。这是通过简单地反转 Peltier 上的极性来完成的。镜面加热可用于快速消除冷凝并提高响应时间。此外,闪蒸冷凝可以去除小污染物。但是,这也带来了潜在的安全隐患,因为镜面没有散热片。如果代码在加热 Peltier 时被卡住,充其量它会熔化将温度计固定到位的热胶,最坏的情况是由于熔化的电线导致短路而引发火灾。

准确性

因为测得的露点温度是一个绝对值,所以校准不像电容或电阻湿度计那么重要。然而,镜面温度传感器区域和光感测区域之间至少会有一些温差。如果您需要验证读数的准确性,您可以使用校准过的商用冷镜湿度计校准设备。

至于镜面污染,这只是部分问题。反射光读数不是绝对的,而是相对于冷却循环的开始。当冷却循环开始时,镜子没有冷凝。测量反射光量并将其用作检测冷凝的参考。如果镜子被污染并且反射的光较少,应该不会影响冷凝检测。但是,某些污染物会降低或提高发生冷凝的温度,因此为了获得最佳精度,请不时清洁镜面。

镜面和环境温度传感器不需要具有很高的校准精度,但分辨率必须很高。例如,如果实际温度是 24.0 度,但它的测量值是 24.5 度,只要镜子和环境温度计的测量值都为 24.5(可以归一化)并且这个数字只抖动一位小数就可以了。许多温度计的抖动为 0.2 或 0.3 度。使用 TSYS01 温度传感器进行镜面温度和环境温度测量会更好,因为这些传感器提供与铂电阻温度计 0.1 度相同的精度。

重要的是温度传感器与镜面接触良好。非导电导热膏的使用势在必行。

冷却镜子的速度不要超过温度计的响应时间,否则感测的露点将不准确。

温度传感器必须放置在镜子上同时出现光感区域结露的位置。

在镜面上安装温度传感器会改变热量分布,从而降低精度。使用红外测温仪作为替代方案可能很诱人,但不幸的是,镜子会反射一定量的热辐射,因此测量结果会受到周围环境的影响。

从技术上讲,湿度读数还取决于气压,但在周围环境中影响很小。由砰的门引起的任何压力变化,以及外部风吹造成建筑物内的压差,都可能导致比其价值更多的问题。

不应将来自 Peltier 散热器的热空气吸入镜子上方。

缓慢的温度下降将提供更准确的读数,但也会缩短响应时间。但可以通过在接近露点的温度振荡来提高响应时间。

代码

  • 冷镜式湿度计
冷镜湿度计C/C++
Arduino 代码
#include #include  //看门狗崩溃检测//这些是自定义库。#include "Si7021.h" //带加热器的湿度传感器#include  //DS18B20 温度传感器#include  //DS18B20 温度传感器//定时器库:https://github.com/brunocalou/Timer#include "timer.h"#include "timerManager.h" //定义Arduino板上的硬件引脚。#define冷却PWM 6#define加热PWM 5#define冷却Enable 13#define heatEnable 12#define tecFan 7#defineopticalSensor 0 //模拟输入#define oneWireBus A3 //DS18B20温度传感器// TEC的状态。#define COOLING 0#define HEATING 1#define OFF 2//TimersTimer timerMainLoop;Timer timerTecCooling;Timer timerSampleNoise;//温度传感器(未使用湿度)。 si7021 si7021;//DS18B20温度传感器OneWire oneWire(oneWireBus);达拉斯温度传感器(&oneWire);浮动湿度=0;浮动环境温度=0;浮动光学Dewpoint =0;//将这些设置为更高的初始值以使串行绘图仪范围正确。浮动镜像温度=30;浮动光学 =30;浮动露点 =15; //初始值必须低于镜像 temp.float relativeHumidity =30;int tecState =OFF;bool Cooling =false;int intervalTecCooling =200; //在ms.floatopticalThreshold =0.5f中,TEC定时器多久更新一次; //0.5 //为了标记冷凝检测,光学读数必须降至参考值以下的摄氏度数。这必须是比信号噪声更大的数字。int pwmIncrement =1; int startPwm =100;int maxPwm =255;int intervalMainLoop =200; int tecPwm =0;int noiseSampleIndex =0;int noiseSampleAmount =10;float noiseSampleHighest =0;float noiseSampleLowest =10000;bool noiseSampling =false;float calculateHumidity(float TD, float T){ //露点不能高于温度。如果(TD> T){ TD =T; } //August-Roche-Magnus 近似。浮动rh =100*(exp((17.625*TD)/(243.04+TD))/exp((17.625*T)/(243.04+T))); return rh;}//将TEC设置为加热、冷却或关闭。void SetTEC(int state, int amount){ tecState =state; //注意对于加热和冷却,加热和冷却引脚需要设置为高。询问 PCB 设计师原因。 //用于控制TEC的驱动程序:BTS7960电机驱动板。请注意,驱动 TEC 的 PWM 效率不高,最好使用可变电流源。开关(状态){ case COOLING:digitalWrite(heatingEnable, HIGH);模拟写入(加热PWM,0);数字写入(冷却启用,高);模拟写入(冷却PWM,数量);休息;案例加热:digitalWrite(coolingEnable,HIGH);模拟写入(冷却PWM,0);数字写入(加热启用,高);模拟写入(加热PWM,数量);休息;情况关闭:digitalWrite(coolingEnable, LOW);模拟写入(冷却PWM,0);数字写入(加热启用,低);模拟写入(加热PWM,0);休息;默认值:digitalWrite(coolingEnable, LOW);模拟写入(冷却PWM,0);数字写入(加热启用,低);模拟写入(加热PWM,0); }}void setup() { //看门狗崩溃检测。这是为了安全,因为您不希望 TEC 卡在加热模式下。 wdt_enable(WDTO_2S); //WDTO_500MS //WDTO_1S Serial.begin(9600); //9600 //57600 pinMode(coolingPWM, OUTPUT); pinMode(加热PWM,输出); pinMode(coolingEnable, OUTPUT); pinMode(加热启用,输出); pinMode(tecFan,输出); pinMode(光学传感器,输入); //设置定时器 timerMainLoop.setInterval(intervalMainLoop); timerMainLoop.setCallback(mainLoop); timerMainLoop.start(); timerTecCooling.setInterval(intervalTecCooling); timerTecCooling.setCallback(tecCoolingCallback); timerSampleNoise.setInterval(intervalTecCooling); timerSampleNoise.setCallback(sampleNoiseCallback); //si7021 温度传感器设置。 uint64_t 序列号 =0ULL; si7021.begin();序列号 =si7021.getSerialNumber(); //DS18B20单线温度传感器sensors.begin(); //禁用温度传感器调试日志以使图表正常工作。 /* Serial.print("Si7021 序列号:"); Serial.print((uint32_t)(serialNumber>> 32), HEX); Serial.println((uint32_t)(serialNumber), HEX); //固件版本Serial.print("Si7021固件版本:"); Serial.println(si7021.getFirmwareVersion(), HEX); */ startNoiseSampling(); }//获取光学传感器读数。float getOptical(){ int opt =analogRead(opticalSensor);浮动 optFactored =(浮动)opt / 30.0f; return optFactored;}//Timer callback.void tecCoolingCallback(){ digitalWrite(tecFan, HIGH); //慢慢增加TEC的力量。 tecPwm +=pwmIncrement; //钳位 if(tecPwm> maxPwm){ tecPwm =maxPwm; } //设置TEC冷却量 SetTEC(COOLING, tecPwm); //是否检测到冷凝? if(optical <=(noiseSampleLowest -opticalThreshold)){ //记录露点;露点 =mirrorTemp;光学露点 =光学;停止技术(); }}void startNoiseSampling(){ noiseSampling =true;噪声样本最高 =0;噪声样本最低 =10000; timerSampleNoise.start();}void sampleNoiseReset(){ timerSampleNoise.stop();噪声样本索引 =0; noiseSampling =false;}void sampleNoiseCallback(){ if(noiseSampleIndex> noiseSampleAmount){ sampleNoiseReset(); startTecCooling(); } else{ if(optical> noiseSampleHighest){ noiseSampleHighest =光学; } if(optical =noiseSampleLowest)){ startNoiseSampling(); } }void loop() { //看门狗崩溃检测 wdt_reset(); //更新所有定时器。 TimerManager::instance().update();}

示意图


制造工艺

  1. 镜像
  2. Arduino Spybot
  3. FlickMote
  4. 自制电视 B-Gone
  5. 万花筒无限镜
  6. 主时钟
  7. 找到我
  8. Arduino Power
  9. Tech-TicTacToe
  10. Arduino Quadruped
  11. Arduino Joystick
  12. 数控机床