آموزش راه‌ اندازی سنسور رطوبت HR202L با آردوینو

سنسور HR202L

فهرست مطالب

مقدمه

آیا می خواهید از تمامی پتانسیل های یک حسگر استفاده کنید؟ آیا از به چالش کشیدن خود لذت می برید؟ کار با سنسور HR202L خواسته شما را برآورده می کند! این سنسور یک خازن متغیر لگارتمی غیر خطی است که مقادیر آن شدیداً وابسته به دمای محیط است.

چه از علاقه‌مندان باتجربه آردوینو باشید و چه تازه کار، این راهنما هر آنچه را که برای شروع کار با سنسور HR202L نیاز دارید در اختیار شما قرار می دهد. با دستورالعمل های گام به گام، مثال واقعی و نکات تخصصی، به زودی می توانید از قدرت این حسگر برای ایجاد برنامه های کاربردی خلاق و پیشرفته استفاده کنید.

آنچه در این آموزش یاد می گیرید

• نحوه خواندن خروجی سنسور لگاریتمی HR202L
• آشنایی با روش افزایش دقت اندازه گیری سنسور رطوبت HR202L

آشنایی با عملکرد سنسور HR202L

برای درک نحوه عملکرد سنسور HR202L، داشتن درک اولیه از حسگر رطوبت خازنی بسیار مهم است.
این سنسور از دو الکترود تشکیل شده است که توسط یک ماده دی الکتریک حساس به رطوبت از هم جدا شده اند. هنگامی که رطوبت محیط تغییر می کند، ثابت دی الکتریک ماده نیز تغییر کرده و باعث تغییر ظرفیت خازنی می شود.
برای سنجش ظرفیت خازنی، دو مشکل اساسی پیش رو دارید:
اول: پایین بودن ظرفیت خازنی این سنسور در رطوبت پایین؛ به طوری که این مقدار می تواند حدود 1.5 پیکوفاراد باشد. برای سنجش ظرفیت چنین خازنی، به ملزوماتی نیاز داریم که اغلب بردهای آردوینو از آنها پشتیبانی نمی کنند (مانند نرخ نمونه برداری ADC بالا).
دوم: دامنه تغییرات ظرفیت خازنی سنسور HR202L؛ به طوری که مقدار آن بین چند پیکوفاراد تا چند صد نانو فاراد تغییر می کند. این رنج از ظرفیت خازنی را نمی توانیم با یک مدار ساده اندازه گیری کنیم.
برای درک عملکرد این سنسور، بهتر است نگاهی به دیتاشیت آن بیندازیم. در دیتاشیت این سنسور، منحنی لگاریتمی زیر قرار داده شده است. این منحنی، امپدانس سنسور رطوبت را در دمای 25 درجه و فرکانس 1 کیلوهرتز نمایش می دهد.

بنابر دیتاشیت این قطعه، خروجی سنسور به صورت لگارتمی، غیر خطی و وابسته به دما است.
در شکل زیر، امپدانس این سنسور در دماهای مختلف را مشاهده می کنید.

درک عملکرد سنسور رطوبت HR202L

این شکل، از بالاترین تا پایین ترین خط، امپدانس سنسور HR202L را در دماهای 0 تا 60 درجه سلسیوس با پله های 5 درجه ای، و با واحد کیلواهم نمایش می دهد. همانطور که مشاهده می کنید امپدانس این سنسور در دماهای مختلف بسیار متفاوت است. اگر این پارامتر را در محاسبه رطوبت در نظر نگیریم خطای آن غیر قابل چشم پوشی خواهد بود!
خب، اگر همه این مسائل را با نکات اشاره شده برای اندازه گیری ظرفیت خازنی سنسور در نظر بگیرید، متوجه می شوید که با چه مساله ای روبرو هستید!
با وجود همه این مشکلات، روش حل مسائل اشاره شده را به شما آموزش خواهیم داد.

کاربردهای سنسور HR202L

