风筝
发表于: 2024-12-20 15:57:16 | 显示全部楼层

您想释放传感器的全部潜力吗?您喜欢挑战自己的极限吗?好吧,这正是HR202L传感器所提供的!HR202L是一种具有非线性对数行为的可变电容器,其值高度依赖于环境温度。


无论您是Arduino新手还是已经使用了一段时间,本文都将为您提供开始使用HR202L传感器所需的一切。通过遵循清晰的说明、实际示例和专业提示,您很快就能充分利用此传感器的全部潜力并创建创新的尖端应用程序。

HR202L-Humidity-Intro.jpg


所需的组件

●    Arduino UNO R3开发板

●    HR202L 湿度传感器

●    电阻 - 100kΩ,0.25W

●    电阻 - 60kΩ,0.25W

●    100nF陶瓷电容器


HR202L传感器的工作原理?

要了解HR202L传感器的工作原理,掌握电容式湿度传感器的基本知识非常重要。

该传感器由两个电极组成,它们由对湿度敏感的介电材料隔开。当环境中的湿度发生变化时,材料的介电常数也会发生变化,进而影响电容。


要测量HR202L传感器电容,有两个基本问题:

第一:低湿度下的电容较低;该值可能约为1.5pF。要测量这种电容器的电容,我们需要大多数Arduino开发板所不具备的要求(例如高ADC采样率)。

第二:HR202L传感器的电容范围从几pF到百nF不等。我们无法用简单的电路测量这个范围。

要了解 HR202L传感器的性能,让我们看一下数据手册。其中您将看到以下对数曲线。该曲线显示了传感器在温度为25度和频率为1kHz 时的阻抗。

HR202L-Humidity-GettingToKnow1.jpg

根据数据表,传感器输出是对数的、非线性的,并且依赖于温度。


在下图中,您可以看到HR202L传感器在不同温度下的阻抗。

HR202L-Humidity-Temperature-effect.jpg

在上图中,HR202L传感器以5度为间隔测量0至60°C 范围内的湿度和温度,值以kΩ为单位显示。该传感器的阻抗在不同温度下变化很大,因此考虑此参数对于准确的湿度计算非常重要。


HR202L湿度传感器与Arduino开发板的硬件连接

按照下图所示连接组件。

HR202L-Humidity-circuit.jpg


示例代码

