🌡️ صفحهی وب دما و رطوبت با سنسور DHT روی ESP32
چه میشود اگر دمای اتاقت را از روی گوشی ببینی؟ در این پروژه یک سنسور DHT11 را به ESP32 وصل میکنیم و برد یک صفحهی وب میسازد که دما و رطوبت را نشان میدهد و هر پنج ثانیه خودش تازه میشود. این یکی از محبوبترین پروژههای ووکوی (Wokwi) و دنیای اینترنت اشیاست و ما آن را در شبیهساز ESP32 فارسی میسازیم.
سنسور DHT چیست؟
سنسور DHT یک قطعهی آبی یا سفید کوچک است که هم دما و هم رطوبت هوا را اندازه میگیرد و جوابش را بهصورت دیجیتال، فقط از یک سیم، میفرستد. DHT11 ارزانتر و سادهتر است و DHT22 دقیقتر. برای کار با آن از کتابخانهی DHT sensor library شرکت Adafruit استفاده میکنیم.
قطعهها و سیمکشی
| پایهی DHT11 | به ESP32 |
|---|---|
| VCC (+) | 3V3 |
| DATA (OUT) | GPIO15 |
| GND (−) | GND |
اگر سنسور خام (چهار پایه) داری، یک مقاومت ۱۰ کیلواهم بین DATA و 3V3 بگذار. ماژولهای سهپایه این مقاومت را خودشان دارند.
کد کامل
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
DHT dht(15, DHT11); // DATA on GPIO15, sensor type DHT11
WebServer server(80);
void handleRoot() {
float t = dht.readTemperature(); // Celsius
float h = dht.readHumidity(); // percent
String html = "<!doctype html><html><head><meta charset='utf-8'>";
html += "<meta name='viewport' content='width=device-width, initial-scale=1'>";
html += "<meta http-equiv='refresh' content='5'></head>"; // reload every 5 s
html += "<body style='font-family:sans-serif;text-align:center'>";
html += "<h2>ESP32 weather</h2>";
if (isnan(t) || isnan(h)) {
html += "<p>Sensor error! Check the DATA wire.</p>";
} else {
html += "<p>Temperature: <b>" + String(t, 1) + " C</b></p>";
html += "<p>Humidity: <b>" + String(h, 0) + " %</b></p>";
}
html += "</body></html>";
server.send(200, "text/html", html);
}
void setup() {
Serial.begin(115200);
dht.begin();
WiFi.begin("Wokwi-GUEST", ""); // simulator network, no password
while (WiFi.status() != WL_CONNECTED) delay(200);
Serial.print("Open http://");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.begin();
}
void loop() {
server.handleClient();
}
توضیح بخشهای مهم
DHT dht(15, DHT11);یک شیء سنسور میسازد: روی پین ۱۵ و از نوع DHT11. اگر DHT22 داری، فقط کلمهی دوم را عوض کن.dht.begin();سنسور را آماده میکند. بدون آن عددها خراب میآیند.readTemperature()دما را به سانتیگراد وreadHumidity()رطوبت را به درصد برمیگرداند.isnan(t)یعنی «آیا این عدد نامعتبر است؟». اگر سیم قطع باشد، کتابخانه بهجای عدد NaN برمیگرداند و ما بهجای نشان دادن «nan» یک پیام خطای قابلفهم مینویسیم.String(t, 1)عدد را با یک رقم اعشار به متن تبدیل میکند، مثلاً 24.5.- تگ
meta http-equiv='refresh'به مرورگر میگوید هر پنج ثانیه صفحه را دوباره بخواهد. سادهترین راه برای «زنده» نگه داشتن صفحه است؛ راههای حرفهایتر را در مقالههای بعدی میبینی.
ایده برای کاملتر کردن
وقتی صفحه کار کرد، میتوانی آن را به یک ایستگاه هواشناسی واقعی تبدیل کنی. بیشترین و کمترین دمای روز را در دو متغیر نگه دار و در صفحه نشان بده. یا اگر دما از ۳۰ درجه بالاتر رفت، یک LED قرمز روشن شود و متن صفحه هم قرمز شود. برای پروژهی مدرسه هم میتوانی هر ده دقیقه عدد را در سریال مانیتور چاپ کنی و بعد نمودارش را در اکسل بکشی.
امتحانش کن
این مدار آماده است: صفحهی وب دماسنج. مثال آمادهی دیگری که عدد سنسور را بدون رفرش کل صفحه نشان میدهد، نمایش زندهی سنسور در صفحهی وب است. خواندن هر دو رایگان است و اجرای ESP32 با اشتراک Plus است. اگر میخواهی خود DHT را اول بدون وایفای بشناسی، درس «دما و رطوبت با DHT» و برای نسخهی وبی، درس «صفحهی وب سنسور» را ببین.
اشکالهای رایج
- همیشه «Sensor error» میبینی: پین DATA به پینی غیر از ۱۵ وصل است یا نوع سنسور را اشتباه نوشتهای (DHT22 بهجای DHT11).
- خطای «DHT.h: No such file»: کتابخانهی DHT نصب نیست. در Arduino IDE آن را از Library Manager نصب کن؛ در Wokwi.com هم باید به فهرست کتابخانههای پروژه اضافه شود. صفحهی کتابخانهها توضیح میدهد.
- عددها خیلی دیر عوض میشوند: DHT11 کند است و حداکثر هر یک ثانیه یک بار جواب درست میدهد. خواندن سریعتر فایدهای ندارد.
- صفحهی فارسی بههمریخته است: تگ
meta charset='utf-8'را جا انداختهای.
قدم بعدی این است که بهجای HTML، دادهی خام بفرستیم تا هر برنامهای بتواند آن را بخواند: ساخت API با JSON روی ESP32. فهرست کامل پروژههای شبکه در وایفای و اینترنت اشیا است.
صفحهی دماسنج ESP32 را باز کن 🌡️