سنسور HR202L طیف گسترده‌ای از کاربردها را در صنایع مختلف دارد:

  • سیستم های پایش آب و هوا: با اندازه گیری رطوبت و دما با استفاده از این سنسور، می توانیم داده های ارزشمندی را برای پیش بینی الگوهای آب و هوا و نظارت بر شرایط محیطی به دست آوریم. این اطلاعات می تواند توسط هواشناسان، کشاورزان و محققان برای تصمیم گیری آگاهانه و انجام اقدامات لازم مورد استفاده قرار گیرد.
  • اتوماسیون گلخانه: با نظارت بر سطوح رطوبت و دمای داخل گلخانه، می توانیم به حفظ شرایط رشد بهینه گیاهان کمک کنیم. همچنین می‌توانیم این سنسور را با محرک‌ها و کنترل‌کننده‌ها ادغام کنیم تا به طور خودکار سیستم‌های تهویه، آبیاری و گرمایش را تنظیم کرده و از رشد گیاهان در محیط ایده‌آل اطمینان حاصل کنیم.
  • سیستم های HVAC (تهویه مطبوع): با نظارت مداوم بر سطوح رطوبت و دما در یک ساختمان، می توانیم به تنظیم سیستم HVAC برای حفظ یک محیط داخلی راحت و سالم کمک کنیم.

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

Arduino UNO R3 × 1
HR202L Humidity Sensor × 1
مقاومت 100 کیلواهم 1/4 وات × 1
مقاومت 60 کیلو 1/4 وات × 1
خازن عدسی 100 نانوفاراد × 1
ماژول BME680*** × 1

***: به جای این ماژول، می‌توانید از هر نوع سنسور دمای دیگری که با واحد درجه سلسیوس اندازه گیری کند نیز استفاده کنید.

نرم‌افزارهای مورد نیاز

Arduino IDE

چالش های راه‌ اندازی سنسور سنجش رطوبت HR202L با آردوینو

در قسمت معرفی سنسور، با مشکلات موجود برای اندازه گیری خروجی سنسور HR202L آشنا شدیم. خلاصه مسائل موجود برای سنجش خروجی این سنسور و راه حل آنها را در ادامه به شما معرفی می کنیم.

مسائل موجود

مساله 1: پایین بودن ظرفیت خازنی: همانطور که اشاره شد، اگر به عنوان نمونه، امپدانس این قطعه را در دمای 15 درجه (4 امین منحنی) و در رطوبت 20% در نظر بگیرید (10 مگا اهم)، ظرفیت خازن در این نقطه با محاسبات ساده ای حدود 16 پیکوفاراد به دست می آید. این عدد برای اندازه گیری به روش معمولی بسیار کوچک است.

در روش معمولی برای سنجش ظرفیت خازنی، مدت زمان شارژ آن را از طریق مقاومت متصل به یک سر آن اندازه گیری می کنیم. حاصلضرب مقدار مقاومت در ظرفیت خازن، برابر با زمانی است که خازن تا 63 درصد ولتاژ نامی شارژ می شود. در این روش، دقت اندازه گیری را دو پارامتر مبدل آنالوگ به دیجیتال (ADC) تعیین می کنند؛ یعنی نرخ نمونه برداری و رزولوشن.
اما فرکانس نمونه برداری مبدل ADC آردوینو 9.6 هرتز است. این عدد برای اندازه گیری چنین خازن کوچکی که در زمان بسیار کوتاهی شارژ می شود مناسب نیست. اگر حسابگر خوبی باشید، متوجه خواهید شد که برای اندازه گیری ظرفیت خازن 16 پیکوفارادی با استفاده از این ADC، به مقاومتی به اندازه حداقل 130 گیگا اهم نیاز دارید تا با دقت 5% بتوانید اندازه گیری را انجام دهید!

راه اندازی سنسور سنجش رطوبت

