در این فصل چه میسازی#
سه ترم است دستگاههای باهوشی میسازی: چراغ راهنمایی، ایستگاه هواشناسی، رباتی که مانع را دور میزند. همهشان کار میکنند — ولی همهشان یک مشکل مشترک دارند: تنها هستند. ایستگاه هواشناسیات دمای اتاق را میداند، ولی نمیتواند به گوشیِ تو خبر بدهد. هر کدام فقط همان چند سانتیمتر اطراف خودش را میشناسد.
در این فصل این دیوار را برمیداری. یک راز را میگویم: همین برد ESP32 که اینهمه وقت میشناسی، از روز اول یک رادیوی WiFi کامل داخل خودش داشت — درست زیر همان قاب فلزی که رویش نوشته ESP32-WROOM. امروز این رادیو را بیدار میکنی، بردت را عضو رسمی شبکهٔ خانه میکنی، از روتر «پلاک» میگیری، و آخر فصل یک چراغ اتصال میسازی که بدون کامپیوتر هم بگوید بردت وصل است یا نه. این همان اتفاقی است که در شبکه میافتد — بردت یک همسایهٔ تازه با پلاک خودش میشود:

آخر این فصل میتوانی:
- با مدل «روتر = اداره پست، IP = پلاک خانه» توضیح بدهی شبکهٔ خانه چطور کار میکند و SSID و پسورد چه نقشی دارند.
- با ماژول
networkرادیوی WiFi برد را روشن کنی، شبکههای اطراف را اسکن کنی و بگویی چرا ESP32 شبکههای 5GHz را نمیبیند. - برد را در حالت Station به شبکهٔ خانه وصل کنی، با یک حلقهٔ شمارندهدار منتظر اتصال بمانی و IP برد را چاپ کنی.
- با کارآگاه اتصال، علت وصلنشدن (پسورد غلط، اسم غلط) را تشخیص بدهی و یک چراغ وضعیت شبکه بسازی.
قبل از شروع: چکلیست پیشنیاز#
قبل از ادامه اینها را چک کن — اگر یکیشان لنگ میزند، اول برگرد همان فصل:
- از ترم ۱، فصل ۵:
machine.Pinو خروجی دیجیتال وtime.sleep— برای چراغ اتصال آخر فصل. - از ترم ۱، فصل ۶: متغیر و رشته و f-string — اسم و پسورد شبکه را در متغیر میگذاریم.
- از ترم ۱، فصل ۸ و ۹:
if/elif/elseوnotوand— قلب حلقهٔ انتظار و کارآگاه اتصال. - از ترم ۲، فصل ۱: تعریف تابع با
defو پارامتر — تابعexplain_statusرا میسازیم. - از ترم ۳، فصل ۸: حلقهٔ
whileشرطی — این بار شرطش «تا وقتی وصل نشدهای» است.
لوازم این فصل:
| قطعه / ابزار | تعداد | جایگزین |
|---|---|---|
| برد ESP32 + Breadboard + کابل USB | ۱ | همان کیت ترم ۱ |
| LED قرمز + مقاومت 220 اهم | ۱ | هر رنگ LED از کیت |
| سیم جامپر | ۲ | — |
| شبکهٔ WiFi خانگی 2.4GHz + پسوردش | ۱ | هاتاسپات گوشی (معمولاً 2.4GHz پخش میکند) |
| کامپیوتر با Thonny | ۱ | مسیر شبیهساز آخر همین فصل |
قطعهٔ جدید این ترم: هیچ! همهچیز از جعبهٔ ترمهای قبل بیرون میآید — تنها چیز تازه، یک شبکهٔ WiFi است.
۱. رادیویی که سه سال خواب بود#
چرا این رادیو را زودتر روشن نکردیم؟ چون شبکه دنیای خودش را دارد؛ تا وقتی متغیر و حلقه و تابع و سنسور دستت روان نشده بود، این رادیو فقط اسباب سردرگمی بود. حالا هر سه ترم پشتِ توست و وقتش رسیده.

