[{"data":1,"prerenderedAt":255},["ShallowReactive",2],{"lesson:t4-s01-wifi-basics":3,"course:airo":76},{"meta":4,"prev":11,"next":17,"sections":21},{"free_preview":5,"order":6,"slug":7,"source":8,"term":9,"title_fa":10},true,1,"t4-s01-wifi-basics","book",4,"فصل ۱ — شبکه به زبان آدمیزاد و اتصال به WiFi",{"free_preview":12,"order":13,"slug":14,"source":8,"term":15,"title_fa":16},false,11,"t3-s11-term-project-run",3,"فصل ۱۱ — پروژه ترم: اجرای ماموریت و نمایش",{"free_preview":12,"order":18,"slug":19,"source":8,"term":9,"title_fa":20},2,"t4-s02-http-requests","فصل ۲ — گرفتن داده از اینترنت",[22,26,29,34,37,41,44,47,50,53,56,59,62,65,67,70,73],{"kind":23,"heading":24,"html":25},"normal","در این فصل چه می‌سازی","\u003Ch2 id=\"در-این-فصل-چه-می‌سازی\">در این فصل چه می‌سازی\u003Ca class=\"head-anchor\" href=\"#%D8%AF%D8%B1-%D8%A7%DB%8C%D9%86-%D9%81%D8%B5%D9%84-%DA%86%D9%87-%D9%85%DB%8C%E2%80%8C%D8%B3%D8%A7%D8%B2%DB%8C\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>سه ترم است دستگاه‌های باهوشی می‌سازی: چراغ راهنمایی، ایستگاه هواشناسی، رباتی که مانع را دور می‌زند. همه‌شان کار می‌کنند — ولی همه‌شان یک مشکل مشترک دارند: \u003Cstrong>تنها\u003C\u002Fstrong> هستند. ایستگاه هواشناسی‌ات دمای اتاق را می‌داند، ولی نمی‌تواند به گوشیِ تو خبر بدهد. هر کدام فقط همان چند سانتی‌متر اطراف خودش را می‌شناسد.\u003C\u002Fp>\n\u003Cp>در این فصل این دیوار را برمی‌داری. یک راز را می‌گویم: همین برد ESP32 که این‌همه وقت می‌شناسی، از روز اول یک \u003Cstrong>رادیوی WiFi\u003C\u002Fstrong> کامل داخل خودش داشت — درست زیر همان قاب فلزی که رویش نوشته ESP32-WROOM. امروز این رادیو را بیدار می‌کنی، بردت را عضو رسمی شبکهٔ خانه می‌کنی، از روتر «پلاک» می‌گیری، و آخر فصل یک \u003Cstrong>چراغ اتصال\u003C\u002Fstrong> می‌سازی که بدون کامپیوتر هم بگوید بردت وصل است یا نه. این همان اتفاقی است که در شبکه می‌افتد — بردت یک همسایهٔ تازه با پلاک خودش می‌شود:\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F02-image-home-network-post-office.10de66d38a.160.webp 160w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.320.webp 320w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.640.webp 640w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F02-image-home-network-post-office.10de66d38a.1280.jpg\" srcset=\"\u002F_img\u002F02-image-home-network-post-office.10de66d38a.160.jpg 160w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.320.jpg 320w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.640.jpg 640w, \u002F_img\u002F02-image-home-network-post-office.10de66d38a.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"نقشهٔ یک محله به‌عنوان مدل شبکهٔ خانگی: وسطش یک اداره پست با آنتن WiFi که رویش نوشته Router، دور تا دورش چند خانه با پلاک عددی مثل 192.168.1.7، و خانهٔ برد ESP32 با پلاک 192.168.1.42 که با نور گرم به‌عنوان تازه‌واردِ محله برجسته شده؛ یک جاده هم از محله به‌سمت کرهٔ زمین با برچسب Internet می‌رود\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>آخر این فصل می‌توانی:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>با مدل «روتر = اداره پست، IP = پلاک خانه» توضیح بدهی شبکهٔ خانه چطور کار می‌کند و SSID و پسورد چه نقشی دارند.\u003C\u002Fli>\n\u003Cli>با ماژول \u003Ccode>network\u003C\u002Fcode> رادیوی WiFi برد را روشن کنی، شبکه‌های اطراف را اسکن کنی و بگویی چرا ESP32 شبکه‌های 5GHz را نمی‌بیند.\u003C\u002Fli>\n\u003Cli>برد را در حالت Station به شبکهٔ خانه وصل کنی، با یک حلقهٔ شمارنده‌دار منتظر اتصال بمانی و IP برد را چاپ کنی.\u003C\u002Fli>\n\u003Cli>با کارآگاه اتصال، علت وصل‌نشدن (پسورد غلط، اسم غلط) را تشخیص بدهی و یک چراغ وضعیت شبکه بسازی.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"kind":23,"heading":27,"html":28},"قبل از شروع: چک‌لیست پیش‌نیاز","\u003Ch2 id=\"قبل-از-شروع-چک‌لیست-پیش‌نیاز\">قبل از شروع: چک‌لیست پیش‌نیاز\u003Ca class=\"head-anchor\" href=\"#%D9%82%D8%A8%D9%84-%D8%A7%D8%B2-%D8%B4%D8%B1%D9%88%D8%B9-%DA%86%DA%A9%E2%80%8C%D9%84%DB%8C%D8%B3%D8%AA-%D9%BE%DB%8C%D8%B4%E2%80%8C%D9%86%DB%8C%D8%A7%D8%B2\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>قبل از ادامه این‌ها را چک کن — اگر یکی‌شان لنگ می‌زند، اول برگرد همان فصل:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۵:\u003C\u002Fstrong> \u003Ccode>machine.Pin\u003C\u002Fcode> و خروجی دیجیتال و \u003Ccode>time.sleep\u003C\u002Fcode> — برای چراغ اتصال آخر فصل.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۶:\u003C\u002Fstrong> متغیر و رشته و f-string — اسم و پسورد شبکه را در متغیر می‌گذاریم.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۸ و ۹:\u003C\u002Fstrong> \u003Ccode>if\u002Felif\u002Felse\u003C\u002Fcode> و \u003Ccode>not\u003C\u002Fcode> و \u003Ccode>and\u003C\u002Fcode> — قلب حلقهٔ انتظار و کارآگاه اتصال.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۲، فصل ۱:\u003C\u002Fstrong> تعریف تابع با \u003Ccode>def\u003C\u002Fcode> و پارامتر — تابع \u003Ccode>explain_status\u003C\u002Fcode> را می‌سازیم.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۳، فصل ۸:\u003C\u002Fstrong> حلقهٔ \u003Ccode>while\u003C\u002Fcode> شرطی — این بار شرطش «تا وقتی وصل نشده‌ای» است.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>لوازم این فصل:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>قطعه \u002F ابزار\u003C\u002Fth>\n\u003Cth>تعداد\u003C\u002Fth>\n\u003Cth>جایگزین\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>برد ESP32 + Breadboard + کابل USB\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>همان کیت ترم ۱\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LED قرمز + مقاومت 220 اهم\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>هر رنگ LED از کیت\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>سیم جامپر\u003C\u002Ftd>\n\u003Ctd>۲\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>شبکهٔ WiFi خانگی 2.4GHz + پسوردش\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>هات‌اسپات گوشی (معمولاً 2.4GHz پخش می‌کند)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>کامپیوتر با Thonny\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>مسیر شبیه‌ساز آخر همین فصل\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>قطعهٔ جدید این ترم: هیچ! همه‌چیز از جعبهٔ ترم‌های قبل بیرون می‌آید — تنها چیز تازه، یک شبکهٔ WiFi است.\u003C\u002Fp>\n",{"kind":30,"heading":31,"html":32,"embed":33},"lab","","کدهای این فصل شبکه لازم دارند و شبیه‌ساز مرورگرِ ما شبکه را اجرا نمی‌کند — ولی می‌توانی همان کدها را آنجا ببینی و کپی کنی تا تایپ‌نکرده جلو بروی، و مدارِ چراغ اتصال (LED روی پایهٔ ۲۵) را همان‌جا بسازی.","\u002Flab",{"kind":23,"heading":35,"html":36},"۱. رادیویی که سه سال خواب بود","\u003Ch2 id=\"۱-رادیویی-که-سه-سال-خواب-بود\">۱. رادیویی که سه سال خواب بود\u003Ca class=\"head-anchor\" href=\"#%DB%B1-%D8%B1%D8%A7%D8%AF%DB%8C%D9%88%DB%8C%DB%8C-%DA%A9%D9%87-%D8%B3%D9%87-%D8%B3%D8%A7%D9%84-%D8%AE%D9%88%D8%A7%D8%A8-%D8%A8%D9%88%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>چرا این رادیو را زودتر روشن نکردیم؟ چون شبکه دنیای خودش را دارد؛ تا وقتی متغیر و حلقه و تابع و سنسور دستت روان نشده بود، این رادیو فقط اسباب سردرگمی بود. حالا هر سه ترم پشتِ توست و وقتش رسیده.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.160.webp 160w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.320.webp 320w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.640.webp 640w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.1280.jpg\" srcset=\"\u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.160.jpg 160w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.320.jpg 320w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.640.jpg 640w, \u002F_img\u002F01-image-esp32-hidden-radio.a3909bc178.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"برشی نمایشی از برد ESP32: قاب فلزی ماژول ESP32-WROOM مثل درِ صندوق گنج بالا رفته و داخلش یک فرستندهٔ رادیوییِ ریزِ درخشان با موج‌های آبیِ کم‌رنگ که تازه شروع به پخش‌شدن کرده‌اند، با فلش و برچسب WiFi radio\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>ولی قبل از یک خط کد، باید سه کلمه را با یک تصویر ساده در ذهنت حک کنیم؛ چون بقیهٔ ترم، هر روز با این سه کلمه سروکار داری. خانه‌تان را مثل یک \u003Cstrong>محله\u003C\u002Fstrong> تصور کن (همان نقشهٔ بالای فصل). وسط محله یک \u003Cstrong>اداره پست\u003C\u002Fstrong> هست — همان جعبه‌ای که بهش می‌گویی مودم یا \u003Cstrong>روتر\u003C\u002Fstrong>؛ همان که چراغ‌هایش چشمک می‌زند و وقتی اینترنت قطع می‌شود همه سراغش می‌روند. هر دستگاهی که به WiFi وصل است — گوشی، لپ‌تاپ، تلویزیون — یک \u003Cstrong>خانه\u003C\u002Fstrong> در این محله است، و هر خانه یک \u003Cstrong>پلاک\u003C\u002Fstrong> دارد. این پلاک همان \u003Cstrong>IP\u003C\u002Fstrong> است: چهار عدد که با نقطه جدا شده‌اند، چیزی شبیه 192.168.1.7.\u003C\u002Fp>\n\u003Cp>حالا ببین وقتی با گوشی یک ویدیو باز می‌کنی چه می‌شود: گوشی یک پاکت نامه می‌نویسد — «این ویدیو را می‌خواهم» — و می‌دهد به اداره پستِ محله، یعنی روتر. روتر نامه را به \u003Cstrong>اینترنت\u003C\u002Fstrong> می‌فرستد، که چیزی نیست جز شبکهٔ جهانیِ همین اداره پست‌ها که به هم وصل‌اند. جواب برمی‌گردد به روترِ محلهٔ تو، روتر پلاک گیرنده را نگاه می‌کند و بسته را می‌اندازد درِ خانهٔ گوشی. هیچ جادویی در کار نیست — فقط نامه و آدرس، میلیون‌ها بار در ثانیه.\u003C\u002Fp>\n\u003Cp>دو کلمهٔ آخر: اسم این محله همانی است که در فهرست WiFi گوشی می‌بینی — مثلاً «Khaneh_Ma»؛ به این اسم می‌گویند \u003Cstrong>SSID\u003C\u002Fstrong>. و پسورد WiFi هم \u003Cstrong>کارت عضویت\u003C\u002Fstrong> محله است: بدون آن، اداره پست اصلاً در را برایت باز نمی‌کند.\u003C\u002Fp>\n\u003Cp>یک نکتهٔ مهم: پلاک هر خانه را چه کسی تعیین می‌کند؟ خودِ روتر. وقتی دستگاه تازه‌ای با کارت عضویت درست وارد محله می‌شود، روتر از فهرست پلاک‌های خالی یکی به او می‌دهد. برای همین ما هیچ‌وقت خودمان IP انتخاب نمی‌کنیم — فقط مؤدبانه در می‌زنیم و روتر پلاک می‌دهد. حتی ممکن است فردا پلاک دیگری بدهد؛ این طبیعی است و بعداً به کارمان می‌آید.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>💡 \u003Cstrong>نکته:\u003C\u002Fstrong> سه کلمهٔ محله را همین حالا در ذهنت قفل کن: \u003Cstrong>روتر\u003C\u002Fstrong> اداره پست، \u003Cstrong>IP\u003C\u002Fstrong> پلاک خانه، \u003Cstrong>SSID\u003C\u002Fstrong> اسم محله، \u003Cstrong>پسورد\u003C\u002Fstrong> کارت عضویت. تا آخر این ترم، هر روز به این چهارتا برمی‌گردیم.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":38,"heading":39,"html":40},"checkpoint","چالش: اگر دو خانه پلاک یکسان بگیرند چه می‌شود؟","\u003Ch2 id=\"چالش-اگر-دو-خانه-پلاک-یکسان-بگیرند-چه-می‌شود\">چالش: اگر دو خانه پلاک یکسان بگیرند چه می‌شود؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D8%A7%DA%AF%D8%B1-%D8%AF%D9%88-%D8%AE%D8%A7%D9%86%D9%87-%D9%BE%D9%84%D8%A7%DA%A9-%DB%8C%DA%A9%D8%B3%D8%A7%D9%86-%D8%A8%DA%AF%DB%8C%D8%B1%D9%86%D8%AF-%DA%86%D9%87-%D9%85%DB%8C%E2%80%8C%D8%B4%D9%88%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>قبل از باز کردن جواب، خودت بگو: اگر روتر اشتباه کند و به دو دستگاه پلاک یکسان بدهد، موقع رساندن جواب‌ها چه فاجعه‌ای پیش می‌آید؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> روتر گیج می‌شود که نامه را به کدام خانه بیندازد — دقیقاً مثل دو خانه با یک پلاک در یک کوچه. جوابِ گوشی ممکن است برود درِ تلویزیون و برعکس. برای همین هر پلاک در یک محله باید \u003Cstrong>یکتا\u003C\u002Fstrong> باشد، و روتر خودش این را تضمین می‌کند: به هر تازه‌وارد یک پلاکِ خالی می‌دهد.\u003C\u002Fp>\n",{"kind":23,"heading":42,"html":43},"۲. رادیو را روشن کن و اطراف را اسکن کن","\u003Ch2 id=\"۲-رادیو-را-روشن-کن-و-اطراف-را-اسکن-کن\">۲. رادیو را روشن کن و اطراف را اسکن کن\u003Ca class=\"head-anchor\" href=\"#%DB%B2-%D8%B1%D8%A7%D8%AF%DB%8C%D9%88-%D8%B1%D8%A7-%D8%B1%D9%88%D8%B4%D9%86-%DA%A9%D9%86-%D9%88-%D8%A7%D8%B7%D8%B1%D8%A7%D9%81-%D8%B1%D8%A7-%D8%A7%D8%B3%DA%A9%D9%86-%DA%A9%D9%86\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اولین کاری که هر تازه‌واردی می‌کند چیست؟ نگاه می‌کند ببیند اصلاً چه محله‌هایی این اطراف هستند. ابزار ما ماژول \u003Ccode>network\u003C\u002Fcode> است — و خبر خوب: مثل \u003Ccode>machine\u003C\u002Fcode> و \u003Ccode>time\u003C\u002Fcode> همراه خودِ MicroPython روی برد هست و هیچ نصبی نمی‌خواهد. Thonny را باز کن، برد را وصل کن، و در یک فایل جدید همراه من تایپ کن.\u003C\u002Fp>\n\u003Cp>اول یک خرابکاری عمدی — چون این خطا را در این ترم زیاد می‌بینی. با عجله تایپ کن \u003Ccode>import netwrok\u003C\u002Fcode> (جای w و r عوض) و Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>ImportError: no module named 'netwrok'\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>خط را بلند بخوان: «ماژولی به اسم netwrok پیدا نکردم.» و حق دارد — کلمهٔ network بدجوری انگشت‌ها را گول می‌زند. درستش کن به \u003Ccode>import network\u003C\u002Fcode> و دوباره Run بزن؛ سکوت، یعنی همه‌چیز خوب است. \u003Cstrong>خطا آدرس مشکل است، پس نترس و بخوانش.\u003C\u002Fstrong> حالا کد کامل اسکن، فایل \u003Ccode>src\u002F01_wifi_scan.py\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 4 - Session 01 - scan: che shabake-hayi in atraf hastand?\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> network\n\nwlan = network.WLAN(network.STA_IF)\nwlan.active(\u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>)\n\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;dar hale scan...&quot;\u003C\u002Fspan>)\nnets = wlan.scan()\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;{len(nets)} shabake peyda shod:&quot;\u003C\u002Fspan>)\n\u003Cspan class=\"tok-kw\">for\u003C\u002Fspan> net \u003Cspan class=\"tok-kw\">in\u003C\u002Fspan> nets:\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(net)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>خط‌به‌خط: \u003Ccode>network.WLAN(...)\u003C\u002Fcode> رادیوی WiFi برد را به ما می‌دهد و در متغیر \u003Ccode>wlan\u003C\u002Fcode> می‌گذاریم. آن \u003Ccode>network.STA_IF\u003C\u002Fcode> یعنی حالت \u003Cstrong>Station\u003C\u002Fstrong>: برد می‌خواهد مثل گوشی «عضو» شبکهٔ دیگران شود، نه اینکه خودش شبکه راه بیندازد. \u003Ccode>wlan.active(True)\u003C\u002Fcode> رادیوی خوابیده را روشن می‌کند — سه ترم منتظر همین خط بود. و \u003Ccode>wlan.scan()\u003C\u002Fcode> چند ثانیه گوش می‌دهد و لیستِ همهٔ شبکه‌های اطراف را برمی‌گرداند — یک لیست واقعی، از همان‌ها که ترم ۲ یاد گرفتی؛ برای همین با \u003Ccode>for\u003C\u002Fcode> می‌شود رویش چرخید. Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>dar hale scan...\n7 shabake peyda shod:\n(b'Khaneh_Ma', b'\\xa4\\x91\\xb1\\x99\\xf2\\xc8', 6, -52, 3, False)\n(b'Hamsayeh_2', b'\\x8c\\x59\\xc3\\x11\\x02\\x7f', 11, -78, 3, False)\n...\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>چه شلوغ! هر خط یک شبکه است. آن \u003Ccode>b'Khaneh_Ma'\u003C\u002Fcode> اولِ هر خط، اسم شبکه (همان SSID) است؛ حرف b یعنی متن به شکل خام و بایت‌به‌بایت ذخیره شده — فعلاً فقط بدان اسم داخل همان است. آن عدد منفیِ وسط هم قدرت آنتن است: هر چه به صفر نزدیک‌تر، سیگنال قوی‌تر.\u003C\u002Fp>\n\u003Cp>حالا یک ماجرای مهم. شاید اسکن کردی و شبکهٔ خانه‌تان در لیست \u003Cstrong>نبود\u003C\u002Fstrong>، در حالی که گوشی‌ات همین الان به آن وصل است. نترس، برد خراب نیست. WiFi روی دو \u003Cstrong>باند\u003C\u002Fstrong> رادیویی کار می‌کند: 2.4GHz و 5GHz، و رادیوی ESP32 فقط باند 2.4 را می‌گیرد.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.160.webp 160w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.320.webp 320w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.640.webp 640w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.1280.jpg\" srcset=\"\u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.160.jpg 160w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.320.jpg 320w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.640.jpg 640w, \u002F_img\u002F04-image-24-vs-5ghz.1c03c18b0e.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"نمودار دو باند WiFi: یک روتر وسط که دو موج پخش می‌کند، یک موج نارنجیِ پهن با برچسب 2.4 GHz و یک موج بنفشِ فشرده با برچسب 5 GHz؛ سمت راست برد ESP32 که فقط موج نارنجی به آن می‌رسد و یک تیک سبز visible روشن می‌شود، در حالی که موج بنفش قبل از رسیدن محو می‌شود با علامت invisible\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>مثل یک رادیوی جیبی که فقط موج FM دارد: ایستگاه AM هر چقدر هم قوی و نزدیک باشد، برای او اصلاً \u003Cstrong>وجود ندارد\u003C\u002Fstrong>. بیشتر روترها هر دو باند را همزمان پخش می‌کنند و مشکلی نیست؛ ولی اگر شبکهٔ شما فقط 5GHz باشد، باید در تنظیمات روتر باند 2.4 را روشن کنی (کمک والدین!) یا ساده‌تر: هات‌اسپات گوشی را روشن کن که معمولاً 2.4 پخش می‌کند. با اسکن همیشه می‌توانی بفهمی برد چه می‌بیند — این اولین ابزار عیب‌یابی توست.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> اگر \u003Ccode>import netwrok\u003C\u002Fcode> خطا داد، اسم ماژول را حرف‌به‌حرف چک کن — network، نه netwrok. اگر اسکن اجرا شد ولی شبکهٔ خانه در لیست نبود، اول حدس بزن شبکه‌ات 5GHz است یا برد خیلی دور از روتر است؛ برد را نزدیک‌تر ببر یا هات‌اسپات گوشی را تست کن.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":38,"heading":45,"html":46},"چالش: شبکه در گوشی هست ولی در scan نیست — اولین حدس؟","\u003Ch2 id=\"چالش-شبکه-در-گوشی-هست-ولی-در-scan-نیست-—-اولین-حدس\">چالش: شبکه در گوشی هست ولی در scan نیست — اولین حدس؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D8%B4%D8%A8%DA%A9%D9%87-%D8%AF%D8%B1-%DA%AF%D9%88%D8%B4%DB%8C-%D9%87%D8%B3%D8%AA-%D9%88%D9%84%DB%8C-%D8%AF%D8%B1-scan-%D9%86%DB%8C%D8%B3%D8%AA-%E2%80%94-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%AD%D8%AF%D8%B3\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>شبکهٔ خانه در فهرست WiFi گوشی دیده می‌شود، ولی در خروجی \u003Ccode>scan()\u003C\u002Fcode> برد نیست. اولین حدست چیست؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> به احتمال زیاد شبکهٔ خانه فقط روی باند \u003Cstrong>5GHz\u003C\u002Fstrong> پخش می‌شود، و رادیوی ESP32 اصلاً آن باند را نمی‌شنود. راه‌حل: باند 2.4GHz را در روتر روشن کن، یا با هات‌اسپات گوشی تست کن. (حدس دوم: خیلی دور از روتری و سیگنال ضعیف است.)\u003C\u002Fp>\n",{"kind":23,"heading":48,"html":49},"۳. در بزن: اتصال و گرفتن پلاک","\u003Ch2 id=\"۳-در-بزن-اتصال-و-گرفتن-پلاک\">۳. در بزن: اتصال و گرفتن پلاک\u003Ca class=\"head-anchor\" href=\"#%DB%B3-%D8%AF%D8%B1-%D8%A8%D8%B2%D9%86-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%88-%DA%AF%D8%B1%D9%81%D8%AA%D9%86-%D9%BE%D9%84%D8%A7%DA%A9\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>رسیدیم به لحظهٔ اصلی. فایل جدید. اول اسم شبکه و پسورد را در دو متغیر می‌گذاریم:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>SSID = \u003Cspan class=\"tok-str\">&quot;NAME_SHABAKE_TO&quot;\u003C\u002Fspan>       \u003Cspan class=\"tok-com\"># esm-e shabake - daghigh, ba hamin horoof-e bozorg\u002Fkuchak\u003C\u002Fspan>\nPASSWORD = \u003Cspan class=\"tok-str\">&quot;PASSWORD_SHABAKE&quot;\u003C\u002Fspan>  \u003Cspan class=\"tok-com\"># password-e WiFi khane\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>به‌جای این دو، اسم و پسورد شبکهٔ خودت را بنویس — \u003Cstrong>دقیق\u003C\u002Fstrong>: حروف بزرگ و کوچک فرق دارند، و اگر اسم شبکه فاصله یا علامت عجیب دارد باید عیناً همان را بنویسی. \u003Ccode>SSID\u003C\u002Fcode> و \u003Ccode>PASSWORD\u003C\u002Fcode> فقط دو اسمِ متغیرند که ما انتخاب کرده‌ایم؛ در همهٔ کدهای این فصل همین دو اسم را می‌بینی.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>مواظب باش:\u003C\u002Fstrong> بله، پسورد را مستقیم توی کد نوشتیم. فعلاً اشکال بزرگی ندارد چون این فایل فقط روی برد خودت است — ولی دو قانون از همین امروز: این فایل را برای هیچ‌کس نفرست، و هیچ‌وقت جایی عمومی نگذارش. در فصل‌های بعد راه امن‌ترش را یاد می‌گیری: پسورد در یک فایل جدا. فعلاً همین‌طور بنویس.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>حالا خودِ اتصال. کد کامل، فایل \u003Ccode>src\u002F02_wifi_connect.py\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 4 - Session 01 - etesal be WiFi va gereftan-e IP\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\"># SSID\u002FPASSWORD felan mostaghim tooye code - jalase 6 rah-e amntar (file-e joda) ra yad migirim\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> network\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nSSID = \u003Cspan class=\"tok-str\">&quot;NAME_SHABAKE_TO&quot;\u003C\u002Fspan>       \u003Cspan class=\"tok-com\"># esm-e shabake - daghigh, ba hamin horoof-e bozorg\u002Fkuchak\u003C\u002Fspan>\nPASSWORD = \u003Cspan class=\"tok-str\">&quot;PASSWORD_SHABAKE&quot;\u003C\u002Fspan>  \u003Cspan class=\"tok-com\"># password-e WiFi khane\u003C\u002Fspan>\n\nwlan = network.WLAN(network.STA_IF)\nwlan.active(\u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>)\n\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;dar hale etesal be {SSID} ...&quot;\u003C\u002Fspan>)\nwlan.connect(SSID, PASSWORD)\n\ntries = \u003Cspan class=\"tok-num\">0\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">not\u003C\u002Fspan> wlan.isconnected() \u003Cspan class=\"tok-kw\">and\u003C\u002Fspan> tries &lt; \u003Cspan class=\"tok-num\">15\u003C\u002Fspan>:\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;sabr kon... ({tries})&quot;\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n    tries = tries + \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">if\u003C\u002Fspan> wlan.isconnected():\n    config = wlan.ifconfig()\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;vasl shod!&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;IP-e bord: {config[0]}&quot;\u003C\u002Fspan>)\n\u003Cspan class=\"tok-kw\">else\u003C\u002Fspan>:\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;vasl nashod! code-e vaziat: {wlan.status()}&quot;\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>مهم‌ترین بخش آن حلقهٔ وسط است؛ بیا کالبدشکافی‌اش کنیم. \u003Ccode>wlan.connect(...)\u003C\u002Fcode> فوری تمام می‌شود، ولی خودِ اتصال چند ثانیه طول می‌کشد — مثل اینکه فرم عضویت را تحویل اداره پست داده‌ای و باید منتظر بمانی مهرش بزنند. از کجا بفهمیم کار تمام شد؟ \u003Ccode>wlan.isconnected()\u003C\u002Fcode> — سؤالی که جوابش \u003Ccode>True\u003C\u002Fcode> یا \u003Ccode>False\u003C\u002Fcode> است. پس حلقهٔ \u003Ccode>while\u003C\u002Fcode> شرطیِ ترم ۳ به کار می‌آید: «تا وقتی وصل نشده‌ای، صبر کن.»\u003C\u002Fp>\n\u003Cp>ولی دقت کن شرط \u003Cstrong>دو تکه\u003C\u002Fstrong> دارد که با \u003Ccode>and\u003C\u002Fcode> به هم چسبیده‌اند:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">not\u003C\u002Fspan> wlan.isconnected() \u003Cspan class=\"tok-kw\">and\u003C\u002Fspan> tries &lt; \u003Cspan class=\"tok-num\">15\u003C\u002Fspan>:\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>چرا \u003Ccode>tries &lt; 15\u003C\u002Fcode>؟ چون اگر پسورد غلط باشد، اتصال \u003Cstrong>هیچ‌وقت\u003C\u002Fstrong> برقرار نمی‌شود و حلقه‌ای که فقط شرط اول را داشت تا ابد «sabr kon» چاپ می‌کرد. شمارندهٔ \u003Ccode>tries\u003C\u002Fcode> مثل تایمر است: هر دور یک ثانیه، حداکثر ۱۵ دور. برنامه‌نویس خوب همیشه برای انتظارش سقف می‌گذارد — اسم این کار \u003Cstrong>timeout\u003C\u002Fstrong> است و از امروز جزو کلماتِ توست. Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>dar hale etesal be Khaneh_Ma ...\nsabr kon... (0)\nsabr kon... (1)\nsabr kon... (2)\nvasl shod!\nIP-e bord: 192.168.1.42\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>وصل شد! و آن خط آخر را قاب کن: بردِ تو الان \u003Cstrong>پلاک\u003C\u002Fstrong> دارد. آن \u003Ccode>wlan.ifconfig()\u003C\u002Fcode> یک بستهٔ چهارتایی از تنظیمات شبکه می‌دهد — مثل لیست است و خانهٔ شماره صفرش IP خودِ برد است؛ بقیه‌اش مال دنیای مدیرهای شبکه است و ما در کل دوره فقط همین خانهٔ صفر را لازم داریم. عددِ تو حتماً با من فرق دارد و کاملاً درست است — پلاکِ محلهٔ شماست.\u003C\u002Fp>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> گوشی‌ات را بردار، تنظیمات WiFi را باز کن و IP خودِ گوشی را پیدا کن. سه عدد اولش با IP برد یکی است؟ اگر بله، گوشیِ تو و ESP32 الان \u003Cstrong>هم‌محله‌ای‌اند\u003C\u002Fstrong> — برای اولین بار در این دوره، دو دستگاهِ دنیای تو در یک شبکه‌اند.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> همیشه \u003Ccode>sabr kon\u003C\u002Fcode> می‌بینی و آخرش \u003Ccode>vasl nashod\u003C\u002Fcode>؟ سه مظنون همیشگی: \u003Cstrong>یک\u003C\u002Fstrong>، پسورد را حرف‌به‌حرف چک کن (حروف بزرگ\u002Fکوچک و عدد جاافتاده). \u003Cstrong>دو\u003C\u002Fstrong>، اسم شبکه غلط است یا اولش\u002Fآخرش یک فاصلهٔ پنهان تایپ شده — اسم را از خروجیِ \u003Ccode>scan()\u003C\u002Fcode> کپی کن. \u003Cstrong>سه\u003C\u002Fstrong>، از روتر خیلی دوری؛ برد را نزدیک‌تر ببر یا با هات‌اسپات گوشیِ کنارِ برد تست کن. و اگر اسم متد را \u003Ccode>conect\u003C\u002Fcode> (با یک n) نوشتی، \u003Ccode>AttributeError\u003C\u002Fcode> می‌گیری — connect دو تا n دارد.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":38,"heading":51,"html":52},"چالش: چرا شرط حلقهٔ انتظار دو تکه است؟","\u003Ch2 id=\"چالش-چرا-شرط-حلقهٔ-انتظار-دو-تکه-است\">چالش: چرا شرط حلقهٔ انتظار دو تکه است؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%DA%86%D8%B1%D8%A7-%D8%B4%D8%B1%D8%B7-%D8%AD%D9%84%D9%82%D9%87%D9%94-%D8%A7%D9%86%D8%AA%D8%B8%D8%A7%D8%B1-%D8%AF%D9%88-%D8%AA%DA%A9%D9%87-%D8%A7%D8%B3%D8%AA\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>بدون نگاه به بالا جواب بده: چرا شرط حلقه هم \u003Ccode>isconnected\u003C\u002Fcode> را چک می‌کند هم \u003Ccode>tries &lt; 15\u003C\u002Fcode> را؟ اگر تکهٔ دوم نبود چه می‌شد؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> تکهٔ اول («هنوز وصل نشده») تنها، اگر پسورد غلط باشد \u003Cstrong>هیچ‌وقت\u003C\u002Fstrong> False نمی‌شود و حلقه تا ابد می‌چرخد. تکهٔ دوم (\u003Ccode>tries &lt; 15\u003C\u002Fcode>) یک سقف می‌گذارد: حداکثر ۱۵ دور صبر کن و بعد بی‌خیال شو. این سقف همان \u003Cstrong>timeout\u003C\u002Fstrong> است — بدونش برنامه‌ات پشتِ یک اتصالِ ناموفق قفل می‌شود.\u003C\u002Fp>\n",{"kind":23,"heading":54,"html":55},"۴. کارآگاه اتصال: وقتی وصل نمی‌شود","\u003Ch2 id=\"۴-کارآگاه-اتصال-وقتی-وصل-نمی‌شود\">۴. کارآگاه اتصال: وقتی وصل نمی‌شود\u003Ca class=\"head-anchor\" href=\"#%DB%B4-%DA%A9%D8%A7%D8%B1%D8%A2%DA%AF%D8%A7%D9%87-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%88%D9%82%D8%AA%DB%8C-%D9%88%D8%B5%D9%84-%D9%86%D9%85%DB%8C%E2%80%8C%D8%B4%D9%88%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>همه‌چیز قشنگ کار کرد — پس طبق عادت همیشگی‌مان، بیا عمداً خرابش کنیم تا روزی که واقعاً خراب شد دستپاچه نشوی. پسورد را عمداً غلط کن و اجرا کن؛ پانزده ثانیه صبر می‌کند و بعد:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>vasl nashod! code-e vaziat: 202\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>این عدد چیست؟ \u003Ccode>wlan.status()\u003C\u002Fcode> وضعیت رادیو را به شکل یک کدِ عددی می‌دهد. خودِ عدد را حفظ نکن — ممکن است روی نسخه‌های مختلف فرق کند. چیزی که باید بلد باشی این است: ماژول \u003Ccode>network\u003C\u002Fcode> برای هر کد یک \u003Cstrong>اسم آماده\u003C\u002Fstrong> دارد، مثل \u003Ccode>network.STAT_WRONG_PASSWORD\u003C\u002Fcode>. پس می‌توانیم یک کارآگاه بنویسیم؛ تابعی که کد را می‌گیرد و به زبان آدمیزاد می‌گوید مشکل چیست. کد کامل، فایل \u003Ccode>src\u002F03_wifi_detective.py\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 4 - Session 01 - karagah-e etesal: tarjome-ye status code ha\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> network\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nSSID = \u003Cspan class=\"tok-str\">&quot;NAME_SHABAKE_TO&quot;\u003C\u002Fspan>\nPASSWORD = \u003Cspan class=\"tok-str\">&quot;in password amdan ghalat ast&quot;\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> explain_status(code):\n    \u003Cspan class=\"tok-com\"># code-e adadi ra be zaban-e adamizad tarjome mikonad\u003C\u002Fspan>\n    \u003Cspan class=\"tok-kw\">if\u003C\u002Fspan> code == network.STAT_GOT_IP:\n        \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;vasl shod va IP gereft!&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-kw\">elif\u003C\u002Fspan> code == network.STAT_WRONG_PASSWORD:\n        \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;password ghalat ast!&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-kw\">elif\u003C\u002Fspan> code == network.STAT_NO_AP_FOUND:\n        \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;shabake-i ba in esm dide nashod (esm ghalat? 5GHz?)&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-kw\">elif\u003C\u002Fspan> code == network.STAT_CONNECTING:\n        \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;hanooz dar hale talash...&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-kw\">else\u003C\u002Fspan>:\n        \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;vaziat: {code} (jadval-e jozve ra bebin)&quot;\u003C\u002Fspan>)\n\nwlan = network.WLAN(network.STA_IF)\nwlan.active(\u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>)\nwlan.connect(SSID, PASSWORD)\n\ntries = \u003Cspan class=\"tok-num\">0\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">not\u003C\u002Fspan> wlan.isconnected() \u003Cspan class=\"tok-kw\">and\u003C\u002Fspan> tries &lt; \u003Cspan class=\"tok-num\">15\u003C\u002Fspan>:\n    time.sleep(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n    explain_status(wlan.status())\n    tries = tries + \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>ساختارش را کامل بلدی: \u003Ccode>def\u003C\u002Fcode> از ترم ۲، زنجیرهٔ \u003Ccode>if\u002Felif\u002Felse\u003C\u002Fcode> از ترم ۱. فقط به‌جای عددِ جادویی، از اسم‌های آمادهٔ ماژول استفاده کردیم — هم کد خواناتر شد، هم اگر روزی اعداد عوض شوند برنامهٔ ما درست می‌ماند. دقت کن این‌جا پسورد را عمداً غلط گذاشته‌ایم (\u003Ccode>in password amdan ghalat ast\u003C\u002Fcode>) تا کارآگاه را تست کنیم. اجرا کن و ببین:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>hanooz dar hale talash...\nhanooz dar hale talash...\npassword ghalat ast!\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>دیگر هیچ‌وقت پشتِ دیوارِ «وصل نمی‌شود، نمی‌دانم چرا» گیر نمی‌کنی — کارآگاهت می‌گوید مشکل از کجاست. دو مظنون اصلی را از هم بشناس: اگر گفت \u003Ccode>password ghalat ast\u003C\u002Fcode>، پسورد را حرف‌به‌حرف چک کن؛ اگر گفت \u003Ccode>shabake-i ba in esm dide nashod\u003C\u002Fcode>، یا اسم را غلط نوشته‌ای — مواظب فاصله‌های پنهانِ اول و آخر باش — یا شبکه‌ات 5GHz است و برد اصلاً نمی‌بیندش.\u003C\u002Fp>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> یک بار با پسورد درست و یک بار با پسورد غلط اجرا کن. با پسورد درست باید آخرش پیام «وصل شد» را ببینی، و با پسورد غلط پیام «password ghalat ast» را.\u003C\u002Fp>\n",{"kind":38,"heading":57,"html":58},"چالش: اسم شبکه با یک فاصلهٔ اضافه — کدام پیام؟","\u003Ch2 id=\"چالش-اسم-شبکه-با-یک-فاصلهٔ-اضافه-—-کدام-پیام\">چالش: اسم شبکه با یک فاصلهٔ اضافه — کدام پیام؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D8%A7%D8%B3%D9%85-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D8%A7-%DB%8C%DA%A9-%D9%81%D8%A7%D8%B5%D9%84%D9%87%D9%94-%D8%A7%D8%B6%D8%A7%D9%81%D9%87-%E2%80%94-%DA%A9%D8%AF%D8%A7%D9%85-%D9%BE%DB%8C%D8%A7%D9%85\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اسم شبکه را درست نوشته‌ای، ولی آخرش سهواً یک فاصلهٔ اضافه تایپ شده. کارآگاه ما احتمالاً کدام پیام را می‌دهد؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> پیام \u003Ccode>shabake-i ba in esm dide nashod\u003C\u002Fcode> (همان \u003Ccode>STAT_NO_AP_FOUND\u003C\u002Fcode>). برای برد، «Khaneh_Ma» با «Khaneh_Ma » (با یک فاصلهٔ آخر) دو اسم کاملاً متفاوت‌اند، پس شبکه‌ای با آن اسم پیدا نمی‌کند. این با پیامِ پسورد غلط فرق دارد: آن‌جا شبکه پیدا می‌شود ولی کارتِ عضویت رد می‌شود.\u003C\u002Fp>\n",{"kind":23,"heading":60,"html":61},"۵. چراغ اتصال: وضعیت شبکه بدون کامپیوتر","\u003Ch2 id=\"۵-چراغ-اتصال-وضعیت-شبکه-بدون-کامپیوتر\">۵. چراغ اتصال: وضعیت شبکه بدون کامپیوتر\u003Ca class=\"head-anchor\" href=\"#%DB%B5-%DA%86%D8%B1%D8%A7%D8%BA-%D8%A7%D8%AA%D8%B5%D8%A7%D9%84-%D9%88%D8%B6%D8%B9%DB%8C%D8%AA-%D8%B4%D8%A8%DA%A9%D9%87-%D8%A8%D8%AF%D9%88%D9%86-%DA%A9%D8%A7%D9%85%D9%BE%DB%8C%D9%88%D8%AA%D8%B1\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>یک مشکل کوچک مانده: همهٔ این پیام‌ها در Shell است. اگر فردا برد را با پاور بانک گوشهٔ اتاق گذاشتی، از کجا بفهمی وصل شده؟ جوابِ همیشگی ما: سخت‌افزار! به روتر خانه نگاه کن — چراغ‌هایش دقیقاً برای همین است. ما هم برای بردمان یک \u003Cstrong>چراغ وضعیت\u003C\u002Fstrong> می‌سازیم: همان LED قرمز ترم ۱ با مقاومت 220 اهم روی پایهٔ GPIO 25.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>مواظب باش:\u003C\u002Fstrong> قانون ایمنی ترم ۱ — وقتی سیم جابه‌جا می‌کنی، برق قطع. قبل از بستن مدارِ LED، کابل USB را از برد جدا کن.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>مدار همان چشمک‌زنِ ترم ۱ است. قرارداد چراغ ما سه حالته است: چشمکِ آرام یعنی «در حال تلاش»، روشنِ ثابت یعنی «وصل»، خاموش یعنی «نشد». کافی است داخل حلقهٔ انتظار LED را روشن-خاموش کنیم و بعد از حلقه، بسته به نتیجه، ثابتش کنیم. کد کامل، فایل \u003Ccode>src\u002F04_wifi_led_indicator.py\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 4 - Session 01 - cheragh-e etesal: cheshmak yani talash, sabet yani vasl\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">from\u003C\u002Fspan> machine \u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> Pin\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> network\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nSSID = \u003Cspan class=\"tok-str\">&quot;NAME_SHABAKE_TO&quot;\u003C\u002Fspan>\nPASSWORD = \u003Cspan class=\"tok-str\">&quot;PASSWORD_SHABAKE&quot;\u003C\u002Fspan>\n\nled = Pin(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, Pin.OUT)   \u003Cspan class=\"tok-com\"># haman LED-e ghermez-e term 1\u003C\u002Fspan>\n\nwlan = network.WLAN(network.STA_IF)\nwlan.active(\u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>)\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;dar hale etesal be {SSID} ...&quot;\u003C\u002Fspan>)\nwlan.connect(SSID, PASSWORD)\n\ntries = \u003Cspan class=\"tok-num\">0\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">not\u003C\u002Fspan> wlan.isconnected() \u003Cspan class=\"tok-kw\">and\u003C\u002Fspan> tries &lt; \u003Cspan class=\"tok-num\">15\u003C\u002Fspan>:\n    led.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)          \u003Cspan class=\"tok-com\"># cheshmak-e aram: dar hale talash\u003C\u002Fspan>\n    time.sleep(\u003Cspan class=\"tok-num\">0.2\u003C\u002Fspan>)\n    led.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">0.8\u003C\u002Fspan>)\n    tries = tries + \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">if\u003C\u002Fspan> wlan.isconnected():\n    led.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)          \u003Cspan class=\"tok-com\"># roshan-e sabet = vasl!\u003C\u002Fspan>\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;vasl shod!&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;IP-e bord: {wlan.ifconfig()[0]}&quot;\u003C\u002Fspan>)\n\u003Cspan class=\"tok-kw\">else\u003C\u002Fspan>:\n    led.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)          \u003Cspan class=\"tok-com\"># khamush = nashod - karagah ra ejra kon\u003C\u002Fspan>\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;vasl nashod. code-e vaziat: {wlan.status()}&quot;\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Run بزن و به LED نگاه کن.\u003C\u002Fp>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> LED باید چند بار آرام چشمک بزند (در حال تلاش) و بعد ثابت روشن بماند (وصل شد). از امروز بردت مثل یک دستگاه واقعی حرف می‌زند: نگاهش کنی می‌فهمی حالش چطور است. این الگوی «چراغ وضعیت» را در همهٔ دستگاه‌های دوروبرت می‌بینی — روتر، پرینتر، کنسول بازی — و حالا خودت یکی ساخته‌ای.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> LED اصلاً روشن نمی‌شود؟ جهت LED را چک کن (پایهٔ بلند سمت مقاومت، پایهٔ کوتاه سمت GND) و مطمئن شو سیم، مقاومت و LED هم‌ردیف Breadboard‌اند. LED چشمک می‌زند ولی هیچ‌وقت ثابت نمی‌شود؟ یعنی اتصال برقرار نشده — برگرد سراغ کارآگاه بخش ۴ تا بفهمی مشکل پسورد است یا اسم شبکه.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":23,"heading":63,"html":64},"قطعه نداری؟ مسیر شبیه‌ساز","\u003Ch2 id=\"قطعه-نداری-مسیر-شبیه‌ساز\">قطعه نداری؟ مسیر شبیه‌ساز\u003Ca class=\"head-anchor\" href=\"#%D9%82%D8%B7%D8%B9%D9%87-%D9%86%D8%AF%D8%A7%D8%B1%DB%8C-%D9%85%D8%B3%DB%8C%D8%B1-%D8%B4%D8%A8%DB%8C%D9%87%E2%80%8C%D8%B3%D8%A7%D8%B2\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>کدهای این فصل به یک شبکهٔ WiFi واقعی نیاز دارند و \u003Cstrong>شبیه‌ساز مرورگرِ ما شبکه را اجرا نمی‌کند\u003C\u002Fstrong>. ولی هیچ‌چیز را از دست نمی‌دهی: هر چهار کد را در آزمایشگاه ببین و کپی کن تا تایپ‌نکرده جلو بروی، و مدارِ چراغ اتصال (LED قرمز + مقاومت 220 اهم روی GPIO 25، همان چشمک‌زن ترم ۱) را همان‌جا بساز. برای اجرای واقعیِ اتصال، به یک برد و شبکهٔ خانه (یا هات‌اسپات گوشی) نیاز داری.\u003C\u002Fp>\n",{"kind":30,"heading":31,"html":66,"embed":33},"کدها را آنجا ببین و کپی کن و مدار چراغ را بساز",{"kind":23,"heading":68,"html":69},"واژه‌های تازه این فصل","\u003Ch2 id=\"واژه‌های-تازه-این-فصل\">واژه‌های تازه این فصل\u003Ca class=\"head-anchor\" href=\"#%D9%88%D8%A7%DA%98%D9%87%E2%80%8C%D9%87%D8%A7%DB%8C-%D8%AA%D8%A7%D8%B2%D9%87-%D8%A7%DB%8C%D9%86-%D9%81%D8%B5%D9%84\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>کلمه\u003C\u002Fth>\n\u003Cth>تلفظ به حروف فارسی\u003C\u002Fth>\n\u003Cth>یعنی چه\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>Network\u003C\u002Ftd>\n\u003Ctd>نت‌وُرک\u003C\u002Ftd>\n\u003Ctd>شبکه؛ گروهی از دستگاه‌ها که با هم حرف می‌زنند\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Router\u003C\u002Ftd>\n\u003Ctd>روتِر\u003C\u002Ftd>\n\u003Ctd>اداره پستِ محله؛ جعبه‌ای که همهٔ نامه‌های شبکه از آن رد می‌شود\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>IP Address\u003C\u002Ftd>\n\u003Ctd>آی‌پی اَدرِس\u003C\u002Ftd>\n\u003Ctd>پلاکِ هر دستگاه در شبکه — چهار عدد با نقطه\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>SSID\u003C\u002Ftd>\n\u003Ctd>اِس‌اِس‌آی‌دی\u003C\u002Ftd>\n\u003Ctd>اسم شبکهٔ WiFi — همان که در فهرست گوشی می‌بینی\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Station\u003C\u002Ftd>\n\u003Ctd>استِیشِن\u003C\u002Ftd>\n\u003Ctd>حالتِ «عضو شبکه» — برد مثل گوشی به شبکهٔ دیگران وصل می‌شود\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Scan\u003C\u002Ftd>\n\u003Ctd>اِسکَن\u003C\u002Ftd>\n\u003Ctd>گشتن دنبال شبکه‌های اطراف\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Timeout\u003C\u002Ftd>\n\u003Ctd>تایم‌اوت\u003C\u002Ftd>\n\u003Ctd>سقفِ انتظار؛ «بیشتر از این صبر نکن»\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Status\u003C\u002Ftd>\n\u003Ctd>استَتِس\u003C\u002Ftd>\n\u003Ctd>وضعیت؛ گزارش اینکه کار به کجا رسیده\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",{"kind":38,"heading":71,"html":72},"تمرین‌ها","\u003Ch2 id=\"تمرین‌ها\">تمرین‌ها\u003Ca class=\"head-anchor\" href=\"#%D8%AA%D9%85%D8%B1%DB%8C%D9%86%E2%80%8C%D9%87%D8%A7\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اول چک‌لیست پایان فصل: با مدل محله می‌توانی نقش روتر و IP و SSID و پسورد را توضیح بدهی؛ خروجی \u003Ccode>scan()\u003C\u002Fcode> را اجرا کرده‌ای و اسم شبکهٔ خانه را در لیست دیده‌ای؛ برد وصل شده و IP چاپ شده؛ با پسورد غلط، کارآگاه علت را گفته؛ و چراغ اتصال هر سه حالت را نشان می‌دهد. اگر همه بله است، برو سراغ تمرین‌ها:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>تمرین اجباری:\u003C\u002Fstrong> برنامهٔ چراغ اتصال را روی برد خودت راه بینداز و آزمایشِ «شکارچی پلاک» را کامل کن: IP برد و IP گوشی را یادداشت کن (سه عدد اول یکی است؟)، بعد روتر خانه را با اجازهٔ خانواده خاموش-روشن کن و دوباره وصل شو — ببین برد همان پلاک قبلی را گرفت یا پلاکِ تازه. هر دو IP و نتیجه را در دفترچهٔ مهندسی بنویس. اسم فایل: \u003Ccode>my_wifi.py\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تمرین ستاره‌دار ⭐:\u003C\u002Fstrong> «چراغ خطا» بساز (\u003Ccode>my_wifi_pro.py\u003C\u002Fcode>): کاری کن که اگر بعد از ۱۵ ثانیه وصل نشد، به‌جای خاموشِ ساده، LED سه بار خیلی سریع چشمک بزند (روشن-خاموش با تأخیر ۰٫۱ ثانیه) و بعد خاموش بماند — علامتِ بین‌المللیِ «یک جای کار می‌لنگد». راهنمایی: یک حلقهٔ \u003Ccode>for\u003C\u002Fcode> کوچک در شاخهٔ \u003Ccode>else\u003C\u002Fcode>. بعد یک پلهٔ حرفه‌ای‌تر: کارآگاه \u003Ccode>explain_status\u003C\u002Fcode> را هم به همین فایل اضافه کن تا هم چراغ هشدار بدهد هم Shell علتِ دقیق را بگوید.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"kind":23,"heading":74,"html":75},"در فصل بعد","\u003Ch2 id=\"در-فصل-بعد\">در فصل بعد\u003Ca class=\"head-anchor\" href=\"#%D8%AF%D8%B1-%D9%81%D8%B5%D9%84-%D8%A8%D8%B9%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>بردت فقط \u003Cstrong>عضو محله\u003C\u002Fstrong> شد — هنوز حتی یک نامه هم از اینترنت نگرفته. فصل بعد این را عوض می‌کنیم: از یک سرویس اینترنتی ساعتِ دقیقِ جهانی را می‌گیریم و روی OLED یک \u003Cstrong>ساعت اینترنتی\u003C\u002Fstrong> می‌سازیم که هیچ‌وقت خواب نمی‌ماند — و سر راه یاد می‌گیری وقتی دو کامپیوتر با هم حرف می‌زنند دقیقاً چه می‌گویند.\u003C\u002Fp>\n",{"course":77,"entitled":12,"lessons":85,"payments_enabled":12,"terms":254,"live":5},{"active_window":78,"effective_price_toman":79,"free":5,"lesson_count":80,"price_toman":81,"slug":82,"summary_fa":83,"title_fa":84},null,0,56,1500000,"airo","خودآموز رباتیک برای ۱۲ تا ۱۵ ساله‌ها: از اولین LED تا ربات متصل به هوش مصنوعی، با ESP32 و MicroPython.","آیرو — خودآموز رباتیک",[86,89,92,95,98,102,106,110,114,118,122,125,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,193,194,195,198,201,204,207,210,213,216,219,221,224,227,230,233,236,239,242,245,248,251],{"free_preview":5,"order":6,"slug":87,"source":8,"term":6,"title_fa":88},"t1-s01-meet-robots","فصل ۱ — دنیای ربات‌ها و جعبه‌ابزار ما",{"free_preview":12,"order":18,"slug":90,"source":8,"term":6,"title_fa":91},"t1-s02-electricity-first-circuit","فصل ۲ — برق و اولین مدار",{"free_preview":12,"order":15,"slug":93,"source":8,"term":6,"title_fa":94},"t1-s03-breadboard-mastery","فصل ۳ — تسلط بر Breadboard",{"free_preview":12,"order":9,"slug":96,"source":8,"term":6,"title_fa":97},"t1-s04-esp32-setup","فصل ۴ — آشنایی با ESP32 و راه‌اندازی",{"free_preview":12,"order":99,"slug":100,"source":8,"term":6,"title_fa":101},5,"t1-s05-first-code-blink","فصل ۵ — اولین برنامه: چشمک‌زن",{"free_preview":12,"order":103,"slug":104,"source":8,"term":6,"title_fa":105},6,"t1-s06-variables","فصل ۶ — متغیرها: حافظهٔ برنامه",{"free_preview":12,"order":107,"slug":108,"source":8,"term":6,"title_fa":109},7,"t1-s07-loops","فصل ۷ — حلقه‌ها: قدرت تکرار",{"free_preview":12,"order":111,"slug":112,"source":8,"term":6,"title_fa":113},8,"t1-s08-button-input","فصل ۸ — ورودی دیجیتال: دکمه",{"free_preview":12,"order":115,"slug":116,"source":8,"term":6,"title_fa":117},9,"t1-s09-logic","فصل ۹ — منطق و تصمیم‌های ترکیبی",{"free_preview":12,"order":119,"slug":120,"source":8,"term":6,"title_fa":121},10,"t1-s10-buzzer-pwm-tone","فصل ۱۰ — صدا: Buzzer و اولین PWM",{"free_preview":12,"order":13,"slug":123,"source":8,"term":6,"title_fa":124},"t1-s11-term-project-build","فصل ۱۱ — پروژه ترم: چراغ راهنمایی هوشمند — ساخت",{"free_preview":12,"order":126,"slug":127,"source":8,"term":6,"title_fa":128},12,"t1-s12-term-project-upgrade","فصل ۱۲ — پروژه ترم: ارتقا و نمایش",{"free_preview":5,"order":6,"slug":130,"source":8,"term":18,"title_fa":131},"t2-s01-functions","فصل ۱ — توابع: کارخانه‌های کوچک کد",{"free_preview":12,"order":18,"slug":133,"source":8,"term":18,"title_fa":134},"t2-s02-pwm-dimming","فصل ۲ — PWM کامل: کنترل روشنایی",{"free_preview":12,"order":15,"slug":136,"source":8,"term":18,"title_fa":137},"t2-s03-adc-potentiometer","فصل ۳ — ورودی آنالوگ: پتانسیومتر",{"free_preview":12,"order":9,"slug":139,"source":8,"term":18,"title_fa":140},"t2-s04-ldr-night-light","فصل ۴ — سنسور نور و چراغ خودکار",{"free_preview":12,"order":99,"slug":142,"source":8,"term":18,"title_fa":143},"t2-s05-lists-data","فصل ۵ — لیست‌ها و داده‌ها",{"free_preview":12,"order":103,"slug":145,"source":8,"term":18,"title_fa":146},"t2-s06-dht11-library","فصل ۶ — دما و رطوبت: کتابخانه‌ها",{"free_preview":12,"order":107,"slug":148,"source":8,"term":18,"title_fa":149},"t2-s07-oled-display","فصل ۷ — نمایشگر OLED",{"free_preview":12,"order":111,"slug":151,"source":8,"term":18,"title_fa":152},"t2-s08-servo","فصل ۸ — Servo: اولین حرکت",{"free_preview":12,"order":115,"slug":154,"source":8,"term":18,"title_fa":155},"t2-s09-ultrasonic","فصل ۹ — سنسور فاصله HC-SR04",{"free_preview":12,"order":119,"slug":157,"source":8,"term":18,"title_fa":158},"t2-s10-term-project-build","فصل ۱۰ — پروژه ترم: ایستگاه هواشناسی رومیزی — ساخت",{"free_preview":12,"order":13,"slug":160,"source":8,"term":18,"title_fa":161},"t2-s11-term-project-upgrade","فصل ۱۱ — پروژه ترم: ارتقا و نمایش",{"free_preview":5,"order":6,"slug":163,"source":8,"term":15,"title_fa":164},"t3-s01-robot-anatomy","فصل ۱ — آناتومی ربات متحرک",{"free_preview":12,"order":18,"slug":166,"source":8,"term":15,"title_fa":167},"t3-s02-motor-driver","فصل ۲ — چرخاندن موتور با L298N",{"free_preview":12,"order":15,"slug":169,"source":8,"term":15,"title_fa":170},"t3-s03-chassis-assembly","فصل ۳ — مونتاژ ربات و توابع حرکت",{"free_preview":12,"order":9,"slug":172,"source":8,"term":15,"title_fa":173},"t3-s04-calibration-choreography","فصل ۴ — کالیبراسیون و رقص ربات",{"free_preview":12,"order":99,"slug":175,"source":8,"term":15,"title_fa":176},"t3-s05-ultrasonic-brake","فصل ۵ — چشم ربات: ترمز خودکار",{"free_preview":12,"order":103,"slug":178,"source":8,"term":15,"title_fa":179},"t3-s06-obstacle-avoidance","فصل ۶ — ربات دوری‌گزین",{"free_preview":12,"order":107,"slug":181,"source":8,"term":15,"title_fa":182},"t3-s07-line-sensors","فصل ۷ — خواندن خط",{"free_preview":12,"order":111,"slug":184,"source":8,"term":15,"title_fa":185},"t3-s08-line-follower","فصل ۸ — دنبال‌کننده خط",{"free_preview":12,"order":115,"slug":187,"source":8,"term":15,"title_fa":188},"t3-s09-better-line-follower","فصل ۹ — دنبال‌کننده بهتر: کنترل P",{"free_preview":12,"order":119,"slug":190,"source":8,"term":15,"title_fa":191},"t3-s10-term-project-build","فصل ۱۰ — پروژه ترم: ربات ماموریت — ساخت",{"free_preview":12,"order":13,"slug":14,"source":8,"term":15,"title_fa":16},{"free_preview":5,"order":6,"slug":7,"source":8,"term":9,"title_fa":10},{"free_preview":12,"order":18,"slug":19,"source":8,"term":9,"title_fa":20},{"free_preview":12,"order":15,"slug":196,"source":8,"term":9,"title_fa":197},"t4-s03-web-server-led","فصل ۳ — وب‌سرور: کنترل LED از گوشی",{"free_preview":12,"order":9,"slug":199,"source":8,"term":9,"title_fa":200},"t4-s04-sensor-dashboard","فصل ۴ — داشبورد وب سنسورها",{"free_preview":12,"order":99,"slug":202,"source":8,"term":9,"title_fa":203},"t4-s05-robot-web-remote","فصل ۵ — ریموت وب: ربات را با گوشی بران",{"free_preview":12,"order":103,"slug":205,"source":8,"term":9,"title_fa":206},"t4-s06-json-apikeys","فصل ۶ — JSON و کلید API: زبان داده‌ها و کلیدِ درها",{"free_preview":12,"order":107,"slug":208,"source":8,"term":9,"title_fa":209},"t4-s07-first-ai-call","فصل ۷ — اولین تماس با AI: الگوی پل",{"free_preview":12,"order":111,"slug":211,"source":8,"term":9,"title_fa":212},"t4-s08-ai-sensor-assistant","فصل ۸ — دستیار سنسوری هوشمند",{"free_preview":12,"order":115,"slug":214,"source":8,"term":9,"title_fa":215},"t4-s09-esp32-direct-ai","فصل ۹ — وقتی برد خودش با AI حرف می‌زند",{"free_preview":12,"order":119,"slug":217,"source":8,"term":9,"title_fa":218},"t4-s10-term-project-build","فصل ۱۰ — پروژه ترم: دستیار هوشمند",{"free_preview":12,"order":13,"slug":220,"source":8,"term":9,"title_fa":161},"t4-s11-term-project-upgrade",{"free_preview":5,"order":6,"slug":222,"source":8,"term":99,"title_fa":223},"t5-s01-why-cpp","فصل ۱ — زبان دوم: چرا و چطور",{"free_preview":12,"order":18,"slug":225,"source":8,"term":99,"title_fa":226},"t5-s02-cpp-syntax","فصل ۲ — سینتکس C++: قواعد کشور جدید",{"free_preview":12,"order":15,"slug":228,"source":8,"term":99,"title_fa":229},"t5-s03-cpp-functions-speed","فصل ۳ — توابع C++ و آزمون سرعت",{"free_preview":12,"order":9,"slug":231,"source":8,"term":99,"title_fa":232},"t5-s04-pid-line-follower","فصل ۴ — کنترل PID برای دنبال‌کننده خط",{"free_preview":12,"order":99,"slug":234,"source":8,"term":99,"title_fa":235},"t5-s05-mpu6050","فصل ۵ — حس تعادل: MPU6050",{"free_preview":12,"order":103,"slug":237,"source":8,"term":99,"title_fa":238},"t5-s06-bluetooth-control","فصل ۶ — کنترل Bluetooth با گوشی",{"free_preview":12,"order":107,"slug":240,"source":8,"term":99,"title_fa":241},"t5-s07-engineering-process","فصل ۷ — فرایند مهندسی پروژهٔ نهایی",{"free_preview":12,"order":111,"slug":243,"source":8,"term":99,"title_fa":244},"t5-s08-capstone-skeleton","فصل ۸ — پروژهٔ نهایی ۱: اسکلت",{"free_preview":12,"order":115,"slug":246,"source":8,"term":99,"title_fa":247},"t5-s09-capstone-features","فصل ۹ — پروژهٔ نهایی، بخش دوم: قابلیت‌ها",{"free_preview":12,"order":119,"slug":249,"source":8,"term":99,"title_fa":250},"t5-s10-capstone-debug","فصل ۱۰ — پروژهٔ نهایی، بخش سوم: رفعِ اشکال و پایداری",{"free_preview":12,"order":13,"slug":252,"source":8,"term":99,"title_fa":253},"t5-s11-graduation","فصل ۱۱ — فارغ‌التحصیلی: نمایشِ نهایی و مسیرِ آینده",[],1784827104456]