مساله 2: دامنه تغییرات بزرگ ظرفیت خازنی سنسور: همانطور که اشاره کردیم، ظرفیت خازنی سنسور HR202L از چند پیکوفاراد تا چند صد نانوفاراد متغیر است. اگر طبق روش معمول عمل کنید، سنجش ظرفیت خازنی سنسور فقط در یک طیف کوچکی از میزان رطوبت امکان پذیر خواهد بود. فرض کنید در مدار سری خازن-مقاومت، مقدار مقاومت را متناسب با اندازه گیری خازن چند نانوفارادی محاسبه و قرار داده باشید؛ اگر ظرفیت خازنی سنسور به چند صد نانوفاراد برسد، این مقاومت برای شارژ چنین خازنی، به زمان بسیاری نیاز خواهد داشت و عملاً سنجش آن غیر ممکن می شود.

مساله 3: وابستگی شدید به دما: نمودار وابستگی ظرفیت خازنی این سنسور به دما را قبلاً نمایش دادیم. طبق آن نمودار، اگر این سنسور را در محیطی با میزان رطوبت 50 درصد قرار داده و دما را از 0 تا 60 درجه سلسیوس تغییر دهیم، میزان امپدانس آن از 370 کیلواهم به 21 کیلواهم می رسد! به عبارت دیگر، ظرفیت خازنی سنسور از 0.43 نانوفاراد به 7.6 نانو فاراد تغییر می کند؛ یعنی خطای 1667 درصدی!
در شکل زیر، میزان تغییرات امپدانس سنسور HR202L نسبت به دما نمایش داده شده است. در قسمت راست این شکل، میزان رطوبت هر خط منحنی را می توانید مشاهده کنید.

راه‌حل

راه‌حل مساله 1 و 2:
برای حل مسائل 1 و 2، می توانیم ظرفیت خازن را به صورت غیر مستقیم به دست آوریم. یعنی به جای اندازه گیری ظرفیت خازنی، آن را به یک پارامتر دیگر تبدیل کرده و سپس آن را اندازه گیری کنیم. برای این منظور، آی سی تایمر NE555 را به کار می گیریم. بنابر مداری که در بخش سیم بندی به شما ارائه می دهیم، ظرفیت خازنی متغیر را به فرکانس متغیر تبدیل کرده و آن را با آردوینو اندازه گیری می کنیم. با محاسبات ریاضی، ظرفیت خازنی را از روی آن به دست می آوریم. سپس با محاسبه امپدانس سنسور در فرکانس یک کیلوهرتز، میزان رطوبت را از روی منحنی دیتاشیت سنسور HR202L به دست می‌آوریم.
راه‌حل مساله 3:
لازم است برای اصلاح خطای ناشی از دما، از یک عدد سنسور دما استفاده کنیم. طبق دمای لحظه اندازه گیری، منحنی متناسب با آن دما را برای محاسبه رطوبت به کار می گیریم. در این آموزش، از سنسور BME680 استفاده شده است اما شما می توانید از سنسور آنالوگ یا دیجیتال دیگری که هزینه کمتری نیز داشته باشد استفاده کنید.

راه اندازی سنسور دما و رطوبت HR202L با آردوینو

گام اول: سیم‌بندی

اتصال بین قطعات را مطابق شکل زیر انجام دهید.

گام دوم: کد

ابتدا کتابخانه FreqCounter و Adafruit BME680 را دانلود و نصب کرده، و سپس کد زیر را بر روی آردوینو آپلود کنید.

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

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

Adafruit_BME680 bme; // I2C

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

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


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

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