ولی قبل از یک خط کد، باید سه کلمه را با یک تصویر ساده در ذهنت حک کنیم؛ چون بقیهٔ ترم، هر روز با این سه کلمه سروکار داری. خانهتان را مثل یک محله تصور کن (همان نقشهٔ بالای فصل). وسط محله یک اداره پست هست — همان جعبهای که بهش میگویی مودم یا روتر؛ همان که چراغهایش چشمک میزند و وقتی اینترنت قطع میشود همه سراغش میروند. هر دستگاهی که به WiFi وصل است — گوشی، لپتاپ، تلویزیون — یک خانه در این محله است، و هر خانه یک پلاک دارد. این پلاک همان IP است: چهار عدد که با نقطه جدا شدهاند، چیزی شبیه 192.168.1.7.
حالا ببین وقتی با گوشی یک ویدیو باز میکنی چه میشود: گوشی یک پاکت نامه مینویسد — «این ویدیو را میخواهم» — و میدهد به اداره پستِ محله، یعنی روتر. روتر نامه را به اینترنت میفرستد، که چیزی نیست جز شبکهٔ جهانیِ همین اداره پستها که به هم وصلاند. جواب برمیگردد به روترِ محلهٔ تو، روتر پلاک گیرنده را نگاه میکند و بسته را میاندازد درِ خانهٔ گوشی. هیچ جادویی در کار نیست — فقط نامه و آدرس، میلیونها بار در ثانیه.
دو کلمهٔ آخر: اسم این محله همانی است که در فهرست WiFi گوشی میبینی — مثلاً «Khaneh_Ma»؛ به این اسم میگویند SSID. و پسورد WiFi هم کارت عضویت محله است: بدون آن، اداره پست اصلاً در را برایت باز نمیکند.
یک نکتهٔ مهم: پلاک هر خانه را چه کسی تعیین میکند؟ خودِ روتر. وقتی دستگاه تازهای با کارت عضویت درست وارد محله میشود، روتر از فهرست پلاکهای خالی یکی به او میدهد. برای همین ما هیچوقت خودمان IP انتخاب نمیکنیم — فقط مؤدبانه در میزنیم و روتر پلاک میدهد. حتی ممکن است فردا پلاک دیگری بدهد؛ این طبیعی است و بعداً به کارمان میآید.
💡 نکته: سه کلمهٔ محله را همین حالا در ذهنت قفل کن: روتر اداره پست، IP پلاک خانه، SSID اسم محله، پسورد کارت عضویت. تا آخر این ترم، هر روز به این چهارتا برمیگردیم.
چالش: اگر دو خانه پلاک یکسان بگیرند چه میشود؟
اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.
۲. رادیو را روشن کن و اطراف را اسکن کن#
اولین کاری که هر تازهواردی میکند چیست؟ نگاه میکند ببیند اصلاً چه محلههایی این اطراف هستند. ابزار ما ماژول network است — و خبر خوب: مثل machine و time همراه خودِ MicroPython روی برد هست و هیچ نصبی نمیخواهد. Thonny را باز کن، برد را وصل کن، و در یک فایل جدید همراه من تایپ کن.
اول یک خرابکاری عمدی — چون این خطا را در این ترم زیاد میبینی. با عجله تایپ کن import netwrok (جای w و r عوض) و Run بزن:
ImportError: no module named 'netwrok'
خط را بلند بخوان: «ماژولی به اسم netwrok پیدا نکردم.» و حق دارد — کلمهٔ network بدجوری انگشتها را گول میزند. درستش کن به import network و دوباره Run بزن؛ سکوت، یعنی همهچیز خوب است. خطا آدرس مشکل است، پس نترس و بخوانش. حالا کد کامل اسکن، فایل src/01_wifi_scan.py:
# Term 4 - Session 01 - scan: che shabake-hayi in atraf hastand?
import network
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print("dar hale scan...")
nets = wlan.scan()
print(f"{len(nets)} shabake peyda shod:")
for net in nets:
print(net)
خطبهخط: network.WLAN(...) رادیوی WiFi برد را به ما میدهد و در متغیر wlan میگذاریم. آن network.STA_IF یعنی حالت Station: برد میخواهد مثل گوشی «عضو» شبکهٔ دیگران شود، نه اینکه خودش شبکه راه بیندازد. wlan.active(True) رادیوی خوابیده را روشن میکند — سه ترم منتظر همین خط بود. و wlan.scan() چند ثانیه گوش میدهد و لیستِ همهٔ شبکههای اطراف را برمیگرداند — یک لیست واقعی، از همانها که ترم ۲ یاد گرفتی؛ برای همین با for میشود رویش چرخید. Run بزن:
dar hale scan...
7 shabake peyda shod:
(b'Khaneh_Ma', b'\xa4\x91\xb1\x99\xf2\xc8', 6, -52, 3, False)
(b'Hamsayeh_2', b'\x8c\x59\xc3\x11\x02\x7f', 11, -78, 3, False)
...
چه شلوغ! هر خط یک شبکه است. آن b'Khaneh_Ma' اولِ هر خط، اسم شبکه (همان SSID) است؛ حرف b یعنی متن به شکل خام و بایتبهبایت ذخیره شده — فعلاً فقط بدان اسم داخل همان است. آن عدد منفیِ وسط هم قدرت آنتن است: هر چه به صفر نزدیکتر، سیگنال قویتر.
حالا یک ماجرای مهم. شاید اسکن کردی و شبکهٔ خانهتان در لیست نبود، در حالی که گوشیات همین الان به آن وصل است. نترس، برد خراب نیست. WiFi روی دو باند رادیویی کار میکند: 2.4GHz و 5GHz، و رادیوی ESP32 فقط باند 2.4 را میگیرد.