首先,下载并安装FreqCounterAdafruit BME680库,然后将下面的代码上传到您的Arduino开发板。

  1. #include <FreqCounter.h>
  2. #include <stdlib.h>

  3. #include <Wire.h>
  4. #include <Adafruit_Sensor.h>
  5. #include "Adafruit_BME680.h"

  6. Adafruit_BME680 bme; // I2C

  7. #define countdelay 1 // measurement delay
  8. #define calibration 0 // adjusts frequency for variation in Arduino
  9. #define gatetime 100 // gate time in milliseconds
  10. #define onems 1000 // alias for 1000 milliseconds

  11. char units[][5] = {"Hz", "KHz", "MHz"}; //units of frequency to be used later
  12. float omega = 2 * PI*1000;
  13. float impedance;


  14. void setup() {
  15. Serial.begin(9600); // initialize the LCD
  16. while (!Serial);
  17. Serial.print("** HR202L Humidity Sensor **"); //initial message
  18. if (!bme.begin()) {
  19. Serial.println("Could not find a valid BME680 sensor, check wiring!");
  20. while (1);
  21. }

  22. // Set up oversampling and filter initialization
  23. bme.setTemperatureOversampling(BME680_OS_8X);
  24. bme.setHumidityOversampling(BME680_OS_2X);
  25. bme.setPressureOversampling(BME680_OS_4X);
  26. bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  27. bme.setGasHeater(320, 150); // 320*C for 150 ms
  28. delay(100); //100ms startup delay
  29. }

  30. void loop() {
  31. if (! bme.performReading()) {
  32. Serial.println("Failed to perform reading :(");
  33. return;
  34. }
  35. float temp = bme.temperature;
  36. unsigned long Fcalc = 0;
  37. float Fval;
  38. float capacitance;
  39. float Humidity;


  40. FreqCounter::f_comp = calibration; // calibrate with known source
  41. FreqCounter::start(gatetime); // count pulses for specified gating period
  42. while (FreqCounter::f_ready == 0)
  43. Fcalc = FreqCounter::f_freq;
  44. delay(countdelay);
  45. Fval = (float) Fcalc * (onems / gatetime); // scale the input


  46. capacitance = (1.44 * 1000000000000) / (260000 * Fval);//capacitance in pF
  47. impedance = 1/ (omega * capacitance)*1000000000000; //calculating the Impedance in Ohm

  48. if (temp > 0 && temp <= 5)
  49. Humidity = (6.8062 - log10(impedance)) / 0.04925 + 30;
  50. else if (temp > 5 && temp <= 10)
  51. Humidity = (7 - log10(impedance)) / 0.05039 + 25;
  52. else if (temp > 10 && temp <= 15)
  53. Humidity = (6.8451 - log10(impedance)) / 0.04882 + 25;
  54. else if (temp > 15 && temp <= 20)
  55. Humidity = (7 - log10(impedance)) / 0.04854 + 20;
  56. else if (temp > 20 && temp <= 25)
  57. Humidity = (6.8261 - log10(impedance)) / 0.04725 + 20;
  58. else if (temp > 25 && temp <= 30)
  59. Humidity = (6.699 - log10(impedance)) / 0.04854 + 20;
  60. else if (temp > 30 && temp <= 35)
  61. Humidity = (6.5911 - log10(impedance)) / 0.04561 + 20;
  62. else if (temp > 35 && temp <= 40)
  63. Humidity = (6.4771 - log10(impedance)) / 0.04537 + 20;
  64. else if (temp > 40 && temp <= 45)
  65. Humidity = (6.3802 - log10(impedance)) / 0.04464 + 20;
  66. else if (temp > 45 && temp <= 50)
  67. Humidity = (6.2430 - log10(impedance)) / 0.04268 + 20;
  68. else if (temp > 50 && temp <= 55)
  69. Humidity = (6.1614 - log10(impedance)) / 0.04244 + 20;
  70. else if (temp > 55 && temp <= 60)
  71. Humidity = (6.0607 - log10(impedance)) / 0.04163 + 20;
  72. else if (temp > 60 && temp <= 65)
  73. Humidity = (5.9867 - log10(impedance)) / 0.04104 + 20;
  74. else {
  75. Serial.print("Out of Range");
  76. while (1);
  77. }
  78. Serial.print("Temp: ");
  79. Serial.print(temp);Serial.print('\t');
  80. Serial.print("Cap(pF): ");
  81. Serial.print(capacitance);Serial.print('\t');
  82. Serial.print("Humidity(%): ");
  83. Serial.print(Humidity);Serial.print('\t');
  84. Serial.print("Freq(Hz): ");
  85. Serial.println(Fval);
  86. }
复制代码

代码说明

首先在代码中包含所需库的头文件。

  1. #include <FreqCounter.h>
  2. #include <stdlib.h>

  3. #include <Wire.h>
  4. #include <Adafruit_Sensor.h>
  5. #include "Adafruit_BME680.h"
复制代码

创建一个BME680传感器实例。

  1. Adafruit_BME680 bme;
复制代码

接下来定义Arduino计数器的参数。

●    countdelay:测量频率所需的时间

●    calibration:如果出现错误,Arduino 的频率校准

●    gatetime:脉冲计数的固定持续时间

●    onems:Arduino 实际经过的时间,以 1000 毫秒为单位

  1. #define countdelay 1 // measurement delay
  2. #define calibration 0 // adjusts frequency for variation in Arduino
  3. #define gatetime 100 // gate time in milliseconds
  4. #define onems 1000 // alias for 1000 milliseconds
复制代码