void loop() {
 if (! bme.performReading()) {
 Serial.println("Failed to perform reading :(");
 return;
 }
 float temp = bme.temperature;
 unsigned long Fcalc = 0;
 float Fval;
 float capacitance;
 float Humidity;
 

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

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

 if (temp > 0 && temp <= 5)
 Humidity = (6.8062 - log10(impedance)) / 0.04925 + 30;
 else if (temp > 5 && temp <= 10)
 Humidity = (7 - log10(impedance)) / 0.05039 + 25;
 else if (temp > 10 && temp <= 15)
 Humidity = (6.8451 - log10(impedance)) / 0.04882 + 25;
 else if (temp > 15 && temp <= 20)
 Humidity = (7 - log10(impedance)) / 0.04854 + 20;
 else if (temp > 20 && temp <= 25)
 Humidity = (6.8261 - log10(impedance)) / 0.04725 + 20;
 else if (temp > 25 && temp <= 30)
 Humidity = (6.699 - log10(impedance)) / 0.04854 + 20;
 else if (temp > 30 && temp <= 35)
 Humidity = (6.5911 - log10(impedance)) / 0.04561 + 20; 
 else if (temp > 35 && temp <= 40)
 Humidity = (6.4771 - log10(impedance)) / 0.04537 + 20;
 else if (temp > 40 && temp <= 45)
 Humidity = (6.3802 - log10(impedance)) / 0.04464 + 20;
 else if (temp > 45 && temp <= 50)
 Humidity = (6.2430 - log10(impedance)) / 0.04268 + 20;
 else if (temp > 50 && temp <= 55)
 Humidity = (6.1614 - log10(impedance)) / 0.04244 + 20;
 else if (temp > 55 && temp <= 60)
 Humidity = (6.0607 - log10(impedance)) / 0.04163 + 20;
 else if (temp > 60 && temp <= 65)
 Humidity = (5.9867 - log10(impedance)) / 0.04104 + 20;
 else {
 Serial.print("Out of Range");
 while (1);
 }
 Serial.print("Temp: ");
 Serial.print(temp);Serial.print('\t');
 Serial.print("Cap(pF): ");
 Serial.print(capacitance);Serial.print('\t');
 Serial.print("Humidity(%): ");
 Serial.print(Humidity);Serial.print('\t');
 Serial.print("Freq(Hz): ");
 Serial.println(Fval);
}

توضیحات کد

در این قسمت، کد نوشته شده را به صورت مرحله به مرحله برای شما توضیح می دهیم:

1- بارگذاری کتابخانه های مورد استفاده

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

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

2- ایجاد یک Instance برای سنسور BME680

Adafruit_BME680 bme;

3- تعریف پارامترهای شمارنده آردوینو

  • countdelay: زمان مورد نیاز برای سنجش فرکانس
  • calibration: کالیبراسیون فرکانس آردوینو در صورت وجود خطا
  • gatetime: مدت زمان ثابت برای شمارش پالس
  • onems: مدت زمان طی شده در آردوینو در 1000 میلی ثانیه واقعی
#define countdelay 1 // measurement delay
#define calibration 0 // adjusts frequency for variation in Arduino
#define gatetime 100 // gate time in milliseconds
#define onems 1000 // alias for 1000 milliseconds

4- تابع Setup(): فعال کردن ارتباط سریال، برقراری ارتباط با BME680 و تنظیم فیلترهای آن

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

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

5- تابع loop():

  • خواندن دما از روی داده های خروجی سنسور BME680 (از هر سنسور دیگری نیز می توانید استفاده کنید)
if (! bme.performReading()) {
    Serial.println("Failed to perform reading :(");
    return;
  }
  float temp = bme.temperature;
  • سنجش فرکانس سیگنال ورودی از تایمر NE555
    تعداد پالس بالارونده در واحد زمان تعریف شده در gatetime را اندازه گیری کرده و آن را به واحد تعداد پالس بر ثانیه (Hz) تبدیل می کنیم.
  FreqCounter::f_comp = calibration; // calibrate with known source
  FreqCounter::start(gatetime); // count pulses for specified gating period
  while (FreqCounter::f_ready == 0)
    Fcalc = FreqCounter::f_freq;
  delay(countdelay);
  Fval = (float) Fcalc * (onems / gatetime); // scale the input
  • محاسبه ظرفیت خازنی سنسور HR202L
    در اینجا، عدد 260000 را از رابطه زیر به دست آورده ایم:
                                                                              R1+2×R2
