آردوینومقدماتی۸ دقیقه مطالعهArduino IDE 2.x / Uno R3

حسگر دما و رطوبت DHT11 و DHT22

تفاوت DHT11 و DHT22 را می‌آموزید، کتابخانهٔ رسمی Adafruit را نصب می‌کنید و با بررسی خطاها، دما و رطوبت را در سریال مانیتور می‌خوانید.

آنچه در این درس می‌آموزید

  • بر اساس بازهٔ اندازه‌گیری و دقت، میان DHT11 و DHT22 انتخاب درست کنید
  • کتابخانهٔ DHT sensor library و وابستهٔ آن را از Library Manager نصب کنید
  • خروجی سنسور را بخوانید و حالت‌های خطا مانند NaN را در کد مدیریت کنید
نویسنده: تیم داکنامه · بازبینی: ۲۰۲۶-۱۰-۳۱
فهرست مطالب

هر پروژه‌ای از گلخانهٔ کوچک تا ایستگاه هواشناسی خانگی، به دانستن دما و رطوبت نیاز دارد. خانوادهٔ سنسورهای DHT دقیقاً همین دو مقدار را با یک ماژول ارزان و یک سیم داده می‌دهند. این سنسورها سریع نیستند، اما برای «شرایط محیطی» که به‌آرامی تغییر می‌کنند، انتخاب استاندارد آموزش و نمونه‌سازی‌اند. در این درس دو نسخهٔ آن را از هم تشخیص می‌دهید، کتابخانهٔ رسمی را نصب می‌کنید و مهم‌تر از همه، یاد می‌گیرید خواندنیِ خراب را از خواندنیِ واقعی تشخیص دهید.

DHT11 یا DHT22؟

هر دو سنسور از یک خانواده‌اند و کد تقریباً یکسانی دارند، اما کیفیت خروجی‌شان فرق جدی دارد:

ویژگی DHT11 DHT22 (AM2302)
بازهٔ دما ۰ تا ۵۰ درجهٔ سانتی‌گراد −۴۰ تا ۸۰ درجهٔ سانتی‌گراد
دقت دما ±۲ درجه ±0.5 درجه
بازهٔ رطوبت ۲۰ تا ۹۰ درصد ۰ تا ۱۰۰ درصد
دقت رطوبت ±۵ درصد ±۲ تا ۵ درصد
سرعت نمونه‌برداری ۱ بار در ثانیه (1Hz) ۱ بار در ۲ ثانیه (0.5Hz)
ولتاژ تغذیه ۳ تا ۵ ولت 3.3 تا 6 ولت
ردهٔ قیمت بسیار ارزان ارزان ولی گران‌تر از DHT11

انتخاب ساده است: برای یادگیری و آزمایش اتاق، DHT11 کافی است؛ برای کار جدی‌تر با بازهٔ وسیع‌تر یا دقت بیشتر، DHT22. هر دو روی همین درس با همان کد کار می‌کنند؛ فقط نوع را در کد عوض می‌کنید.

اصول کار و پروتکل

هر دو سنسور یک حسگر دما و یک حسگر رطوبت را با یک چیپ کوچک تبدیل‌کننده ترکیب کرده‌اند و خروجی را روی یک سیم می‌فرستند. این پروتکل، اختصاصیِ سازنده است و شبیه استانداردهای معروف نیست: ماژول منتظر می‌ماند تا میزبان (آردوینو) با یک پالس آغاز کند، سپس ۴۰ بیت داده — شامل رطوبت، دما و یک بایت کنترل خطا به نام checksum — را با طول‌های متفاوت پالس ارسال می‌کند. تفسیر این ۴۰ بیت دقیقاً همان کاری است که کتابخانه برای شما می‌کند؛ خودتان آن را بنویسید اگر خواستید زمان‌سنجی در حد میکروثانیه تمرین کنید.

مقاومت pull-up (بالاکش) ۱۰ کیلواهمی روی خط داده لازم است تا حالت ساکت خط معین بماند؛ در ماژول‌های سه‌پایهٔ بردشکن (Breakout) این مقاومت از قبل روی برد نصب شده و نیازی به مقاومت جداگانه نیست.

سیم‌کشی

آردوینو Uno ماژول DHT (بردشکن ۳ پایه)
5V VCC
GND GND
D2 DATA
آردوینو Uno سنسور خام DHT (۴ پایه)
5V VCC
GND GND
D2 DATA (با مقاومت بالاکش ۱۰ کیلواهم به 5V)
— پایهٔ سوم NC و آزاد است

نصب کتابخانه

دو بسته از Library Manager لازم است و هر دو رسمی‌اند:

  1. در Arduino IDE به Tools ← Manage Libraries بروید (یا آیکن کتابخانه در نوار کناری).
  2. عبارت DHT sensor library را جست‌وجو کنید و بستهٔ DHT sensor library از Adafruit را نصب کنید.
  3. هنگام نصب، پنجره‌ای وابستگی‌ها (Dependencies) را می‌پرسد؛ Install All را بزنید تا بستهٔ Adafruit Unified Sensor هم نصب شود. اگر پنجره نیامد، همین نام را جداگانه در Library Manager جست‌وجو و نصب کنید.

بدون Adafruit Unified Sensor، کامپایل با خطای پیدا نشدن Adafruit_Sensor متوقف می‌شود — این پرتکرارترین اشتباه نصب این کتابخانه است.