在setup()函数中启用串口通信,与BME680通信并配置其过滤器。

  1. void setup() {
  2.   Serial.begin(9600); // initialize the LCD
  3.   while (!Serial);
  4.   Serial.print("** HR202L Humidity Sensor **"); //initial message
  5.   if (!bme.begin()) {
  6.     Serial.println("Could not find a valid BME680 sensor, check wiring!");
  7.     while (1);
  8.   }

  9.   // Set up oversampling and filter initialization
  10.   bme.setTemperatureOversampling(BME680_OS_8X);
  11.   bme.setHumidityOversampling(BME680_OS_2X);
  12.   bme.setPressureOversampling(BME680_OS_4X);
  13.   bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
  14.   bme.setGasHeater(320, 150); // 320*C for 150 ms
  15.   delay(100); //100ms startup delay
  16. }
复制代码

在loop() 函数中,从BME680传感器的输出数据读取温度(您可以使用任何其他传感器)。

  1. if (! bme.performReading()) {
  2.     Serial.println("Failed to perform reading :(");
  3.     return;
  4.   }
  5.   float temp = bme.temperature;
复制代码

然后测量NE555定时器的输入信号频率。

我们测量“gatetime”中定义的特定时间单位内的上升脉冲数,并将其转换为每秒脉冲数 (Hz)。

  1.   FreqCounter::f_comp = calibration; // calibrate with known source
  2.   FreqCounter::start(gatetime); // count pulses for specified gating period
  3.   while (FreqCounter::f_ready == 0)
  4.     Fcalc = FreqCounter::f_freq;
  5.   delay(countdelay);
  6.   Fval = (float) Fcalc * (onems / gatetime); // scale the input
复制代码

接下来计算HR202L传感器的电容。使用BME680测量的温度准确计算湿度。

以下每个公式代表阻抗曲线的一条线。根据测量过程中的温度值,我们使用以下其中一个公式获得传感器阻抗。

  1. if (temp > 0 && temp <= 5)
  2. Humidity = (6.8062 - log10(impedance)) / 0.04925 + 30;
  3. else if (temp > 5 && temp <= 10)
  4. Humidity = (7 - log10(impedance)) / 0.05039 + 25;
  5. else if (temp > 10 && temp <= 15)
  6. Humidity = (6.8451 - log10(impedance)) / 0.04882 + 25;
  7. else if (temp > 15 && temp <= 20)
  8. Humidity = (7 - log10(impedance)) / 0.04854 + 20;
  9. else if (temp > 20 && temp <= 25)
  10. Humidity = (6.8261 - log10(impedance)) / 0.04725 + 20;
  11. else if (temp > 25 && temp <= 30)
  12. Humidity = (6.699 - log10(impedance)) / 0.04854 + 20;
  13. else if (temp > 30 && temp <= 35)
  14. Humidity = (6.5911 - log10(impedance)) / 0.04561 + 20;
  15. else if (temp > 35 && temp <= 40)
  16. Humidity = (6.4771 - log10(impedance)) / 0.04537 + 20;
  17. else if (temp > 40 && temp <= 45)
  18. Humidity = (6.3802 - log10(impedance)) / 0.04464 + 20;
  19. else if (temp > 45 && temp <= 50)
  20. Humidity = (6.2430 - log10(impedance) + 12) / 0.04268 + 20;
  21. else if (temp > 50 && temp <= 55)
  22. Humidity = (6.1614 - log10(impedance) + 12) / 0.04244 + 20;
  23. else if (temp > 55 && temp <= 60)
  24. Humidity = (6.0607 - log10(impedance) + 12) / 0.04163 + 20;
  25. else if (temp > 60 && temp <= 65)
  26. Humidity = (5.9867 - log10(impedance) + 12) / 0.04104 + 20;
  27. else {
  28. Serial.print("Out of Range");
  29. while (1);
  30. }
复制代码

HR202L的湿度测量结果

对Arduino开发板进行编程后,打开串口监视器窗口。Arduino将开始读取NE555的输入频率并打印计算数据。以下是下图所示代码的示例输出。

HR202L-Humidity-Result.jpg


跳转到指定楼层
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题 716 | 回复: 1504



手机版|

GMT+8, 2025-1-20 02:42 , Processed in 0.050515 second(s), 8 queries , Gzip On, MemCache On. Powered by Discuz! X3.5

YiBoard一板网 © 2015-2022 地址:河北省石家庄市长安区高营大街 ( 冀ICP备18020117号 )

快速回复 返回顶部 返回列表