capacitance = (1.44 * 1000000000000) / (260000 * Fval); //calculating the Capacitance in pF
  •  محاسبه امپدانس سنسور HR202L
    همانطور که می دانید امپدانس یک خازن از طریق رابطه زیر به دست می آید:
                                                                                Z=1/(ω.c)
impedance = 1/ (omega * capacitance)*1000000000000; //calculating the Impedance in Ohm
  • استفاده از دمای اندازه گیری شده توسط BME680 برای محاسبه دقیق رطوبت
    هریک از روابط زیر، یکی از خطوط منحنی تغییرات امپدانس را نشان می دهد. بر اساس دمای لحظۀ اندازه گیری، ، امپدانس سنسور را با استفاده از یکی از روابط زیر به دست می آوریم.
if (temp > 0 && temp <= 5)
 Humidity = (6.8062 - log10(impedance)) / 0.04925 + 30;
 else if (temp > 5 && temp <= 10)
 Humidity = (7 - log10(impedance)) / 0.05039 + 25;
 else if (temp > 10 && temp <= 15)
 Humidity = (6.8451 - log10(impedance)) / 0.04882 + 25;
 else if (temp > 15 && temp <= 20)
 Humidity = (7 - log10(impedance)) / 0.04854 + 20;
 else if (temp > 20 && temp <= 25)
 Humidity = (6.8261 - log10(impedance)) / 0.04725 + 20;
 else if (temp > 25 && temp <= 30)
 Humidity = (6.699 - log10(impedance)) / 0.04854 + 20;
 else if (temp > 30 && temp <= 35)
 Humidity = (6.5911 - log10(impedance)) / 0.04561 + 20; 
 else if (temp > 35 && temp <= 40)
 Humidity = (6.4771 - log10(impedance)) / 0.04537 + 20;
 else if (temp > 40 && temp <= 45)
 Humidity = (6.3802 - log10(impedance)) / 0.04464 + 20;
 else if (temp > 45 && temp <= 50)
 Humidity = (6.2430 - log10(impedance) + 12) / 0.04268 + 20;
 else if (temp > 50 && temp <= 55)
 Humidity = (6.1614 - log10(impedance) + 12) / 0.04244 + 20;
 else if (temp > 55 && temp <= 60)
 Humidity = (6.0607 - log10(impedance) + 12) / 0.04163 + 20;
 else if (temp > 60 && temp <= 65)
 Humidity = (5.9867 - log10(impedance) + 12) / 0.04104 + 20;
 else {
 Serial.print("Out of Range");
 while (1);
 }
  • چاپ اعداد محاسبه شده در درگاه سریال
  Serial.print("Cap(pF): ");
  Serial.print(capacitance);Serial.print('\t');
  Serial.print("Humidity(%): ");
  Serial.print(Humidity);Serial.print('\t');
  Serial.print("Freq(Hz): ");
  Serial.println(Fval);

گام سوم: نتیجه اندازه‌گیری رطوبت با HR202L

پس از پروگرام کردن برد آردوینو، پنجره سریال مانیتور را باز کنید. آردوینو شروع به خواندن فرکانس ورودی از NE555 کرده و داده های حساب شده را چاپ می کند. نمونه ای از اجرای این کد را در تصویر زیر مشاهده می‌کنید.

یک گام جلوتر

در این آموزش، با نحوه کاربرد صحیح سنسور HR202L آشنا شدید که یک سنسور لگاریتمی، غیر خطی و وابسته به دما است. همچنین یاد گرفتید که چگونه می توانید سیگنال سنسور را به شکلی تبدیل کنید که مناسب میکروکنترلر شما باشد.
سنسورهای کاربردی مختلفی وجود دارند که ممکن است غیر خطی یا لگاریتمی باشند. شما با استفاده از ترفندهایی که در این آموزش یاد گرفتید، می توانید ناممکن ها را ممکن سازید!

آموزش های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.