📡 ۳۰ مدار ESP32 با اسم فارسی و انگلیسی — از چشمکزن تا اینترنت اشیا
ESP32 محبوبترین برد اینترنت اشیاست: وایفای دارد، از آردوینو اونو خیلی سریعتر است و با همان زبان آردوینو برنامهنویسی میشود. ولی وقتی دنبال مدار ESP32 میگردی، معمولاً یا یک پروژهی تکی پیدا میکنی یا فهرستی از اسمها، بدون اینکه بدانی چه قطعهای لازم است و از کجا شروع کنی. این صفحه یک فهرست کامل است: ۳۰ مدار ESP32 با اسم کامل فارسی و انگلیسی، قطعهها، مفهومی که هر مدار یاد میدهد، اینکه در شبیهساز اجرا میشود یا نه، و آموزشی که همان مدار را قدمبهقدم درس میدهد. بعد پنج مدار را با جدول سیمکشی و کد کامل با هم میسازیم. اگر برای پروژهی درسی دنبال ایدههای بزرگتری، ۳۰ ایده پروژه اینترنت اشیا با ESP32 را هم ببین.
چهار قانون مدارهای ESP32
ESP32 از نظر کد خیلی شبیه آردوینو است، ولی چهار تفاوت سختافزاری دارد که اگر ندانی، مدار درست کار نمیکند یا برد آسیب میبیند:
- منطق ۳٫۳ ولت: پایههای ESP32 با ۳٫۳ ولت کار میکنند و ورودیهایش بیشتر از حدود ۳٫۶ ولت را تحمل نمیکنند. پتانسیومتر و سنسورها را به پایهی 3V3 وصل کن، نه 5V. اگر ماژولی خروجی ۵ ولتی دارد، مثل پایهی Echo سنسور HC-SR04، با دو مقاومت ولتاژش را پایین بیاور؛ روشش در بخش «مبدل سطح منطقی» از ۱۵ مدار پایهی الکترونیک آمده است.
- ADC1 برای سنسورهای آنالوگ: ADC این برد دوازدهبیتی است و عدد ۰ تا ۴۰۹۵ میدهد. پایههای ADC2 (مثل GPIO25 تا ۲۷ و GPIO12 تا ۱۵) با روشن شدن وایفای از دسترس خارج میشوند؛ پس سنسور آنالوگ را به GPIO32 تا ۳۹ (ADC1) وصل کن. برای خروجی دیجیتال و PWM این محدودیت وجود ندارد.
- PWM با ledc: در هستهی نسخهی ۳ آردوینوی ESP32، پایه را با
ledcAttach(pin, freq, bits)به PWM وصل میکنی و باledcWrite(pin, duty)مقدار میدهی. جزئیات و روش کانالی هستهی نسخهی ۲ در PWM روی ESP32 با ledc آمده است. - پایههای حساس: GPIO6 تا ۱۱ به حافظهی فلش وصلاند و روی DevKit سیپایه بیرون نیامدهاند. GPIO34 تا ۳۹ فقط ورودیاند و مقاومت pull-up داخلی ندارند. GPIO0، ۲، ۱۲ و ۱۵ هم موقع روشن شدن برد نقش دارند و بهتر است قطعهای آنها را بالا یا پایین نکشد. نقشهی کامل در پین اوت ESP32 است.
Wokwi-GUEST بدون رمز وصل میشود؛ وبسرور، WebSocket، MQTT و حافظهی فایل کار میکنند و صفحهای که برد میسازد در زبانهی «مرورگر» ویرایشگر باز میشود. ولی برد به اینترنت واقعی نمیرسد؛ پس ساعت NTP، گرفتن داده از یک API واقعی، دیپ اسلیپ، بلوتوث (BLE) و تسکهای FreeRTOS را روی برد واقعی امتحان کن. توضیح بیشتر در وایفای و اینترنت اشیا در شبیهساز.جدول ۳۰ مدار ESP32
مدارها را در پنج دسته از ساده به پیچیده چیدهایم. ستون «در شبیهساز؟» میگوید مدار در شبیهساز فارسی کامل اجرا میشود یا باید روی برد واقعی امتحانش کنی. ستون آخر آموزشی است که همان مدار، یا نسخهی آردوینوی آن با همان کتابخانه، را درس میدهد؛ «پایین همین صفحه» یعنی سیمکشی و کدش را در ادامه آوردهایم.
۱. مدارهای پایه: GPIO، PWM، ADC و لمس
| # | اسم فارسی | English name | قطعهها | مفهوم | در شبیهساز؟ | آموزش |
|---|---|---|---|---|---|---|
| ۱ | چشمکزن دو LED | Two-LED Blink | LED، مقاومت ۲۲۰ اهم | digitalWrite، LED داخلی روی GPIO2 | بله | اولین پروژهی ESP32 |
| ۲ | کلید تاگل با دکمه | Push-button Toggle | دکمه، LED، مقاومت | INPUT_PULLUP و رفع لرزش دکمه | بله | بخش مقاومت بالاکش در مدارهای پایه |
| ۳ | چراغ نفسکش | Breathing LED (LEDC Fade) | LED، مقاومت | ledcAttach و ledcWrite | بله | PWM با ledc |
| ۴ | دیمر با پتانسیومتر | Potentiometer Dimmer | پتانسیومتر، LED | ADC دوازدهبیتی و ledc | بله | analogRead در ESP32 |
| ۵ | کلید لمسی خازنی | Capacitive Touch Switch | یک سیم یا تکه فویل، LED | touchRead و انتخاب آستانه | نیمه: کد اجرا میشود ولی لمس حس نمیشود | پین لمسی ESP32 |
| ۶ | لامپ رنگی RGB | RGB Mood Lamp | LED RGB، سه مقاومت، پتانسیومتر | سه خروجی ledc و چرخهی رنگ | بله | پایین همین صفحه |
| ۷ | چراغ راهنمایی | Traffic Light | سه LED، سه مقاومت | ماشین حالت با millis | بله | پایین همین صفحه |
| ۸ | سروو با ولوم | Servo Knob | سروو، پتانسیومتر | کتابخانهی ESP32Servo و PWM پنجاه هرتز | بله | سروو با ESP32 |
۲. مدارهای سنسور
| # | اسم فارسی | English name | قطعهها | مفهوم | در شبیهساز؟ | آموزش |
|---|---|---|---|---|---|---|
| ۹ | چراغ خواب خودکار با فتوسل | LDR Auto Night Light | LDR، مقاومت ۱۰ کیلواهم، LED | مقسم ولتاژ روی ADC1 | بله | پایین همین صفحه |
| ۱۰ | دماسنج و رطوبتسنج | DHT22 Thermometer | سنسور DHT22 | کتابخانهی DHT و بررسی خطا با isnan | بله | DHT22 با آردوینو |
| ۱۱ | فاصلهسنج اولتراسونیک | Ultrasonic Distance Meter (HC-SR04) | HC-SR04، دو مقاومت برای Echo | pulseIn و مقسم ۵ به ۳٫۳ ولت | بله | فاصلهسنج HC-SR04 |
| ۱۲ | دزدگیر حرکتی | PIR Motion Alarm | سنسور PIR، بازر، LED | ورودی دیجیتال و زمانسنج millis | بله | سنسور حرکت PIR |
| ۱۳ | رطوبتسنج خاک گلدان | Soil Moisture Monitor | سنسور رطوبت خاک | ADC و کالیبره کردن خشک و خیس | بله | سنسور رطوبت خاک |
| ۱۴ | هشدار نشت گاز | Gas Leak Alarm (MQ-2) | سنسور MQ-2، بازر | آستانه و زمان گرم شدن سنسور | بله | سنسور گاز MQ-2 |
۳. مدارهای نمایشگر
| # | اسم فارسی | English name | قطعهها | مفهوم | در شبیهساز؟ | آموزش |
|---|---|---|---|---|---|---|
| ۱۵ | دماسنج با نمایشگر OLED | OLED Thermometer (SSD1306 + DHT22) | OLED، DHT22 | I2C روی GPIO21 و GPIO22 | بله | پایین همین صفحه |
| ۱۶ | نمایشگر LCD با ماژول I2C | I2C LCD 16×2 | LCD 16×2 با ماژول I2C | LiquidCrystal_I2C و آدرس 0x27 | بله | LCD I2C |
| ۱۷ | حلقهی رنگینکمان نئوپیکسل | NeoPixel Ring Rainbow | حلقهی ۱۲تایی WS2812 | Adafruit_NeoPixel و رنگ HSV | بله | رنگینکمان نئوپیکسل |
| ۱۸ | کرنومتر چهاررقمی | TM1637 Stopwatch | نمایشگر TM1637 | نمایش عدد و دونقطه با دو سیم | بله | نمایشگر TM1637 |
| ۱۹ | ماتریس LED هشت در هشت | 8×8 LED Matrix (MAX7219) | ماتریس با MAX7219 | SPI، شکلک و متن متحرک | بله | ماتریس MAX7219 |
۴. مدارهای وایفای و وب
| # | اسم فارسی | English name | قطعهها | مفهوم | در شبیهساز؟ | آموزش |
|---|---|---|---|---|---|---|
| ۲۰ | وصل شدن به وایفای | Wi-Fi Station Connect | فقط برد | WiFi.begin، گرفتن IP و وصل شدن دوباره | بله (Wokwi-GUEST) | اتصال ESP32 به وایفای |
| ۲۱ | وبسرور کنترل LED | Web Server LED Control | LED (و ولوم در نسخهی پایین صفحه) | کتابخانهی WebServer و مسیرها | بله | وبسرور ESP32 |
| ۲۲ | وبسرور بدون مودم | Access Point Web Server | LED | WiFi.softAP | بله | ESP32 در حالت Access Point |
| ۲۳ | صفحهی وب دما و رطوبت | DHT Weather Web Page | DHT22 | ساختن HTML در کد | بله | صفحهی وب دما |
| ۲۴ | دادهی زنده با WebSocket | Live WebSocket Dashboard | پتانسیومتر، LED | ارتباط دوطرفه بدون رفرش | بله | WebSocket روی ESP32 |
۵. پروژههای اینترنت اشیا (IoT)
| # | اسم فارسی | English name | قطعهها | مفهوم | در شبیهساز؟ | آموزش |
|---|---|---|---|---|---|---|
| ۲۵ | گرهی سنسور MQTT | MQTT Sensor Node | پتانسیومتر، LED | PubSubClient، تاپیک و بروکر | بله | پروژهی MQTT |
| ۲۶ | داشبورد خانهی هوشمند | Smart Home Dashboard | DHT، LED، ترانزیستور NPN، موتور، دیود | وبسرور و سرعت فن با PWM | بله | داشبورد خانهی هوشمند |
| ۲۷ | گلخانهی هوشمند | Smart Greenhouse | سنسور رطوبت خاک، DHT22، رله، فن | منطق کنترلی و صفحهی وب | بله | گلخانه هوشمند با ESP32 |
| ۲۸ | ساعت اینترنتی | NTP Internet Clock | برد (و یک نمایشگر) | configTime و وقت تهران | نه؛ اینترنت واقعی لازم است | ساعت NTP |
| ۲۹ | گزارش آبوهوا از API | HTTP Weather Client | برد (و یک نمایشگر) | HTTPClient و خواندن JSON | نه؛ فقط بخش JSON | HTTPClient در ESP32 |
| ۳۰ | سنسور باتریدار با خواب عمیق | Deep-Sleep Battery Sensor | DHT22، باتری | خواب عمیق و بیدار شدن با تایمر | نه؛ برد واقعی | دیپ اسلیپ ESP32 |
چرا برای بعضی سنسورها و نمایشگرها آموزش آردوینو را گذاشتهایم؟ چون کتابخانههای DHT، Adafruit_SSD1306، LiquidCrystal_I2C، Adafruit_NeoPixel و TM1637 روی ESP32 هم بدون تغییر کار میکنند. فقط سه چیز را عوض کن: شمارهی پایهها، باس I2C که روی ESP32 پایههای GPIO21 (SDA) و GPIO22 (SCL) است، و تغذیهی سنسورهایی که با ۳٫۳ ولت هم کار میکنند. سرعت سریال را هم ۱۱۵۲۰۰ بگذار.
پنج مدار ESP32 با سیمکشی و کد کامل
همهی کدهای زیر برای هستهی نسخهی ۳ آردوینوی ESP32 نوشته شدهاند و برد مرجع، ESP32 DevKit سیپایه است که در شبیهساز هم همین است. شمارهی هر مدار همان شمارهی جدول بالاست.
مدار ۷: چراغ راهنمایی بدون delay (Non-blocking Traffic Light)
چراغ راهنمایی اولین «ماشین حالت» هر کسی است: سبز، زرد، قرمز و دوباره سبز. اینجا بهجای delay زمان را با millis میسنجیم تا loop هیچوقت نایستد. این عادت در ESP32 حیاتی است، چون بعداً همین برنامه باید همزمان به وبسرور یا دکمهی عابر هم جواب بدهد.
| قطعه | پایهی قطعه | پایهی ESP32 |
|---|---|---|
| LED قرمز | آند، از راه مقاومت ۲۲۰ اهم | GPIO18 |
| LED زرد | آند، از راه مقاومت ۲۲۰ اهم | GPIO19 |
| LED سبز | آند، از راه مقاومت ۲۲۰ اهم | GPIO23 |
| هر سه LED | کاتد (پایهی کوتاه) | GND |
با ۳٫۳ ولت و LED قرمز با افت حدود ۲ ولت، جریان هر LED تقریباً (3.3 − 2) ÷ 220 ≈ ۶ میلیآمپر است؛ برای دیدن کافی است و به پایهها فشار نمیآورد.
// Traffic light on ESP32 without delay(): a tiny state machine.
const int RED = 18;
const int YELLOW = 19;
const int GREEN = 23;
const int GO = 0; // green
const int SLOW = 1; // yellow
const int STOP = 2; // red
const unsigned long DURATION[3] = {4000, 1500, 5000}; // ms for GO, SLOW, STOP
int phase = STOP;
unsigned long phaseStart = 0;
void show(int p) {
digitalWrite(GREEN, p == GO ? HIGH : LOW);
digitalWrite(YELLOW, p == SLOW ? HIGH : LOW);
digitalWrite(RED, p == STOP ? HIGH : LOW);
}
void setup() {
Serial.begin(115200);
pinMode(RED, OUTPUT);
pinMode(YELLOW, OUTPUT);
pinMode(GREEN, OUTPUT);
show(phase);
phaseStart = millis();
}
void loop() {
if (millis() - phaseStart >= DURATION[phase]) {
if (phase == STOP) phase = GO;
else if (phase == GO) phase = SLOW;
else phase = STOP;
show(phase);
phaseStart = millis();
Serial.print("phase: ");
Serial.println(phase == GO ? "GREEN" : (phase == SLOW ? "YELLOW" : "RED"));
}
// free time: read a button, update a display, serve a web page...
}
DURATION[3]زمان هر حالت را نگه میدارد. برای عوض کردن زمانبندی فقط همین آرایه را تغییر بده.- شرط
millis() - phaseStart >= DURATION[phase]میپرسد «زمان این حالت تمام شده؟» و اگر نه،loopفوراً تمام میشود و دوباره میچرخد. - تابع
showهمیشه هر سه چراغ را با هم تنظیم میکند؛ پس هیچوقت دو چراغ همزمان روشن نمیمانند.
همین مدار با آردوینو اونو بهصورت رایگان در پروژهی آمادهی چراغ راهنمایی هست. تمرین: یک دکمه روی GPIO4 با INPUT_PULLUP اضافه کن که با فشردنش، حالت سبز زودتر تمام شود.
مدار ۶: لامپ رنگی RGB با ledc (RGB Mood Lamp)
یک LED RGB سه LED قرمز، سبز و آبی در یک بدنه است. با سه خروجی PWM رنگها را ترکیب میکنیم و یک چرخهی رنگینکمانی آرام میسازیم. یک ولوم هم سرعت چرخش را تعیین میکند.
| قطعه | پایهی قطعه | پایهی ESP32 |
|---|---|---|
| LED RGB (کاتد مشترک) | پایهی قرمز، از راه ۲۲۰ اهم | GPIO25 |
| LED RGB | پایهی سبز، از راه ۲۲۰ اهم | GPIO26 |
| LED RGB | پایهی آبی، از راه ۲۲۰ اهم | GPIO27 |
| LED RGB | پایهی بلند (کاتد مشترک) | GND |
| پتانسیومتر | دو پایهی کناری / پایهی وسط | 3V3 و GND / GPIO34 |
// RGB mood lamp: three LEDC outputs, a knob on GPIO34 sets the speed (core 3.x)
const int R_PIN = 25;
const int G_PIN = 26;
const int B_PIN = 27;
const int KNOB = 34; // ADC1: keeps working when Wi-Fi is on
int hue = 0; // 0..359 degrees on the colour wheel
void setColor(int r, int g, int b) { // 0..255 each
ledcWrite(R_PIN, r);
ledcWrite(G_PIN, g);
ledcWrite(B_PIN, b);
}
// hue 0..359 -> a fully saturated colour, in six 60-degree sectors
void hueToRgb(int h) {
int x = (h % 60) * 255 / 60; // a 0..255 ramp inside each sector
int sector = h / 60;
if (sector == 0) setColor(255, x, 0);
else if (sector == 1) setColor(255 - x, 255, 0);
else if (sector == 2) setColor(0, 255, x);
else if (sector == 3) setColor(0, 255 - x, 255);
else if (sector == 4) setColor(x, 0, 255);
else setColor(255, 0, 255 - x);
}
void setup() {
Serial.begin(115200);
ledcAttach(R_PIN, 5000, 8); // 8-bit resolution: duty 0..255
ledcAttach(G_PIN, 5000, 8);
ledcAttach(B_PIN, 5000, 8);
}
void loop() {
int knob = analogRead(KNOB); // 0..4095
int wait = map(knob, 0, 4095, 2, 40); // ms per step: the knob is the speed
hueToRgb(hue);
hue = (hue + 1) % 360;
delay(wait);
}
ledcAttach(R_PIN, 5000, 8)هر پایه را با فرکانس ۵ کیلوهرتز و دقت ۸ بیت به PWM وصل میکند؛ پسledcWriteعددی بین ۰ تا ۲۵۵ میگیرد، مثلanalogWriteاونو.- GPIO25 تا ۲۷ روی ADC2 هستند، ولی اینجا خروجی PWMاند و وایفای مشکلی برایشان درست نمیکند. فقط ولوم، که ورودی آنالوگ است، روی GPIO34 از ADC1 نشسته است.
hueToRgbچرخ رنگ را به شش بخش ۶۰ درجهای تقسیم میکند و در هر بخش یکی از سه رنگ را آرام کم یا زیاد میکند. نتیجه، عبور نرم از قرمز به زرد و سبز و آبی و بنفش است.
setColor هر عدد را برعکس بنویس: ledcWrite(R_PIN, 255 - r).مدار ۹: چراغ خواب خودکار با فتوسل (LDR Auto Night Light)
هر چه اتاق تاریکتر شود، LED پرنورتر میشود. فتوسل (LDR) مقاومتی است که در نور کم میشود و در تاریکی زیاد. با یک مقاومت ۱۰ کیلواهم آن را به مقسم ولتاژ تبدیل میکنیم تا ESP32 بتواند ولتاژش را بخواند.
| قطعه | پایهی قطعه | پایهی ESP32 |
|---|---|---|
| فتوسل LDR | یک پایه | 3V3 |
| فتوسل LDR | پایهی دیگر | GPIO35 (ADC1) |
| مقاومت ۱۰ کیلواهم | بین GPIO35 و GND | GPIO35 / GND |
| LED | آند از راه ۲۲۰ اهم / کاتد | GPIO4 / GND |
حساب مقسم: ولتاژ پایهی ۳۵ برابر است با 3.3 × 10k ÷ (RLDR + 10k). در نور اتاق که LDR حدود ۱ کیلواهم است، 3.3 × 10 ÷ 11 ≈ ۳ ولت و عدد ADC حدود ۳۷۰۰ میشود. در تاریکی که LDR به حدود ۱۰۰ کیلواهم میرسد، 3.3 × 10 ÷ 110 = ۰٫۳ ولت و عدد حدود ۳۷۰ است.
// Automatic night light: the darker the room, the brighter the LED (core 3.x)
const int LDR_PIN = 35; // ADC1, input-only pin: perfect for a sensor
const int LED = 4;
const int DARK = 800; // reading we call "dark" (tune it with the Serial Monitor)
const int BRIGHT = 3000; // reading we call "bright"
void setup() {
Serial.begin(115200);
ledcAttach(LED, 5000, 8);
}
void loop() {
long sum = 0;
for (int i = 0; i < 16; i++) {
sum += analogRead(LDR_PIN); // average 16 samples to calm the noise
}
int light = sum / 16; // 0..4095
int level = constrain(light, DARK, BRIGHT);
int duty = map(level, DARK, BRIGHT, 255, 0); // dark -> 255, bright -> 0
ledcWrite(LED, duty);
Serial.print("light:");
Serial.print(light);
Serial.print(",led:");
Serial.println(duty);
delay(100);
}
- میانگین ۱۶ خوانش نویز ADC را صاف میکند؛ ADC ESP32 کمی پرنویزتر از اونو است.
constrainوmapبا دو سر برعکس (۲۵۵ و ۰) رابطه را وارونه میکنند: نور کم یعنی LED پرنور.- ADC ESP32 نزدیک صفر و نزدیک ۳٫۳ ولت خطی نیست. برای همین آستانههای
DARKوBRIGHTرا کمی دورتر از دو سر بازه گذاشتهایم. - خروجی با قالب
light:…,led:…چاپ میشود تا در نمودار سریال دو منحنی جدا ببینی.
مدار ۱۵: دماسنج با OLED و DHT22 (OLED Thermometer)
دما و رطوبت را با سنسور DHT22 میخوانیم و با عدد درشت روی یک نمایشگر OLED کوچک ۱۲۸ در ۶۴ نشان میدهیم. این مدار دو پروتکل را کنار هم یاد میدهد: I2C برای نمایشگر و ارتباط تکسیمهی DHT.
| قطعه | پایهی قطعه | پایهی ESP32 |
|---|---|---|
| DHT22 | VCC / DATA / GND | 3V3 / GPIO15 / GND |
| OLED SSD1306 | VCC / GND | 3V3 / GND |
| OLED SSD1306 | SDA / SCL | GPIO21 / GPIO22 |
اگر سنسور DHT22 تو ماژول نیست و خودِ قطعهی چهارپایه است، یک مقاومت ۱۰ کیلواهم بین DATA و 3V3 بگذار. سه کتابخانه لازم است: DHT sensor library، Adafruit SSD1306 و Adafruit GFX.
// DHT22 + SSD1306 OLED thermometer on ESP32 (I2C on GPIO21 / GPIO22)
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <DHT.h>
#define DHT_PIN 15
#define DHT_TYPE DHT22
Adafruit_SSD1306 display(128, 64, &Wire, -1);
DHT dht(DHT_PIN, DHT_TYPE);
void setup() {
Serial.begin(115200);
Wire.begin(21, 22); // SDA, SCL: the ESP32 defaults
if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
Serial.println("OLED not found at 0x3C");
while (true) delay(1000);
}
dht.begin();
display.setTextColor(SSD1306_WHITE);
}
void loop() {
float t = dht.readTemperature(); // Celsius
float h = dht.readHumidity(); // percent
display.clearDisplay();
display.setTextSize(1);
display.setCursor(0, 0);
display.println("ESP32 thermometer");
if (isnan(t) || isnan(h)) {
display.setCursor(0, 24);
display.println("Sensor error");
Serial.println("DHT read failed");
} else {
display.setTextSize(2);
display.setCursor(0, 20);
display.print(t, 1);
display.println(" C");
display.setCursor(0, 44);
display.print(h, 0);
display.println(" %");
Serial.print("t=");
Serial.print(t, 1);
Serial.print(" h=");
Serial.println(h, 0);
}
display.display(); // nothing shows until this line
delay(2000); // DHT22: one reading per 2 seconds at most
}
Wire.begin(21, 22)باس I2C را روی پایههای پیشفرض ESP32 راه میاندازد. اگر سیمها را جای دیگری زدهای، همین دو عدد را عوض کن.display.begin(…, 0x3C)آدرس رایج OLED را میگیرد. اگر نمایشگر پیدا نشد، برنامه پیغام میدهد و میایستد، بهجای اینکه بیصدا صفحهی سیاه نشان بدهد.isnanخوانش ناموفق DHT را تشخیص میدهد؛ معمولاً یعنی سیم داده جابهجاست یا سنسور را زودتر از دو ثانیه دوباره خواندهای.
توضیح کامل دستورهای OLED در OLED SSD1306 با آردوینو آمده و روی ESP32 هم عیناً همان است.
مدار ۲۱ (نسخهی کاملتر): صفحهی وب LED و ولوم (Web LED and Knob Page)
حالا وایفای را اضافه میکنیم. ESP32 به شبکه وصل میشود و یک صفحهی وب میسازد که وضعیت LED روی برد و عدد یک ولوم را نشان میدهد و با یک لینک LED را روشن و خاموش میکند. این مدار دقیقاً جایی است که قانون ADC1 خودش را نشان میدهد.
| قطعه | پایهی قطعه | پایهی ESP32 |
|---|---|---|
| LED آبی روی برد | از قبل وصل است | GPIO2 |
| پتانسیومتر | دو پایهی کناری / پایهی وسط | 3V3 و GND / GPIO34 (ADC1) |
// Wi-Fi web page: toggle the on-board LED and read a knob (ESP32)
#include <WiFi.h>
#include <WebServer.h>
const char* SSID = "Wokwi-GUEST"; // the simulator's virtual network, no password
const char* PASS = "";
const int LED = 2; // the blue on-board LED
const int KNOB = 34; // ADC1 only! ADC2 pins stop reading while Wi-Fi is on
WebServer server(80);
bool ledOn = false;
String page() {
String html = "<!DOCTYPE html><html><head><meta charset='utf-8'>";
html += "<meta name='viewport' content='width=device-width'></head><body>";
html += "<h1>ESP32</h1><p>LED: ";
html += ledOn ? "ON" : "OFF";
html += "</p><p>Knob: ";
html += String(analogRead(KNOB));
html += " / 4095</p><p><a href='/toggle'>Toggle LED</a> | <a href='/'>Refresh</a></p>";
html += "</body></html>";
return html;
}
void handleRoot() {
server.send(200, "text/html", page());
}
void handleToggle() {
ledOn = !ledOn;
digitalWrite(LED, ledOn ? HIGH : LOW);
server.send(200, "text/html", page());
}
void setup() {
Serial.begin(115200);
pinMode(LED, OUTPUT);
WiFi.begin(SSID, PASS);
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(250);
Serial.print(".");
}
Serial.println();
Serial.print("Open http://");
Serial.println(WiFi.localIP());
server.on("/", handleRoot);
server.on("/toggle", handleToggle);
server.begin();
}
void loop() {
server.handleClient(); // answer the browser; never block this loop
}
- در شبیهساز اسم شبکه
Wokwi-GUESTبا رمز خالی است؛ روی برد واقعی اسم و رمز مودم خودت را بنویس. - بعد از اجرا آدرس IP در سریال مانیتور چاپ میشود. در شبیهساز لازم نیست آن را جایی کپی کنی؛ زبانهی «مرورگر» ویرایشگر صفحه را باز میکند.
- اگر ولوم را به GPIO25 ببری، با روشن بودن وایفای عدد درستی نمیگیری؛ این همان دام ADC2 است. GPIO32 تا ۳۹ را انتخاب کن.
server.handleClient()باید مدام صدا زده شود؛delayطولانی درloopصفحه را کند یا قطع میکند.
نسخهی آماده با دکمههای ON و OFF در پروژهی روشن کردن LED از صفحهی وب هست و درس وبسرور: LED از مرورگر آن را با تمرین درس میدهد.
این مدارها را کجا بسازی؟
- شبیهساز تینکرکد فارسی: برد ESP32 DevKit و همهی قطعههای این فهرست آنجا هست؛ با کلیک روی پایهها سیم میکشی، کد را کنار مدار مینویسی و سریال مانیتور، نمودار و مرورگر مجازی را کنار هم میبینی. روی گوشی و اینترنت ملی هم باز میشود. پروژههای آماده را رایگان باز میکنی و کد و مدارشان را میبینی؛ اجرای ESP32 جزو اشتراک Plus تینکرکد فارسی است. همهی امکاناتش در صفحهی شبیه ساز ESP32 جمع شده است.
- wokwi.com: سایت بینالمللی ووکوی هم برد ESP32 (با شناسهی
board-esp32-devkit-c-v4) و قطعههایی مثل LED، پتانسیومتر، DHT22، HC-SR04 و OLED را دارد و اسم شبکهی مجازیاش همWokwi-GUESTاست. ساختن قدمبهقدم یک مدار آنجا را در ساخت مدار در ووکوی نوشتهایم و فرق دو شبیهساز را در ووکوی یا تینکرکد. - برد واقعی: وقتی مدار در شبیهساز درست کار کرد، همان کد را با Arduino IDE روی برد بریز. نصب هسته و درایور در نصب ESP32 در آردوینو IDE آمده است. مدارهای «نه» در جدول بالا، یعنی NTP، API واقعی و خواب عمیق، فقط همینجا کامل امتحان میشوند.
اشکالهای رایج در مدارهای ESP32
- analogRead همیشه ۰ یا ۴۰۹۵ است: سنسور روی پایهی ADC2 است و وایفای روشن است، یا پایهی کناری پتانسیومتر را به 5V زدهای. ADC1 و 3V3.
- LED کمنور است: ESP32 با ۳٫۳ ولت کار میکند و با مقاومت ۲۲۰ اهم جریان کمتری از اونو میگیری. برای نور بیشتر مقاومت ۱۵۰ اهم کافی است (حدود ۸ میلیآمپر برای LED قرمز)؛ کمتر از آن نرو.
- برد بعد از وصل کردن یک قطعه بوت نمیشود: قطعهای GPIO12 را بالا یا GPIO0 را پایین کشیده است. آن را به پایهی دیگری ببر.
- خطای ledcAttach was not declared: هستهی نسخهی ۲ نصب است؛ یا بهروزش کن یا از روش کانالی
ledcSetupوledcAttachPinاستفاده کن. - با روشن شدن وایفای برد ریست میشود و Brownout مینویسد: تغذیهی USB یا کابل ضعیف است؛ وایفای لحظهای جریان زیادی میکشد.
- با حرکت سروو یا موتور برد ریست میشود: موتور را از منبع جدا تغذیه کن و فقط GNDها را به هم وصل کن.
همهی مقالههای این مجموعه، از ساخت مدار تا شبیهسازی، در بخش مدار و شبیهسازی مدار جمع شدهاند. اگر با رزبری پای پیکو کار میکنی، ۲۵ مدار رزبری پای پیکو با میکروپایتون را ببین، و برای مدارهای آردوینو اونو فهرست مدارهای آردوینو در تینکرکد فارسی آماده است.
وبسرور ESP32 را در تینکرکد فارسی باز کن 📡سؤالهای رایج
مدار ESP32 با مدار آردوینو اونو چه فرقی دارد؟
منطق پایههای ESP32 سه و سهدهم ولت است نه پنج ولت، ADC آن دوازدهبیتی است و عددی بین ۰ تا ۴۰۹۵ میدهد، PWM با واحد ledc ساخته میشود و وایفای دارد. مقاومتها و بیشتر سنسورها هماناند، ولی هیچ سیگنال پنجولتی را مستقیم به پایهی ESP32 وصل نکن.
کدام مدارهای ESP32 در شبیهساز اجرا نمیشوند؟
هر مداری که به اینترنت واقعی، NTP، دیپ اسلیپ، بلوتوث (BLE) یا FreeRTOS نیاز دارد. وایفای با شبکهی مجازی Wokwi-GUEST، وبسرور، WebSocket، MQTT و حافظهی فایل کار میکنند. touchRead هم اجرا میشود ولی لمس انگشت را حس نمیکند.
چرا وقتی وایفای روشن است analogRead درست کار نمیکند؟
پایههایی که روی ADC2 هستند، مثل GPIO25 تا ۲۷ و GPIO12 تا ۱۵، با روشن شدن وایفای در دسترس نیستند. سنسورهای آنالوگ را به پایههای ADC1 یعنی GPIO32 تا ۳۹ وصل کن.
اجرای مدارهای ESP32 در شبیهساز فارسی رایگان است؟
باز کردن پروژهها و خواندن کد و مدارشان رایگان است. اجرای ESP32 جزو اشتراک Plus تینکرکد فارسی است. مدارهای پایه مثل LED، دکمه و پتانسیومتر را میتوانی رایگان با آردوینو اونو تمرین کنی.