اسکچ کامل: خواندن دما و رطوبت

این اسکچ هر ۲ ثانیه هر دو مقدار را می‌خواند و پیش از نمایش، اعتبار آن‌ها را بررسی می‌کند:

dht-read.ino
#include <DHT.h>

const int dhtPin = 2;
// DHT11 for the basic sensor; use DHT22 if you have that version
DHT dht(dhtPin, DHT11);

void setup() {
  Serial.begin(9600);
  dht.begin();
  Serial.println("DHT ready");
}

void loop() {
  delay(2000);

  float humidity = dht.readHumidity();
  float temperature = dht.readTemperature();  // Celsius by default

  if (isnan(humidity) || isnan(temperature)) {
    Serial.println("Sensor read failed");
    return;
  }

  Serial.print("Temp: ");
  Serial.print(temperature, 0);
  Serial.print(" C  Hum: ");
  Serial.print(humidity, 0);
  Serial.println(" %");
}

توضیح نکته‌های تازه:

  1. DHT dht(dhtPin, DHT11); — شیء سنسور با پین و نوع ساخته می‌شود؛ برای DHT22 فقط DHT11 را با DHT22 جایگزین کنید.
  2. dht.readTemperature() — پیش‌فرض سلسیوس برمی‌گرداند؛ آرگومان true فارنهایت می‌دهد.
  3. isnan(...) — چون DHT هر بار فقط یک نمونه می‌دهد و خطای خواندن در آن رایج است، کتابخانه در خطا مقدار ویژهٔ NaN (عدد-نیست) برمی‌گرداند. بررسی این مقدار پیش از هر استفاده، تفاوت کد قابل‌اتکا و کد شکننده است؛ با خطا هم فقط پیام Sensor read failed چاپ می‌شود و حلقه ادامه می‌یابد.
  4. Serial.print(temperature, 0); — آرگومان دوم تعداد رقم اعشار است؛ صفر یعنی نمایش صحیح.

خروجی سریال مانیتور در اتاق معمولی چنین است (مقادیر به شرایط شما بستگی دارد؛ قالب خط قطعی است):

خروجی کد

DHT ready Temp: 24 C Hum: 40 % Temp: 24 C Hum: 41 %

اشتباهات رایج و عیب‌یابی

نشانه علت رایج راه‌حل
همیشه Sensor read failed (NaN) نصب نشدن Adafruit Unified Sensor یا پین غلط هر دو بسته را نصب کنید؛ پین را با جدول سیم‌کشی چک کنید
همیشه NaN فقط روی سنسور خام نبود مقاومت بالاکش ۱۰ کیلواهم روی خط داده مقاومت را میان DATA و 5V ببندید یا بردشکن سه‌پایه بگیرید
خطای checksum در پیام‌ها دادهٔ خراب روی خط؛ سیم بلند یا نویز سیم داده را کوتاه کنید (زیر ۲۰ سانتی‌متر) و تغذیه را تمیز کنید
کامپایل نمی‌شود؛ Adafruit_Sensor پیدا نمی‌شود نصب نشدن وابستگی Adafruit Unified Sensor را جداگانه نصب کنید
مقادیر ثابت یا منفیِ بی‌معنا تغذیهٔ ناپایدار یا سیم‌بندی برعکس VCC/GND سیم‌کشی را بازبینی کنید؛ تغذیهٔ 5V بدهید

تمرین‌ها

تمرین

تمرین ۱ — هشدار دمای نامطبوع

به اسکچ dht-read منطق هشدار اضافه کنید: اگر دما بالاتر از ۲۷ درجه باشد پیام Too hot و اگر پایین‌تر از ۱۸ درجه باشد پیام Too cold چاپ شود؛ در بازهٔ میانی، پیام Comfortable نمایش داده شود.

نمایش راه‌حل

پس از بررسی NaN، کافی است دما را با دو آستانه بسنجید:

cpp
if (temperature > 27) {
  Serial.println("Too hot");
} else if (temperature < 18) {
  Serial.println("Too cold");
} else {
  Serial.println("Comfortable");
}

با دمای اتاق حدود ۲۴ درجه، خروجی سریال مانیتور چنین است:

خروجی کد

DHT ready Temp: 24 C Hum: 40 % Comfortable

::: :::

خلاصه

  • DHT11 ارزان و کم‌دقت است؛ DHT22 بازهٔ وسیع‌تر و دقت بالاتری دارد و هر دو با یک کد کار می‌کنند.
  • پروتکل سنسور اختصاصی و تک‌سیمه است و با 1-Wire و DS18B20 اشتباه نشود؛ مقاومت بالاکش ۱۰ کیلواهم روی خط داده لازم است.
  • کتابخانهٔ DHT sensor library از Adafruit و همراه با وابستهٔ Adafruit Unified Sensor از Library Manager نصب می‌شود.
  • خروجی نامعتبر با NaN مشخص می‌شود؛ همیشه با isnan بررسی کنید تا دادهٔ خراب به منطق برنامه راه نیابد.
  • این سنسورها تا ۰٫۵ هرتز سریع‌اند و برای نصب دائمی در فضای باز مناسب نیستند.

حالا شرایط محیط را می‌خوانید؛ در درس بعدی با سنسور PIR حرکت انسان را تشخیص می‌دهید و نخستین سیستم هشدار را می‌سازید.

منابع و ارجاع‌ها

درس‌های مرتبط