🌐 وبسرور ESP32: روشن کردن LED از گوشی، قدم به قدم
یکی از جذابترین پروژههای ESP32 این است که خودِ برد یک سایت کوچک بسازد. گوشی یا لپتاپ آدرس برد را باز میکند، دکمهای را میزند و LED روی میز روشن میشود. به این کار «وبسرور» میگویند و پایهی خیلی از پروژههای اینترنت اشیاء و خانهی هوشمند است.
وبسرور یعنی چه؟
وقتی آدرسی را در مرورگر باز میکنی، مرورگر یک «درخواست» به یک کامپیوتر میفرستد و آن کامپیوتر یک صفحه برمیگرداند. در این پروژه، آن کامپیوتر خودِ ESP32 است. ما به برنامه میگوییم برای هر آدرس چه کار کند:
/(صفحهی اصلی): صفحهای با دو دکمه برگردان./on: LED را روشن کن./off: LED را خاموش کن.
سه قدم اصلی در کد
#include <WiFi.h>
#include <WebServer.h>
WebServer server(80); // 1) build a server on port 80
void setup() {
pinMode(4, OUTPUT);
WiFi.begin("MyHome", "12345678");
while (WiFi.status() != WL_CONNECTED) delay(300);
// 2) say what each address does
server.on("/", []() {
server.send(200, "text/html",
"<a href='/on'>ON</a> | <a href='/off'>OFF</a>");
});
server.on("/on", []() { digitalWrite(4, HIGH); server.send(200, "text/plain", "ON"); });
server.on("/off", []() { digitalWrite(4, LOW); server.send(200, "text/plain", "OFF"); });
server.begin();
}
void loop() {
server.handleClient(); // 3) answer the browser, over and over
}
آن []() { … } یک «تابع بینام» است: کاری که باید برای آن آدرس انجام شود. میشد بهجایش یک تابع معمولی با اسم نوشت؛ هر دو کار میکنند.
server.handleClient() در loop(). بدون آن، صفحه هیچوقت جواب نمیدهد. شبیهساز هم دقیقاً همین را نشان میدهد و میگوید چه چیزی جا افتاده.دکمههای بدون رفتن به صفحهی دیگر (fetch)
در نسخهی ساده، با زدن لینک صفحه عوض میشود. در نسخهی بهتر، دکمه با fetch فقط یک درخواست کوچک میفرستد و صفحه سر جایش میماند:
<button onclick="fetch('/on')">ON</button>
<button onclick="fetch('/off')">OFF</button>
نشان دادن مقدار سنسور در صفحه
برای اینکه عدد یک سنسور در صفحه زنده عوض شود، یک آدرس /value میسازیم که فقط عدد را به شکل JSON برمیگرداند و صفحه هر نیم ثانیه آن را میخواند:
server.on("/value", []() {
int raw = analogRead(34); // 0..4095 on an ESP32
server.send(200, "application/json",
"{\"raw\":" + String(raw) + "}");
});
بدون برد هم امتحان کن
در مود آردوینوی شبیه ساز مدار، برد ESP32 را بیاور یا یکی از پروژههای آماده را باز کن: روشن کردن LED از صفحهی وب یا نمایش زندهی سنسور. شبیهسازی را اجرا کن و زیر کد، تب «مرورگر» را باز کن. صفحهای که برنامهات ساخته همانجا باز میشود و دکمههایش واقعاً LED روی صحنه را روشن میکنند.
وایفای در شبیهساز مجازی است: برد «وصل» میشود و یک آدرس مثل 192.168.1.42 میگیرد، ولی به اینترنت واقعی وصل نمیشود. برای یادگیری وبسرور همین کافی است.
یک قدم جلوتر: ESPAsyncWebServer و WebSocket
در وبسرور معمولی، صفحه هر بار باید از برد «بپرسد» چه خبر است. با کتابخانهی ESPAsyncWebServer برد خودش به درخواستها جواب میدهد (دیگر handleClient() لازم نیست) و با WebSocket صفحه و برد یک اتصال باز نگه میدارند تا هر تغییری فوراً به همه برسد.
AsyncWebServer server(80);
AsyncWebSocket ws("/ws");
void loop() {
ws.cleanupClients();
if (digitalRead(15) == LOW) ws.textAll("toggle");
}
هر دو در شبیهساز کار میکنند: وبسرور سریع با ESPAsyncWebServer و LED زنده با WebSocket (دکمهی روی مدار را بزن و ببین صفحه بدون رفرش عوض میشود).
قدم بعدی
- بهجای LED یک رله بگذار تا چراغ واقعی خانه را کنترل کنی (با کمک بزرگترها و برق ایمن!).
- دمای اتاق را با سنسور DHT در صفحه نشان بده.
- یک سروو را با یک اسلایدر در صفحه بچرخان.