مثل یک رادیوی جیبی که فقط موج FM دارد: ایستگاه AM هر چقدر هم قوی و نزدیک باشد، برای او اصلاً وجود ندارد. بیشتر روترها هر دو باند را همزمان پخش میکنند و مشکلی نیست؛ ولی اگر شبکهٔ شما فقط 5GHz باشد، باید در تنظیمات روتر باند 2.4 را روشن کنی (کمک والدین!) یا سادهتر: هاتاسپات گوشی را روشن کن که معمولاً 2.4 پخش میکند. با اسکن همیشه میتوانی بفهمی برد چه میبیند — این اولین ابزار عیبیابی توست.
🔧 اگر کار نکرد: اگر
import netwrokخطا داد، اسم ماژول را حرفبهحرف چک کن — network، نه netwrok. اگر اسکن اجرا شد ولی شبکهٔ خانه در لیست نبود، اول حدس بزن شبکهات 5GHz است یا برد خیلی دور از روتر است؛ برد را نزدیکتر ببر یا هاتاسپات گوشی را تست کن.
چالش: شبکه در گوشی هست ولی در scan نیست — اولین حدس؟
اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.
۳. در بزن: اتصال و گرفتن پلاک#
رسیدیم به لحظهٔ اصلی. فایل جدید. اول اسم شبکه و پسورد را در دو متغیر میگذاریم:
SSID = "NAME_SHABAKE_TO" # esm-e shabake - daghigh, ba hamin horoof-e bozorg/kuchak
PASSWORD = "PASSWORD_SHABAKE" # password-e WiFi khane
بهجای این دو، اسم و پسورد شبکهٔ خودت را بنویس — دقیق: حروف بزرگ و کوچک فرق دارند، و اگر اسم شبکه فاصله یا علامت عجیب دارد باید عیناً همان را بنویسی. SSID و PASSWORD فقط دو اسمِ متغیرند که ما انتخاب کردهایم؛ در همهٔ کدهای این فصل همین دو اسم را میبینی.
⚠️ مواظب باش: بله، پسورد را مستقیم توی کد نوشتیم. فعلاً اشکال بزرگی ندارد چون این فایل فقط روی برد خودت است — ولی دو قانون از همین امروز: این فایل را برای هیچکس نفرست، و هیچوقت جایی عمومی نگذارش. در فصلهای بعد راه امنترش را یاد میگیری: پسورد در یک فایل جدا. فعلاً همینطور بنویس.
حالا خودِ اتصال. کد کامل، فایل src/02_wifi_connect.py:
# Term 4 - Session 01 - etesal be WiFi va gereftan-e IP
# SSID/PASSWORD felan mostaghim tooye code - jalase 6 rah-e amntar (file-e joda) ra yad migirim
import network
import time
SSID = "NAME_SHABAKE_TO" # esm-e shabake - daghigh, ba hamin horoof-e bozorg/kuchak
PASSWORD = "PASSWORD_SHABAKE" # password-e WiFi khane
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print(f"dar hale etesal be {SSID} ...")
wlan.connect(SSID, PASSWORD)
tries = 0
while not wlan.isconnected() and tries < 15:
print(f"sabr kon... ({tries})")
time.sleep(1)
tries = tries + 1
if wlan.isconnected():
config = wlan.ifconfig()
print("vasl shod!")
print(f"IP-e bord: {config[0]}")
else:
print(f"vasl nashod! code-e vaziat: {wlan.status()}")
مهمترین بخش آن حلقهٔ وسط است؛ بیا کالبدشکافیاش کنیم. wlan.connect(...) فوری تمام میشود، ولی خودِ اتصال چند ثانیه طول میکشد — مثل اینکه فرم عضویت را تحویل اداره پست دادهای و باید منتظر بمانی مهرش بزنند. از کجا بفهمیم کار تمام شد؟ wlan.isconnected() — سؤالی که جوابش True یا False است. پس حلقهٔ while شرطیِ ترم ۳ به کار میآید: «تا وقتی وصل نشدهای، صبر کن.»
ولی دقت کن شرط دو تکه دارد که با and به هم چسبیدهاند:
while not wlan.isconnected() and tries < 15:
چرا tries < 15؟ چون اگر پسورد غلط باشد، اتصال هیچوقت برقرار نمیشود و حلقهای که فقط شرط اول را داشت تا ابد «sabr kon» چاپ میکرد. شمارندهٔ tries مثل تایمر است: هر دور یک ثانیه، حداکثر ۱۵ دور. برنامهنویس خوب همیشه برای انتظارش سقف میگذارد — اسم این کار timeout است و از امروز جزو کلماتِ توست. Run بزن:
dar hale etesal be Khaneh_Ma ...
sabr kon... (0)
sabr kon... (1)
sabr kon... (2)
vasl shod!
IP-e bord: 192.168.1.42
وصل شد! و آن خط آخر را قاب کن: بردِ تو الان پلاک دارد. آن wlan.ifconfig() یک بستهٔ چهارتایی از تنظیمات شبکه میدهد — مثل لیست است و خانهٔ شماره صفرش IP خودِ برد است؛ بقیهاش مال دنیای مدیرهای شبکه است و ما در کل دوره فقط همین خانهٔ صفر را لازم داریم. عددِ تو حتماً با من فرق دارد و کاملاً درست است — پلاکِ محلهٔ شماست.
✅ چک کن: گوشیات را بردار، تنظیمات WiFi را باز کن و IP خودِ گوشی را پیدا کن. سه عدد اولش با IP برد یکی است؟ اگر بله، گوشیِ تو و ESP32 الان هممحلهایاند — برای اولین بار در این دوره، دو دستگاهِ دنیای تو در یک شبکهاند.
🔧 اگر کار نکرد: همیشه
sabr konمیبینی و آخرشvasl nashod؟ سه مظنون همیشگی: یک، پسورد را حرفبهحرف چک کن (حروف بزرگ/کوچک و عدد جاافتاده). دو، اسم شبکه غلط است یا اولش/آخرش یک فاصلهٔ پنهان تایپ شده — اسم را از خروجیِscan()کپی کن. سه، از روتر خیلی دوری؛ برد را نزدیکتر ببر یا با هاتاسپات گوشیِ کنارِ برد تست کن. و اگر اسم متد راconect(با یک n) نوشتی،AttributeErrorمیگیری — connect دو تا n دارد.
چالش: چرا شرط حلقهٔ انتظار دو تکه است؟
اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.
۴. کارآگاه اتصال: وقتی وصل نمیشود#
همهچیز قشنگ کار کرد — پس طبق عادت همیشگیمان، بیا عمداً خرابش کنیم تا روزی که واقعاً خراب شد دستپاچه نشوی. پسورد را عمداً غلط کن و اجرا کن؛ پانزده ثانیه صبر میکند و بعد:
vasl nashod! code-e vaziat: 202
این عدد چیست؟ wlan.status() وضعیت رادیو را به شکل یک کدِ عددی میدهد. خودِ عدد را حفظ نکن — ممکن است روی نسخههای مختلف فرق کند. چیزی که باید بلد باشی این است: ماژول network برای هر کد یک اسم آماده دارد، مثل network.STAT_WRONG_PASSWORD. پس میتوانیم یک کارآگاه بنویسیم؛ تابعی که کد را میگیرد و به زبان آدمیزاد میگوید مشکل چیست. کد کامل، فایل src/03_wifi_detective.py:
# Term 4 - Session 01 - karagah-e etesal: tarjome-ye status code ha
import network
import time
SSID = "NAME_SHABAKE_TO"
PASSWORD = "in password amdan ghalat ast"
def explain_status(code):
# code-e adadi ra be zaban-e adamizad tarjome mikonad
if code == network.STAT_GOT_IP:
print("vasl shod va IP gereft!")
elif code == network.STAT_WRONG_PASSWORD:
print("password ghalat ast!")
elif code == network.STAT_NO_AP_FOUND:
print("shabake-i ba in esm dide nashod (esm ghalat? 5GHz?)")
elif code == network.STAT_CONNECTING:
print("hanooz dar hale talash...")
else:
print(f"vaziat: {code} (jadval-e jozve ra bebin)")
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
wlan.connect(SSID, PASSWORD)
tries = 0
while not wlan.isconnected() and tries < 15:
time.sleep(1)
explain_status(wlan.status())
tries = tries + 1
ساختارش را کامل بلدی: def از ترم ۲، زنجیرهٔ if/elif/else از ترم ۱. فقط بهجای عددِ جادویی، از اسمهای آمادهٔ ماژول استفاده کردیم — هم کد خواناتر شد، هم اگر روزی اعداد عوض شوند برنامهٔ ما درست میماند. دقت کن اینجا پسورد را عمداً غلط گذاشتهایم (in password amdan ghalat ast) تا کارآگاه را تست کنیم. اجرا کن و ببین:
hanooz dar hale talash...
hanooz dar hale talash...
password ghalat ast!
دیگر هیچوقت پشتِ دیوارِ «وصل نمیشود، نمیدانم چرا» گیر نمیکنی — کارآگاهت میگوید مشکل از کجاست. دو مظنون اصلی را از هم بشناس: اگر گفت password ghalat ast، پسورد را حرفبهحرف چک کن؛ اگر گفت shabake-i ba in esm dide nashod، یا اسم را غلط نوشتهای — مواظب فاصلههای پنهانِ اول و آخر باش — یا شبکهات 5GHz است و برد اصلاً نمیبیندش.
✅ چک کن: یک بار با پسورد درست و یک بار با پسورد غلط اجرا کن. با پسورد درست باید آخرش پیام «وصل شد» را ببینی، و با پسورد غلط پیام «password ghalat ast» را.
چالش: اسم شبکه با یک فاصلهٔ اضافه — کدام پیام؟
اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.
۵. چراغ اتصال: وضعیت شبکه بدون کامپیوتر#
یک مشکل کوچک مانده: همهٔ این پیامها در Shell است. اگر فردا برد را با پاور بانک گوشهٔ اتاق گذاشتی، از کجا بفهمی وصل شده؟ جوابِ همیشگی ما: سختافزار! به روتر خانه نگاه کن — چراغهایش دقیقاً برای همین است. ما هم برای بردمان یک چراغ وضعیت میسازیم: همان LED قرمز ترم ۱ با مقاومت 220 اهم روی پایهٔ GPIO 25.
⚠️ مواظب باش: قانون ایمنی ترم ۱ — وقتی سیم جابهجا میکنی، برق قطع. قبل از بستن مدارِ LED، کابل USB را از برد جدا کن.
مدار همان چشمکزنِ ترم ۱ است. قرارداد چراغ ما سه حالته است: چشمکِ آرام یعنی «در حال تلاش»، روشنِ ثابت یعنی «وصل»، خاموش یعنی «نشد». کافی است داخل حلقهٔ انتظار LED را روشن-خاموش کنیم و بعد از حلقه، بسته به نتیجه، ثابتش کنیم. کد کامل، فایل src/04_wifi_led_indicator.py:
# Term 4 - Session 01 - cheragh-e etesal: cheshmak yani talash, sabet yani vasl
from machine import Pin
import network
import time
SSID = "NAME_SHABAKE_TO"
PASSWORD = "PASSWORD_SHABAKE"
led = Pin(25, Pin.OUT) # haman LED-e ghermez-e term 1
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
print(f"dar hale etesal be {SSID} ...")
wlan.connect(SSID, PASSWORD)
tries = 0
while not wlan.isconnected() and tries < 15:
led.value(1) # cheshmak-e aram: dar hale talash
time.sleep(0.2)
led.value(0)
time.sleep(0.8)
tries = tries + 1
if wlan.isconnected():
led.value(1) # roshan-e sabet = vasl!
print("vasl shod!")
print(f"IP-e bord: {wlan.ifconfig()[0]}")
else:
led.value(0) # khamush = nashod - karagah ra ejra kon
print(f"vasl nashod. code-e vaziat: {wlan.status()}")
Run بزن و به LED نگاه کن.
✅ چک کن: LED باید چند بار آرام چشمک بزند (در حال تلاش) و بعد ثابت روشن بماند (وصل شد). از امروز بردت مثل یک دستگاه واقعی حرف میزند: نگاهش کنی میفهمی حالش چطور است. این الگوی «چراغ وضعیت» را در همهٔ دستگاههای دوروبرت میبینی — روتر، پرینتر، کنسول بازی — و حالا خودت یکی ساختهای.
🔧 اگر کار نکرد: LED اصلاً روشن نمیشود؟ جهت LED را چک کن (پایهٔ بلند سمت مقاومت، پایهٔ کوتاه سمت GND) و مطمئن شو سیم، مقاومت و LED همردیف Breadboardاند. LED چشمک میزند ولی هیچوقت ثابت نمیشود؟ یعنی اتصال برقرار نشده — برگرد سراغ کارآگاه بخش ۴ تا بفهمی مشکل پسورد است یا اسم شبکه.
قطعه نداری؟ مسیر شبیهساز#
کدهای این فصل به یک شبکهٔ WiFi واقعی نیاز دارند و شبیهساز مرورگرِ ما شبکه را اجرا نمیکند. ولی هیچچیز را از دست نمیدهی: هر چهار کد را در آزمایشگاه ببین و کپی کن تا تایپنکرده جلو بروی، و مدارِ چراغ اتصال (LED قرمز + مقاومت 220 اهم روی GPIO 25، همان چشمکزن ترم ۱) را همانجا بساز. برای اجرای واقعیِ اتصال، به یک برد و شبکهٔ خانه (یا هاتاسپات گوشی) نیاز داری.
واژههای تازه این فصل#
| کلمه | تلفظ به حروف فارسی | یعنی چه |
|---|---|---|
| Network | نتوُرک | شبکه؛ گروهی از دستگاهها که با هم حرف میزنند |
| Router | روتِر | اداره پستِ محله؛ جعبهای که همهٔ نامههای شبکه از آن رد میشود |
| IP Address | آیپی اَدرِس | پلاکِ هر دستگاه در شبکه — چهار عدد با نقطه |
| SSID | اِساِسآیدی | اسم شبکهٔ WiFi — همان که در فهرست گوشی میبینی |
| Station | استِیشِن | حالتِ «عضو شبکه» — برد مثل گوشی به شبکهٔ دیگران وصل میشود |
| Scan | اِسکَن | گشتن دنبال شبکههای اطراف |
| Timeout | تایماوت | سقفِ انتظار؛ «بیشتر از این صبر نکن» |
| Status | استَتِس | وضعیت؛ گزارش اینکه کار به کجا رسیده |
تمرینها
اول خودت فکر کن یا امتحان کن — بعد اینجا را باز کن.
در فصل بعد#
بردت فقط عضو محله شد — هنوز حتی یک نامه هم از اینترنت نگرفته. فصل بعد این را عوض میکنیم: از یک سرویس اینترنتی ساعتِ دقیقِ جهانی را میگیریم و روی OLED یک ساعت اینترنتی میسازیم که هیچوقت خواب نمیماند — و سر راه یاد میگیری وقتی دو کامپیوتر با هم حرف میزنند دقیقاً چه میگویند.
به آخر این فصل رسیدی!
اگر ساختی و جواب داد، این دکمه مال توست.