🏠 داشبورد خانهی هوشمند روی گوشی با ESP32
وقت آن است که هرچه یاد گرفتهای را کنار هم بگذاری. در این پروژه یک داشبورد خانهی هوشمند میسازیم: یک صفحهی وب مرتب که روی گوشی باز میشود و سه کار میکند؛ کلید چراغ، نمایش دمای اتاق و اسلایدر سرعت پنکه. همهچیز را در شبیهساز ESP32 فارسی میسازیم و تست میکنیم؛ همان کاری که در ووکوی (Wokwi) انجام میدادی، این بار با راهنمای فارسی و درسبهدرس.
چه چیزهایی کنار هم میآیند؟
- وبسرور برای صفحه و فرمانها (از مقالهی وبسرور)
- ledc برای سرعت موتور (از مقالهی PWM)
- DHT11 برای دما
- fetch در جاوااسکریپت تا صفحه بدون رفرش بهروز شود
قطعهها و سیمکشی
| قطعه | اتصال |
|---|---|
| LED (چراغ) + مقاومت ۲۲۰ اهم | GPIO4 → مقاومت → LED → GND |
| DHT11 | VCC به 3V3، DATA به GPIO15، GND به GND |
| ترانزیستور NPN | بیس از طریق مقاومت ۱ کیلواهم به GPIO25، امیتر به GND |
| موتور DC (پنکه) | یک سر به منبع مثبت موتور، سر دیگر به کلکتور ترانزیستور |
| دیود | موازی با موتور، خط دیود سمت مثبت (برای محافظت) |
کد کامل
این کد برای هستهی ESP32 نسخهی ۳ (ledcAttach) نوشته شده است:
#include <WiFi.h>
#include <WebServer.h>
#include <DHT.h>
const int LAMP = 4; // LED = the lamp
const int FAN = 25; // NPN transistor base -> DC motor
DHT dht(15, DHT11);
WebServer server(80);
const char page[] PROGMEM = R"rawliteral(<!DOCTYPE html><html>
<head><meta name="viewport" content="width=device-width, initial-scale=1"></head>
<body style="font-family:sans-serif;text-align:center">
<h2>My home</h2>
<p>Lamp <input type="checkbox" onchange="fetch('/lamp?on='+(this.checked?1:0))"></p>
<p>Temperature: <b id="t">...</b></p>
<p>Fan <input type="range" min="0" max="255" value="0" onchange="fetch('/fan?v='+this.value)"></p>
<script>
setInterval(function () {
fetch('/temp').then(function (r) { return r.text(); })
.then(function (x) { document.getElementById('t').innerText = x + ' C'; });
}, 2000);
</script></body></html>
)rawliteral";
void setup() {
Serial.begin(115200);
pinMode(LAMP, OUTPUT);
ledcAttach(FAN, 1000, 8); // motor speed by PWM, 0..255 (core 3.x)
dht.begin();
WiFi.begin("Wokwi-GUEST", ""); // simulator network, no password
while (WiFi.status() != WL_CONNECTED) delay(200);
Serial.println(WiFi.localIP());
server.on("/", []() { server.send(200, "text/html", page); });
server.on("/lamp", []() {
bool on = server.arg("on") == "1";
digitalWrite(LAMP, on ? HIGH : LOW);
server.send(200, "text/plain", on ? "lamp on" : "lamp off");
});
server.on("/fan", []() {
int v = constrain(server.arg("v").toInt(), 0, 255);
ledcWrite(FAN, v);
server.send(200, "text/plain", String(v));
});
server.on("/temp", []() {
float t = dht.readTemperature();
server.send(200, "text/plain", isnan(t) ? String("--") : String(t, 1));
});
server.begin();
}
void loop() {
server.handleClient();
}
توضیح بخشهای مهم
- تگ
meta name="viewport"باعث میشود صفحه روی گوشی ریز و ناخوانا نشود. - چکباکس چراغ با
onchangeآدرس/lamp?on=1یا/lamp?on=0را صدا میزند. در C++ باserver.arg("on")همان عدد را میخوانیم. - اسلایدر عددی بین ۰ تا ۲۵۵ میفرستد.
constrainمطمئن میشود حتی اگر کسی آدرس را دستی با عدد عجیب باز کند، مقدار از این بازه بیرون نزند. ledcAttach(FAN, 1000, 8)پین موتور را PWM با ۸ بیت دقت میکند، پسledcWrite(FAN, v)مستقیم عدد اسلایدر را میگیرد.setInterval(..., 2000)هر دو ثانیه فقط عدد دما را از/tempمیگیرد، نه کل صفحه را. این خیلی سبکتر از رفرش کامل است.- اگر سنسور جواب ندهد، بهجای «nan» علامت
--نشان میدهیم.
امتحانش کن
این مدار کامل در تینکرکد فارسی آماده است: داشبورد خانه روی گوشی. صفحهی ESP32 در مرورگر مجازی شبیهساز باز میشود و با تیک زدن چراغ و کشیدن اسلایدر، LED و موتور را در مدار سهبعدی میبینی. خواندن مثال رایگان است و اجرای ESP32 با اشتراک Plus. توضیح قدمبهقدم در درس «پروژه: داشبورد خانه روی گوشی» است.
اشکالهای رایج
- موتور نمیچرخد ولی LED کار میکند: ترانزیستور برعکس است یا مقاومت بیس را جا انداختهای. پایههای امیتر، بیس و کلکتور را دوباره چک کن.
- ESP32 با روشن شدن موتور ریست میشود: موتور از همان تغذیهی برد برق میکشد. روی مدار واقعی برای موتور منبع جدا بگذار و فقط GNDها را مشترک کن.
- دما همیشه «--» است: سیم DATA سنسور به پینی غیر از GPIO15 وصل است.
- اسلایدر فقط وقتی رها میکنی اثر دارد: درست است؛
onchangeاینطور کار میکند. برای تغییر لحظهای ازoninputاستفاده کن.
برای کنترل از بیرون خانه و وصل کردن چند برد، این داشبورد را با MQTT ترکیب کن. همهی پروژههای شبکه در وایفای و اینترنت اشیا.
داشبورد خانهی هوشمند را باز کن 🏠