تعلم الوحدات · الدرس 2.11
حساس الحرارة والرطوبة (DHT11 Temperature and Humidity Module)
العودة إلى الدروسالحساس ومواصفاته
ستتعلم استخدام DHT11؛ ودقته تكفي لمعظم المشروعات التي تتابع الحرارة والرطوبة. تستخدم مكتبة مخصصة لتبسيط الكود.
المكونات المطلوبة
- لوحة أردوينو (ELEGOO UNO R3).
- حساس الحرارة والرطوبة (DHT11 Temperature and Humidity Module).
- أربعة أسلاك أنثى إلى ذكر (Female to Male DuPont Wires).
بنية الحساس
حساس مركب يعطي إشارة رقمية معايرة للحرارة والرطوبة. يستخدم تقنيات جمع بيانات رقمية واستشعار لتحقيق الموثوقية والثبات طويل الأمد. يضم حساس رطوبة مقاوميًا وعنصر حرارة NTC، متصلين بمتحكم 8 بت.
تشمل التطبيقات التكييف والتهوية HVAC، إزالة الرطوبة، أجهزة الفحص، المنتجات الاستهلاكية، السيارات، التحكم الآلي، تسجيل البيانات، محطات الطقس، الأجهزة المنزلية، تنظيم الرطوبة والتطبيقات الطبية وغيرها من أعمال قياس الرطوبة والتحكم فيها.

المواصفات
| الخاصية | القيمة |
|---|---|
| دقة التمثيل للرطوبة | 8 بت |
| تكرارية الرطوبة | ±1% RH |
| دقة الرطوبة عند 25°C | ±5% RH |
| قابلية الاستبدال | قابلة للاستبدال بالكامل |
| زمن استجابة الرطوبة إلى 63% من التغير عند 25°C | 6s |
| دقة التمثيل للحرارة | 8 بت |
| تكرارية الحرارة | ±0.2°C |
| مدى قياس الحرارة | من 0 إلى 50°C |
| زمن استجابة الحرارة إلى 63% من التغير | 10s |
| تغذية DC | 3.5–5.5V |
| تيار القياس | 0.3mA |
| تيار الاستعداد | 60µA |
| فترة أخذ العينات | أكثر من ثانيتين |
| زمن الاستجابة عند سرعة هواء 1m/s | 6s |
| التباطؤ (Hysteresis) | أقل من ±0.3% RH |
| الاستقرار طويل الأمد | أقل من ±0.5% RH في السنة |
الأطراف: VDD للتغذية 3.5–5.5V DC، و DATA للبيانات التسلسلية على ناقل واحد، و GND للأرضي أو سالب التغذية.
توصيل الدائرة
تحتاج الوحدة إلى ثلاثة توصيلات: الإشارة والتغذية والأرضي. وصّل DATA بالمنفذ الرقمي 2، و VDD بالتغذية، و GND بالأرضي.


البرنامج والأنواع
قبل رفع البرنامج، تأكد من توفر مكتبة DHT في بيئة Arduino IDE. إذا لم تكن مثبتة أو ظهرت رسالة تشير إلى مكتبة مفقودة، فاتبع خطوات التثبيت في قسم «ما هي المكتبات؟» وطرق تثبيتها في الدرس 1.5 «وميض LED وإضافة المكتبات».
افتح ملف البرنامج DHT11_Example.ino من ملفات الدرس في بيئة Arduino IDE. بعد إتمام التوصيلات، وصّل لوحة أردوينو (UNO R3 Board) بالحاسوب بكابل توصيل (USB Cable)، ثم اضغط زر Upload (رفع) لنقل البرنامج إلى اللوحة وتشغيله عليها.
إذا تعذر نقل البرنامج إلى اللوحة، فراجع قسم «رفع البرنامج ومعالجة خطأ الاتصال» في الدرس 1.5 «وميض LED وإضافة المكتبات» للتحقق من اتصال USB واختيار نوع اللوحة والمنفذ التسلسلي في بيئة Arduino IDE.
static
المتغير المحلي static يحتفظ بقيمته بين استدعاءات الدالة، بخلاف المحلي العادي الذي ينشأ ويزول مع كل استدعاء. ينشأ ويهيأ أول مرة فقط. يعرض البرنامج static const int DHT_SENSOR_PIN = 2.
float
نوع للأعداد ذات الفاصلة، يستعمل لتقريب القيم التناظرية المستمرة بدقة تمثيل أكبر من الأعداد الصحيحة. يشغل 32 بت، أي أربعة بايتات؛ ويتراوح تقريبًا بين الحدين -3.4028235E+38 و 3.4028235E+38. الصيغة float var = val، حيث var الاسم و val القيمة. يستخدم المثال temperature و humidity.
bool و unsigned long
النوع bool يخزن إحدى قيمتين منطقيتين: true أو false. الصيغة bool var = val؛ حيث var اسم المتغير و val قيمته الابتدائية. تعيد دالة القياس true عند النجاح، و false في غير ذلك.
النوع unsigned long عدد صحيح غير موقّع من 32 بت على UNO، ومداه من 0 إلى 4294967295. يُستخدم لتخزين الزمن الذي تعيده millis(). تحتفظ measure_environment() بوقت القياس في measurement_timestamp باستخدام millis()، ثم تفحص مرور أكثر من 3000ul، وتقيس الحرارة والرطوبة، وتحدث الوقت وتعيد true عند النجاح أو false في غير ذلك. يحدد الشرط فترة بين القياسات تتجاوز ثلاث ثوانٍ.
عرض النتائج
بعد الرفع افتح Serial Monitor. يعرض المثال حرارة بيئية بين 27 و 25 درجة ورطوبة 45.0%. راجع الدرس 2.4 «المراقب التسلسلي» لمعرفة طريقة فتحه وضبط سرعة الاتصال وقراءة البيانات.

الكود
DHT11_Example/DHT11_Example.ino
//www.elegoo.com
//2018.10.25
#include <dht_nonblocking.h>
#define DHT_SENSOR_TYPE DHT_TYPE_11
static const int DHT_SENSOR_PIN = 2;
DHT_nonblocking dht_sensor( DHT_SENSOR_PIN, DHT_SENSOR_TYPE );
/*
* Initialize the serial port.
*/
void setup( )
{
Serial.begin( 9600);
}
/*
* Poll for a measurement, keeping the state machine alive. Returns
* true if a measurement is available.
*/
static bool measure_environment( float *temperature, float *humidity )
{
static unsigned long measurement_timestamp = millis( );
/* Measure once every four seconds. */
if( millis( ) - measurement_timestamp > 3000ul )
{
if( dht_sensor.measure( temperature, humidity ) == true )
{
measurement_timestamp = millis( );
return( true );
}
}
return( false );
}
/*
* Main program loop.
*/
void loop( )
{
float temperature;
float humidity;
/* Measure temperature and humidity. If the functions returns
true, then a measurement is available. */
if( measure_environment( &temperature, &humidity ) == true )
{
Serial.print( "T = " );
Serial.print( temperature, 1 );
Serial.print( " deg. C, H = " );
Serial.print( humidity, 1 );
Serial.println( "%" );
}
}