🌡️ سنسور دما و رطوبت DHT22 و DHT11 با آردوینو: سیمکشی، کد کامل و ترموستات کوچک
دمای اتاق چند درجه است و هوا چقدر شرجی است؟ این دو عدد پایهی خیلی از پروژهها هستند: ایستگاه هواشناسی، گلخانه، جوجهکشی، کنترل کولر و حتی یک دماسنج ساده روی میز. محبوبترین و سادهترین راه برای خواندن هر دو با هم، سنسور DHT22 و برادر کوچکش DHT11 است. در این آموزش یاد میگیریم این سنسورها چطور کار میکنند، چطور به آردوینو اونو وصل میشوند، با کتابخانهی DHT چه کدی بنویسیم و در آخر یک ترموستات کوچک با رله میسازیم. همهی اینها را میشود رایگان در شبیهساز فارسی امتحان کرد؛ همان کاری که خیلیها با ووکوی (Wokwi) انجام میدهند.
سنسور DHT چطور کار میکند؟
داخل قاب سفید یا آبی DHT دو حسگر کوچک هست. یکی ترمیستور است؛ مقاومتی که با گرم و سرد شدن عوض میشود. دیگری یک لایهی جاذب رطوبت بین دو الکترود است که هرچه هوا مرطوبتر باشد، رفتار الکتریکیاش تغییر میکند. یک تراشهی کوچک داخل سنسور این دو را اندازه میگیرد، به عدد تبدیل میکند و از راه فقط یک سیم داده برای آردوینو میفرستد. پس برخلاف سنسورهای آنالوگ، اینجا analogRead نداریم؛ آردوینو با یک پروتکل زمانبندیشدهی دیجیتال، چهل بیت داده از سنسور تحویل میگیرد. خبر خوب این است که کتابخانه همهی این زمانبندیها را خودش انجام میدهد و تو فقط میگویی «دما را بده».
DHT11 یا DHT22؟
| ویژگی | DHT11 (آبی) | DHT22 / AM2302 (سفید) |
|---|---|---|
| بازهی دما | ۰ تا ۵۰ درجه | ۴۰- تا ۸۰ درجه |
| دقت دما | حدود ۲± درجه | حدود ۰٫۵± درجه |
| بازهی رطوبت | ۲۰ تا ۹۰ درصد | ۰ تا ۱۰۰ درصد |
| سرعت خواندن | یک بار در ثانیه | یک بار در هر دو ثانیه |
| ولتاژ کار | ۳٫۳ تا ۵ ولت | ۳٫۳ تا ۵ ولت |
اگر فقط دمای اتاق را میخواهی، DHT11 کافی است. اگر بیرون از خانه، زیر صفر یا با دقت بیشتر کار داری، DHT22 بخر. نکتهی جالب: کد هر دو تقریباً یکی است.
پایهها (پین اوت)
سنسور خام چهار پایه دارد. اگر جلوی سنسور (سمت مشبک) را ببینی، از چپ به راست: VCC، DATA، NC (وصل نمیشود) و GND. روی سنسور خام باید یک مقاومت ۱۰ کیلواهم بین DATA و VCC بگذاری؛ این همان مقاومت پولآپ است که خط داده را در حالت بیکار بالا نگه میدارد. ماژولهای سهپایه که روی یک برد کوچک لحیم شدهاند، این مقاومت را از قبل دارند و فقط سه پایهی +، OUT و − دارند.
قطعهها و سیمکشی
- یک آردوینو Uno
- یک سنسور دما و رطوبت DHT (DHT22 یا DHT11)
- یک مقاومت ۱۰ کیلواهم (فقط برای سنسور خام چهارپایه)
| پایهی سنسور | آردوینو | توضیح |
|---|---|---|
| VCC (+) | 5V | تغذیه |
| DATA (OUT) | پین دیجیتال 2 | با مقاومت ۱۰k به 5V، اگر ماژول نیست |
| NC | هیچجا | فقط در سنسور خام |
| GND (−) | GND | زمین مشترک |
کد کامل
// DHT22 / DHT11 on an Arduino Uno: temperature, humidity and heat index.
#include <DHT.h>
#define DHTPIN 2 // DATA pin of the sensor
#define DHTTYPE DHT22 // change to DHT11 if that is what you have
DHT dht(DHTPIN, DHTTYPE);
void setup() {
Serial.begin(9600);
dht.begin();
Serial.println("DHT test starting...");
}
void loop() {
delay(2000); // DHT22 needs 2 s between reads
float h = dht.readHumidity(); // percent
float t = dht.readTemperature(); // Celsius
if (isnan(h) || isnan(t)) { // NaN = the read failed
Serial.println("Read failed - check wiring and DHTTYPE");
return;
}
float feels = dht.computeHeatIndex(t, h, false); // false = Celsius
Serial.print("temp:");
Serial.print(t, 1);
Serial.print(" humidity:");
Serial.print(h, 0);
Serial.print(" feels:");
Serial.println(feels, 1);
}
توضیح خطهای مهم
#include <DHT.h>کتابخانهی DHT را میآورد. روی کامپیوتر خودت باید «DHT sensor library» از Adafruit را از Library Manager نصب کنی. اگر نمیدانی کتابخانه چیست، همین یک خط کلی کد آماده برایت میآورد.DHT dht(DHTPIN, DHTTYPE);یک شیء سنسور میسازد و به آن میگوید روی کدام پین است و چه مدلی است. مدل اشتباه یعنی عددهای عجیب، چون فرمت دادهی DHT11 و DHT22 فرق دارد.delay(2000);سنسور DHT22 حداکثر هر دو ثانیه یک اندازهگیری تازه دارد. اگر تندتر بخوانی، یا همان عدد قبلی را میگیری یا خطا.isnan(h) || isnan(t)اگر ارتباط برقرار نشود، کتابخانه بهجای عدد، مقدار ویژهی NaN («عدد نیست») برمیگرداند. این شرط جلوی چاپ عددهای بیمعنی را میگیرد.computeHeatIndex«دمای حسشده» را حساب میکند: ۳۲ درجه در هوای خشک با ۳۲ درجهی شرجی فرق دارد و بدن دومی را گرمتر حس میکند.- قالب
temp:… humidity:…مخصوص نمودار سریال است؛ هر اسم یک خط جدا روی نمودار میشود. دربارهاش در آموزش سریال مانیتور و پلاتر بیشتر خواندیم.
Serial.print(t, 1) تعداد رقم اعشار است. برای رطوبت صفر گذاشتیم چون دقت سنسور اجازهی اعشار معنادار نمیدهد.اجرا در شبیهساز، رایگان
سنسور DHT در تینکرکد فارسی روی آردوینو اونو کاملاً رایگان است. وقتی سنسور را انتخاب میکنی، در پنل ویژگیها دو دکمهی DHT11 و DHT22 و دو اسلایدر برای «دمای هوا» و «رطوبت هوا» میبینی؛ بازهی اسلایدرها هم مثل سنسور واقعی است، یعنی برای DHT11 زیر صفر نمیرود. اسلایدر را بکش و ببین عدد سریال مانیتور و نمودار چطور عوض میشوند. مثال آمادهی «دما و رطوبت با DHT11» با پیام راحتی («گرم است، آب بخور») را باز کن و اگر درسمحور جلو میروی، درس دما و رطوبت با DHT قدمبهقدم همراهت است. برای فهم بهتر خود رطوبتسنج هم توضیح سنسور رطوبت در واژهنامه خواندنی است.
پروژهی کوچک: ترموستات فن با رله
حالا عدد را به کار تبدیل کنیم. میخواهیم وقتی اتاق از ۲۸ درجه گرمتر شد، یک فن (از راه یک رله) روشن شود و وقتی زیر ۲۶ درجه آمد خاموش شود. فاصلهی دو درجهای بین روشن و خاموش اسم دارد: هیسترزیس. بدون آن، وقتی دما دقیقاً حول ۲۸ درجه بالا و پایین برود، رله مدام تقتق روشن و خاموش میشود و هم خودش و هم فن خراب میشوند. یک LED هم روی پین ۱۳ هشدار رطوبت بالای ۷۰ درصد میدهد.
// Mini project: a fan on a relay with hysteresis, controlled by a DHT22.
#include <DHT.h>
DHT dht(2, DHT22);
const int RELAY_PIN = 7;
const int LED_PIN = 13;
const float ON_AT = 28.0; // fan on above this
const float OFF_AT = 26.0; // fan off below this
bool fanOn = false;
unsigned long lastRead = 0;
void setup() {
Serial.begin(9600);
dht.begin();
pinMode(RELAY_PIN, OUTPUT);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (millis() - lastRead < 2000) return; // read every 2 s without delay()
lastRead = millis();
float t = dht.readTemperature();
float h = dht.readHumidity();
if (isnan(t) || isnan(h)) return;
if (!fanOn && t > ON_AT) fanOn = true;
if (fanOn && t < OFF_AT) fanOn = false;
digitalWrite(RELAY_PIN, fanOn ? HIGH : LOW);
digitalWrite(LED_PIN, h > 70 ? HIGH : LOW); // humid warning
Serial.print("temp:");
Serial.print(t);
Serial.print(" fan:");
Serial.println(fanOn ? 1 : 0);
}
این بار بهجای delay از millis استفاده کردیم تا loop هیچوقت قفل نشود و بعداً بتوانی دکمه یا نمایشگر هم اضافه کنی. در شبیهساز اسلایدر دما را از ۲۵ تا ۳۰ بکش و ببین رله دقیقاً کجا روشن و کجا خاموش میشود. دربارهی سیمکشی امن خود رله و فن ۲۲۰ ولتی، آموزش ماژول رله با آردوینو را بخوان.
اشکالهای رایج
- همیشه «Read failed»: پایهی DATA به پینی غیر از عددی که در کد نوشتهای وصل است، یا روی سنسور خام مقاومت ۱۰ کیلواهم را نگذاشتهای.
- دما ۲۰۰ یا رطوبت منفی: نوع سنسور را اشتباه نوشتهای. DHT11 را با
DHT22بخوانی (یا برعکس)، بیتها اشتباه تفسیر میشوند. - خطای DHT.h: No such file or directory: کتابخانه نصب نیست. «DHT sensor library» را از Library Manager نصب کن و وابستگیهایش را هم قبول کن.
- عدد گاهی nan میشود: سیم داده بلند است (بیشتر از چند متر) یا بیش از حد تند میخوانی. فاصلهی دو ثانیه را رعایت کن و سیم را کوتاه نگه دار.
- دما دو سه درجه بیشتر از واقعی است: سنسور را کنار رگولاتور یا خود آردوینو گذاشتهای که گرم میشوند. چند سانتیمتر دورش کن.
- پایهها را برعکس شمردهای: شمارش پایهها از سمت مشبک جلوی سنسور است، نه از پشت آن. اگر VCC و GND جابهجا شوند، سنسور داغ میشود و ممکن است بسوزد.
میخواهی همین عددها را در مرورگر گوشی ببینی؟ نسخهی وایفایدارش را در ایستگاه هواشناسی ESP32 با DHT ساختهایم و اگر میکروپایتون دوست داری، DHT با رزبری پای پیکو را ببین. بقیهی سنسورها هم در بخش سنسورها و ماژولها جمع شدهاند.
دماسنج DHT را رایگان اجرا کن 🌡️سؤالهای رایج
DHT11 بهتر است یا DHT22؟
برای یادگیری و دمای اتاق هر دو کافیاند. DHT22 دقیقتر است (حدود نیم درجه)، بازهی بزرگتری دارد و زیر صفر را هم میخواند؛ DHT11 ارزانتر است ولی فقط صفر تا پنجاه درجه را با خطای حدود دو درجه میدهد. کد هر دو یکی است و فقط نوع سنسور در سازنده عوض میشود.
چرا سنسور DHT عدد nan برمیگرداند؟
یعنی خواندن شکست خورده است. معمولاً پایهی DATA به پین دیگری وصل است، مقاومت پولآپ روی سنسور خام جا افتاده، نوع سنسور در کد اشتباه است یا سریعتر از هر دو ثانیه یک بار خواندهای.
برای DHT22 کدام کتابخانه را نصب کنم؟
کتابخانهی DHT sensor library از Adafruit را از Library Manager نصب کن؛ آردوینو IDE پیشنهاد میکند وابستگیاش Adafruit Unified Sensor را هم نصب کنی که باید قبول کنی. در شبیهساز فارسی این کتابخانه از قبل آماده است.