[{"data":1,"prerenderedAt":253},["ShallowReactive",2],{"lesson:t5-s01-why-cpp":3,"course:airo":74},{"meta":4,"prev":11,"next":17,"sections":21},{"free_preview":5,"order":6,"slug":7,"source":8,"term":9,"title_fa":10},true,1,"t5-s01-why-cpp","book",5,"فصل ۱ — زبان دوم: چرا و چطور",{"free_preview":12,"order":13,"slug":14,"source":8,"term":15,"title_fa":16},false,11,"t4-s11-term-project-upgrade",4,"فصل ۱۱ — پروژه ترم: ارتقا و نمایش",{"free_preview":12,"order":18,"slug":19,"source":8,"term":9,"title_fa":20},2,"t5-s02-cpp-syntax","فصل ۲ — سینتکس C++: قواعد کشور جدید",[22,26,29,32,36,39,42,45,48,51,56,59,62,65,68,71],{"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>چهار ترم است که همه‌چیز را با یک زبان ساخته‌ای: MicroPython. با همان یک زبان از یک LED چشمک‌زن شروع کردی و رسیدی به رباتی که خط را دنبال می‌کند، از گوشی فرمان می‌گیرد و با هوش مصنوعی حرف می‌زند. حالا در ترم آخر یک زبان دوم شروع می‌کنیم: \u003Cstrong>C++\u003C\u002Fstrong> — بخوان «سی پلاس پلاس». نترس؛ تو از چیزی که فکر می‌کنی جلوتری. برنامه‌نویسی یعنی متغیر، شرط، حلقه و تابع — و همه‌ی این‌ها را بلدی. امروز فقط زبان عوض می‌شود، نه فکر کردن. مثل راننده‌ای که پشت ماشین تازه‌ای می‌نشیند: دنده جای دیگری است، ولی رانندگی همان است.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F01-image-bilingual-engineer.c9344c4866.160.webp 160w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.320.webp 320w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.640.webp 640w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F01-image-bilingual-engineer.c9344c4866.1280.jpg\" srcset=\"\u002F_img\u002F01-image-bilingual-engineer.c9344c4866.160.jpg 160w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.320.jpg 320w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.640.jpg 640w, \u002F_img\u002F01-image-bilingual-engineer.c9344c4866.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"مهندس نوجوانِ دوزبانه بین دو حباب گفت‌وگو با برچسب‌های Python و C++، یک ربات دوچرخ در دست، و سه نشان شناور: سرعت، جام مسابقات، و ماژول‌های Arduino\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>آخر این فصل می‌توانی:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>سه دلیل یادگیری C++ را بگویی: سرعت اجرا، دنیای مسابقات ربات، و اکوسیستم بزرگ Arduino.\u003C\u002Fli>\n\u003Cli>با تشبیه «مترجم همزمان در برابر کتاب ترجمه‌شده» توضیح بدهی compile یعنی چه و چرا C++ سریع‌تر است.\u003C\u002Fli>\n\u003Cli>Arduino IDE و هسته‌ی ESP32 را نصب کنی و برد و پورت درست را انتخاب کنی.\u003C\u002Fli>\n\u003Cli>ساختار \u003Ccode>setup\u003C\u002Fcode>\u002F\u003Ccode>loop\u003C\u002Fcode> را بشناسی و همان Blink ترم ۱ را به C++ ترجمه، کامپایل و روی برد واقعی upload کنی.\u003C\u002Fli>\n\u003Cli>دو خطای کلاسیک — پورت\u002Fبرد غلط و سمی‌کالن جاافتاده — را از روی متن پیام رفع کنی و راه برگشت به MicroPython را بلد باشی.\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> Thonny نصب است، درایور USB کار می‌کند و فریمور MicroPython روی بردت Flash شده. خبر خوب: درایور همان است، پورت COM همان است، و راه برگشت به MicroPython هم دقیقاً همان فلش است.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۵:\u003C\u002Fstrong> Blink را با \u003Ccode>machine.Pin\u003C\u002Fcode> و \u003Ccode>time.sleep\u003C\u002Fcode> نوشته‌ای. امروز همان برنامه را به زبان دوم ترجمه می‌کنیم.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۷:\u003C\u002Fstrong> حلقه‌ی \u003Ccode>while True\u003C\u002Fcode> — قلب مدل اجرای MicroPython. امروز قِل واقعی \u003Ccode>loop\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 DevKit + کابل USB دیتا\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Breadboard + LED قرمز + مقاومت ۲۲۰ اهم\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>همان مدار Blink ترم ۱\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>کامپیوتر با اینترنت (برای دانلود IDE و هسته)\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>مسیر شبیه‌ساز آخر همین فصل\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",{"kind":23,"heading":30,"html":31},"۱. راز سرعت: مترجم همزمان یا کتاب ترجمه‌شده؟","\u003Ch2 id=\"۱-راز-سرعت-مترجم-همزمان-یا-کتاب-ترجمه‌شده\">۱. راز سرعت: مترجم همزمان یا کتاب ترجمه‌شده؟\u003Ca class=\"head-anchor\" href=\"#%DB%B1-%D8%B1%D8%A7%D8%B2-%D8%B3%D8%B1%D8%B9%D8%AA-%D9%85%D8%AA%D8%B1%D8%AC%D9%85-%D9%87%D9%85%D8%B2%D9%85%D8%A7%D9%86-%DB%8C%D8%A7-%DA%A9%D8%AA%D8%A7%D8%A8-%D8%AA%D8%B1%D8%AC%D9%85%D9%87%E2%80%8C%D8%B4%D8%AF%D9%87\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>قبل از نصب هر چیزی، بیا بفهمیم فرق واقعی این دو زبان کجاست — چون همین فرق، جواب سؤال «چرا C++ سریع‌تر است؟» هم هست.\u003C\u002Fp>\n\u003Cp>یک سخنران خارجی را تصور کن که برای جمعی فارسی‌زبان حرف می‌زند. راه اول: یک \u003Cstrong>مترجم همزمان\u003C\u002Fstrong> کنارش می‌ایستد و جمله‌به‌جمله ترجمه می‌کند. راحت است، همان لحظه جواب می‌گیری، ولی همه‌چیز کُند پیش می‌رود — هر جمله اول باید شنیده، بعد ترجمه، بعد گفته شود. MicroPython دقیقاً همین است: داخل ESP32 تو یک مترجم همزمان زندگی می‌کند که اسمش interpreter است. هر بار برنامه‌ات اجرا می‌شود، این مترجم خط‌به‌خط کد Python تو را می‌خواند و همان لحظه برای تراشه ترجمه می‌کند. برای همین REPL داشتیم: یک خط می‌نوشتی، همان لحظه جواب می‌گرفتی. عالی برای یاد گرفتن — ولی تراشه‌ی بیچاره نصف زورش صرف ترجمه می‌شود.\u003C\u002Fp>\n\u003Cp>راه دوم: کتاب سخنران را \u003Cstrong>از قبل، یک بار برای همیشه\u003C\u002Fstrong> ترجمه کنی و چاپ‌شده دست مردم بدهی. آماده‌سازی‌اش زمان می‌برد، ولی موقع خواندن دیگر هیچ ترجمه‌ای در کار نیست — با سرعت کامل می‌خوانی. C++ همین‌طور کار می‌کند: برنامه‌ات روی \u003Cstrong>کامپیوتر خودت\u003C\u002Fstrong> توسط ابزاری به اسم \u003Cstrong>کامپایلر\u003C\u002Fstrong> یک‌بار به زبان مادری تراشه ترجمه می‌شود — به این کار می‌گویند \u003Cstrong>compile\u003C\u002Fstrong> — و بعد فایل ترجمه‌شده داخل برد ریخته می‌شود. از آن به بعد، ESP32 فقط اجرا می‌کند؛ بدون مترجم، با تمام سرعت. جلسه‌ی سوم همین ترم، این سرعت را با چشم خودت اندازه می‌گیری.\u003C\u002Fp>\n\u003Cp>اما هیچ‌چیز مجانی نیست: هر بار حتی یک حرف از کد عوض شود، باید دوباره compile و upload کنی — و خبری از REPL هم نیست. برای همین MicroPython را کنار نمی‌گذاریم؛ دو ابزار برای دو جور کار: آزمایش سریع و ایده‌پردازی با MicroPython؛ سرعت و کنترل دقیق و مسابقه با C++.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>💡 \u003Cstrong>نکته:\u003C\u002Fstrong> سه دلیل محکم برای این زبان دوم داشته باش: \u003Cstrong>سرعت\u003C\u002Fstrong> (همین برد، ده‌ها برابر تندتر)، \u003Cstrong>مسابقات\u003C\u002Fstrong> (دنیای WRO و FTC پر از بردهای خانواده‌ی Arduino و کد C++ است)، و \u003Cstrong>اکوسیستم Arduino\u003C\u002Fstrong> (برای تقریباً هر قطعه‌ای یک کتابخانه‌ی آماده هست).\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":33,"heading":34,"html":35},"checkpoint","چالش: مترجم کجا، کامپایلر کجا؟","\u003Ch2 id=\"چالش-مترجم-کجا-کامپایلر-کجا\">چالش: مترجم کجا، کامپایلر کجا؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D9%85%D8%AA%D8%B1%D8%AC%D9%85-%DA%A9%D8%AC%D8%A7-%DA%A9%D8%A7%D9%85%D9%BE%D8%A7%DB%8C%D9%84%D8%B1-%DA%A9%D8%AC%D8%A7\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>قبل از باز کردن جواب، خودت بگو: مترجمِ MicroPython کجا زندگی می‌کند و کامپایلرِ C++ کجا؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> مترجمِ MicroPython \u003Cstrong>داخل خود برد\u003C\u002Fstrong> زندگی می‌کند و همان لحظه‌ی اجرا کد را ترجمه می‌کند. کامپایلرِ C++ \u003Cstrong>روی کامپیوتر تو\u003C\u002Fstrong> است و یک‌بار قبل از فرستادن، کل برنامه را ترجمه می‌کند. برد آماده‌ی ترجمه‌شده را فقط اجرا می‌کند — برای همین سریع‌تر است.\u003C\u002Fp>\n",{"kind":23,"heading":37,"html":38},"۲. خانه‌ی زبان دوم را نصب کن: Arduino IDE","\u003Ch2 id=\"۲-خانه‌ی-زبان-دوم-را-نصب-کن-arduino-ide\">۲. خانه‌ی زبان دوم را نصب کن: Arduino IDE\u003Ca class=\"head-anchor\" href=\"#%DB%B2-%D8%AE%D8%A7%D9%86%D9%87%E2%80%8C%DB%8C-%D8%B2%D8%A8%D8%A7%D9%86-%D8%AF%D9%88%D9%85-%D8%B1%D8%A7-%D9%86%D8%B5%D8%A8-%DA%A9%D9%86-arduino-ide\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>همان‌طور که خانه‌ی MicroPython برنامه‌ی Thonny بود، خانه‌ی C++ ما محیطی است به اسم \u003Cstrong>Arduino IDE\u003C\u002Fstrong> — رایگان، برای ویندوز و مک و لینوکس. نشانی دانلود و نسخه‌ی پیشنهادی را در جزوه‌ی همراه (سایت رسمی) پیدا کن، چون این چیزها عوض می‌شوند. نصبش مثل هر برنامه‌ی دیگری است: Next، Next، Finish.\u003C\u002Fp>\n\u003Cp>بازش که می‌کنی، یک صفحه‌ی ساده می‌بینی با دو دکمه‌ی مهم بالای صفحه: یک \u003Cstrong>تیک ✓\u003C\u002Fstrong> یعنی «compile کن» و یک \u003Cstrong>فلش ←\u003C\u002Fstrong> یعنی «بفرست توی برد» — به این کار می‌گوییم \u003Cstrong>Upload\u003C\u002Fstrong>. به هر برنامه در این محیط می‌گویند \u003Cstrong>Sketch\u003C\u002Fstrong> یعنی «طرح».\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.160.webp 160w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.320.webp 320w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.640.webp 640w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.1280.jpg\" srcset=\"\u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.160.jpg 160w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.320.jpg 320w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.640.jpg 640w, \u002F_img\u002F03-image-arduino-ide-anatomy.0551ca5810.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"آناتومی محیط Arduino IDE: نوار بالا با دکمه‌ی تیک برای compile و دکمه‌ی فلش برای Upload، منوهای Board و Port، و دو جعبه‌ی خالی setup و loop در ویرایشگر\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>اما یک قدم مهم مانده. Arduino IDE از اول فقط بردهای خود Arduino را می‌شناسد؛ اسم ESP32 را که بیاوری، می‌گوید «این کیست؟». باید معرفی‌شان کنیم. این کار با نصب بسته‌ای به اسم \u003Cstrong>هسته‌ی ESP32\u003C\u002Fstrong> انجام می‌شود: بسته‌ای که کامپایلر و ابزار upload مخصوص تراشه‌ی ما را به IDE اضافه می‌کند. دو قدم دارد:\u003C\u002Fp>\n\u003Col>\n\u003Cli>از منوی File گزینه‌ی Preferences را باز کن؛ کادری هست به اسم «Additional boards manager URLs» — نشانیِ داخل جزوه را عیناً همان‌جا کپی کن و OK بزن.\u003C\u002Fli>\n\u003Cli>از پنل کناری، Boards Manager را باز کن، در جستجو بنویس \u003Ccode>esp32\u003C\u002Fcode>، و بسته‌ای که نویسنده‌اش Espressif است را Install کن. این بسته حجیم است — یک کامپایلر کامل داخلش است! — پس چند دقیقه صبر لازم دارد.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>نصب که تمام شد، دو انتخاب همیشگی از منوی Tools:\u003C\u002Fp>\n\u003Col>\n\u003Cli>گزینه‌ی Board را بزن و از خانواده‌ی esp32، \u003Cstrong>ESP32 Dev Module\u003C\u002Fstrong> را انتخاب کن.\u003C\u002Fli>\n\u003Cli>گزینه‌ی Port را بزن و همان پورت COM آشنای ترم ۱ را انتخاب کن.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>مواظب باش:\u003C\u002Fstrong> اگر Thonny باز و به برد وصل است، اول ببندش یا Stop را بزن. پورت مثل گوشی تلفن است: دو نفر هم‌زمان نمی‌توانند با یک گوشی حرف بزنند — یا Thonny به برد وصل است یا Arduino IDE، نه هر دو.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> در منوی Tools، جلوی Board باید «ESP32 Dev Module» و جلوی Port باید همان COM بردت نوشته شده باشد.\u003C\u002Fp>\n",{"kind":33,"heading":40,"html":41},"چالش: هسته‌ی ESP32 چه‌کار می‌کند؟","\u003Ch2 id=\"چالش-هسته‌ی-esp32-چه‌کار-می‌کند\">چالش: هسته‌ی ESP32 چه‌کار می‌کند؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D9%87%D8%B3%D8%AA%D9%87%E2%80%8C%DB%8C-esp32-%DA%86%D9%87%E2%80%8C%DA%A9%D8%A7%D8%B1-%D9%85%DB%8C%E2%80%8C%DA%A9%D9%86%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اگر هسته‌ی ESP32 را نصب نکنیم، چه اتفاقی می‌افتد؟ اول حدس بزن، بعد جواب را باز کن.\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> هسته‌ی ESP32 کامپایلر و ابزار upload مخصوص تراشه‌ی ما را به Arduino IDE اضافه می‌کند. بدون آن، IDE اصلاً ESP32 را نمی‌شناسد؛ اسم بردمان در منوی Board پیدا نمی‌شود و نمی‌توانیم برنامه را برایش ترجمه یا upload کنیم.\u003C\u002Fp>\n",{"kind":23,"heading":43,"html":44},"۳. دو جعبه‌ی جادویی: setup و loop","\u003Ch2 id=\"۳-دو-جعبه‌ی-جادویی-setup-و-loop\">۳. دو جعبه‌ی جادویی: setup و loop\u003Ca class=\"head-anchor\" href=\"#%DB%B3-%D8%AF%D9%88-%D8%AC%D8%B9%D8%A8%D9%87%E2%80%8C%DB%8C-%D8%AC%D8%A7%D8%AF%D9%88%DB%8C%DB%8C-setup-%D9%88-loop\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>از منوی File گزینه‌ی New Sketch را بزن. اوه — صفحه خالی نیست! از قبل چیزی نوشته شده:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">void\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">setup\u003C\u002Fspan>() {\n  \u003Cspan class=\"tok-com\">\u002F\u002F put your setup code here, to run once:\u003C\u002Fspan>\n\n}\n\n\u003Cspan class=\"tok-kw\">void\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">loop\u003C\u002Fspan>() {\n  \u003Cspan class=\"tok-com\">\u002F\u002F put your main code here, to run repeatedly:\u003C\u002Fspan>\n\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>این قالب، بزرگ‌ترین فرق فکری امروز است. در MicroPython برنامه مثل دستور پخت بود: از بالا به پایین اجرا می‌شد و اگر تکرار می‌خواستی، خودت با \u003Ccode>while True\u003C\u002Fcode> حلقه می‌ساختی. دنیای Arduino همان منطق را دارد، فقط از قبل قالب‌بندی‌اش کرده و دو جعبه به تو می‌دهد:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>جعبه‌ی \u003Ccode>setup\u003C\u002Fcode> که \u003Cstrong>فقط یک بار\u003C\u002Fstrong> موقع روشن شدن (یا ریست) برد اجرا می‌شود — جای کارهای آماده‌سازی، مثل معرفی پایه‌ها.\u003C\u002Fli>\n\u003Cli>جعبه‌ی \u003Ccode>loop\u003C\u002Fcode> که بعد از setup، \u003Cstrong>بی‌پایان و پشت‌سرهم\u003C\u002Fstrong> اجرا می‌شود — دقیقاً همان \u003Ccode>while True\u003C\u002Fcode> خودمان، فقط اسم و شکلش فرق دارد!\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>مثل یک مسابقه‌ی دو: setup یعنی بستن بند کفش و گرم کردن — یک بار. loop یعنی دور زدن پیست — تا وقتی برق هست.\u003C\u002Fp>\n\u003Cp>دو چیز ریز دیگر هم در همین قالب می‌بینی. یک: به‌جای تورفتگیِ Python، بدنه‌ی هر بخش بین دو \u003Cstrong>آکولاد\u003C\u002Fstrong> \u003Ccode>{\u003C\u002Fcode> و \u003Ccode>}\u003C\u002Fcode> می‌نشیند — دیوارهای جعبه. دو: کلمه‌ی \u003Ccode>void\u003C\u002Fcode> جلوی اسم‌ها یعنی «این بخش چیزی برنمی‌گرداند» — فعلاً همین‌طور بنویس؛ فصل ۳ که توابع C++ را کامل یاد می‌گیریم، دقیق ادایش می‌کنیم. و یک قانون نقطه‌گذاری تازه: هر \u003Cstrong>دستور\u003C\u002Fstrong> در C++ با \u003Cstrong>سمی‌کالن\u003C\u002Fstrong> \u003Ccode>;\u003C\u002Fcode> تمام می‌شود، مثل نقطه‌ی آخر جمله. امروز فقط رعایتش می‌کنیم؛ فصل بعد کامل مالِ تو می‌شود.\u003C\u002Fp>\n",{"kind":33,"heading":46,"html":47},"چالش: چند بار چشمک؟","\u003Ch2 id=\"چالش-چند-بار-چشمک\">چالش: چند بار چشمک؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%DA%86%D9%86%D8%AF-%D8%A8%D8%A7%D8%B1-%DA%86%D8%B4%D9%85%DA%A9\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اگر چشمک‌زدن LED را به‌جای \u003Ccode>loop\u003C\u002Fcode> داخل \u003Ccode>setup\u003C\u002Fcode> بنویسی، LED چند بار چشمک می‌زند؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> فقط \u003Cstrong>یک بار\u003C\u002Fstrong>. جعبه‌ی \u003Ccode>setup\u003C\u002Fcode> تنها یک بار موقع روشن‌شدن برد اجرا می‌شود. تکرار بی‌پایان کارِ \u003Ccode>loop\u003C\u002Fcode> است — همان‌طور که در MicroPython تکرار کارِ \u003Ccode>while True\u003C\u002Fcode> بود.\u003C\u002Fp>\n",{"kind":23,"heading":49,"html":50},"۴. Blink را به C++ ترجمه کن","\u003Ch2 id=\"۴-blink-را-به-c++-ترجمه-کن\">۴. Blink را به C++ ترجمه کن\u003Ca class=\"head-anchor\" href=\"#%DB%B4-blink-%D8%B1%D8%A7-%D8%A8%D9%87-c%2B%2B-%D8%AA%D8%B1%D8%AC%D9%85%D9%87-%DA%A9%D9%86\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>مدار امروز همان مدار عزیز ترم ۱ است: LED قرمز با مقاومت ۲۲۰ اهم به \u003Cstrong>GPIO 25\u003C\u002Fstrong>. اگر هنوز روی Breadboard داری، هیچ‌چیز را عوض نکن — فقط زبان عوض می‌شود!\u003C\u002Fp>\n\u003Cp>حالا در ویرایشگر تایپ کن — این برنامه‌ی کامل توست (همین کد در \u003Ccode>src\u002Fblink_cpp.ino\u003C\u002Fcode> کنار درس هم هست):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\">\u002F\u002F Term 5 - Session 01 - Blink dar C++ (tarjome-ye blink-e term 1)\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\">\u002F\u002F LED + moghavemat 220 -&gt; GPIO 25 (pin-map-e standard-e dore)\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">void\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">setup\u003C\u002Fspan>() {\n  \u003Cspan class=\"tok-fn\">pinMode\u003C\u002Fspan>(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, OUTPUT);        \u003Cspan class=\"tok-com\">\u002F\u002F pin 25 ra khorooji kon (mesle Pin(25, Pin.OUT))\u003C\u002Fspan>\n}\n\n\u003Cspan class=\"tok-kw\">void\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">loop\u003C\u002Fspan>() {\n  \u003Cspan class=\"tok-fn\">digitalWrite\u003C\u002Fspan>(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, HIGH);     \u003Cspan class=\"tok-com\">\u002F\u002F LED roshan (mesle led.value(1))\u003C\u002Fspan>\n  \u003Cspan class=\"tok-fn\">delay\u003C\u002Fspan>(\u003Cspan class=\"tok-num\">500\u003C\u002Fspan>);                 \u003Cspan class=\"tok-com\">\u002F\u002F 500 millisanie sabr kon (mesle time.sleep(0.5))\u003C\u002Fspan>\n  \u003Cspan class=\"tok-fn\">digitalWrite\u003C\u002Fspan>(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, LOW);      \u003Cspan class=\"tok-com\">\u002F\u002F LED khamush\u003C\u002Fspan>\n  \u003Cspan class=\"tok-fn\">delay\u003C\u002Fspan>(\u003Cspan class=\"tok-num\">500\u003C\u002Fspan>);\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>بیا خط‌به‌خطش را با چیزی که بلدی گره بزنیم:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>pinMode(25, OUTPUT);\u003C\u002Fcode> همان کاری را می‌کند که \u003Ccode>Pin(25, Pin.OUT)\u003C\u002Fcode> می‌کرد: به تراشه می‌گوید پایه‌ی ۲۵ خروجی است. چون آماده‌سازی است، جایش در \u003Ccode>setup\u003C\u002Fcode> است.\u003C\u002Fli>\n\u003Cli>\u003Ccode>digitalWrite(25, HIGH);\u003C\u002Fcode> یعنی پایه‌ی ۲۵ را روشن کن — \u003Ccode>HIGH\u003C\u002Fcode> همان ۱ خودمان است و \u003Ccode>LOW\u003C\u002Fcode> همان ۰.\u003C\u002Fli>\n\u003Cli>\u003Ccode>delay(500);\u003C\u002Fcode> همان \u003Ccode>time.sleep(0.5)\u003C\u002Fcode> است با یک تفاوت موذی: delay به \u003Cstrong>میلی‌ثانیه\u003C\u002Fstrong> کار می‌کند، نه ثانیه! نیم ثانیه یعنی ۵۰۰.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>و راستی دیدی import هم نبود؟ \u003Ccode>pinMode\u003C\u002Fcode> و دوستانش در دنیای Arduino از اول آماده‌اند.\u003C\u002Fp>\n\u003Cp>حالا برنامه را روی برد بفرست، قدم‌به‌قدم:\u003C\u002Fp>\n\u003Col>\n\u003Cli>اول دکمه‌ی \u003Cstrong>تیک ✓\u003C\u002Fstrong> را بزن: compile. بار اول، IDE می‌پرسد هر Sketch باید داخل فولدری هم‌نام خودش باشد؛ OK را بزن تا خودش بسازد.\u003C\u002Fli>\n\u003Cli>پایین صفحه پیام موفقیت می‌آید: چند درصد از حافظه‌ی برنامه استفاده شده.\u003C\u002Fli>\n\u003Cli>حالا دکمه‌ی \u003Cstrong>فلش ←\u003C\u002Fstrong> را بزن: upload. پایین صفحه نگاه کن تا برنامه داخل برد ریخته شود.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cblockquote>\n\u003Cp>⚠️ \u003Cstrong>مواظب باش:\u003C\u002Fstrong> الان روی برد تو فریمور MicroPython و فایل‌های \u003Ccode>main.py\u003C\u002Fcode> نشسته‌اند. دکمه‌ی upload آردوینو، برنامه‌ی C++ را \u003Cstrong>جای همه‌ی این‌ها\u003C\u002Fstrong> می‌نویسد: بعد از upload، دیگر MicroPython روی برد نیست. نترس! چیزی از دست نمی‌رود، چون همه‌ی کدهای دوره را روی کامپیوترت هم داری، و راه برگشت را آخر همین فصل می‌رویم. برد مثل تخته‌سیاه است — می‌شود پاک کرد و دوباره نوشت، هزار بار.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> باید LED روی Breadboard چشمک بزند: نیم‌ثانیه روشن، نیم‌ثانیه خاموش. همین الان اولین برنامه‌ی کامپایلی عمرت را نوشتی، ترجمه کردی و روی سخت‌افزار واقعی اجرا کردی!\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> upload رفت ولی LED چشمک نمی‌زند؟ LED جهت دارد — احتمالاً برعکس است: پایه‌ی بلندش باید از راه مقاومت سمت GPIO 25 باشد و پایه‌ی کوتاهش سمت GND. اگر LED خیلی کم‌نور است و اصلاً چشمک نمی‌زند، احتمالاً به عادت Python نوشته‌ای \u003Ccode>delay(0.5)\u003C\u002Fcode>؛ delay میلی‌ثانیه می‌گیرد، پس بنویس \u003Ccode>delay(500)\u003C\u002Fcode>. و اگر پیام گرفتی \u003Ccode>'digitalwrite' was not declared\u003C\u002Fcode> — C++ هم مثل Python به حروف بزرگ و کوچک حساس است: \u003Ccode>digitalWrite\u003C\u002Fcode> با W بزرگ درست است؛ املای پیشنهادی خود کامپایلر را بپذیر.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>قطعه هنوز به دستت نرسیده؟ نگران نباش — یک نکته‌ی مهم درباره‌ی شبیه‌ساز همین‌جاست:\u003C\u002Fp>\n",{"kind":52,"heading":53,"html":54,"embed":55},"lab","","کد این فصل C++ است و شبیه‌سازِ مرورگر (که فقط MicroPython را اجرا می‌کند) آن را نمی‌فهمد؛ برنامه‌ی C++ را باید در Arduino IDE کامپایل و upload کنی. ولی اگر هنوز قطعه نداری و فقط می‌خواهی همین مدار Blink را ببینی، نسخه‌ی MicroPython همین چشمک (بخش بعد) را در آزمایشگاه اجرا کن","\u002Flab",{"kind":23,"heading":57,"html":58},"۵. دو خطای کلاسیک را عمداً بساز","\u003Ch2 id=\"۵-دو-خطای-کلاسیک-را-عمداً-بساز\">۵. دو خطای کلاسیک را عمداً بساز\u003Ca class=\"head-anchor\" href=\"#%DB%B5-%D8%AF%D9%88-%D8%AE%D8%B7%D8%A7%DB%8C-%DA%A9%D9%84%D8%A7%D8%B3%DB%8C%DA%A9-%D8%B1%D8%A7-%D8%B9%D9%85%D8%AF%D8%A7%D9%8B-%D8%A8%D8%B3%D8%A7%D8%B2\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>طبق سنت دوره، حالا که کار می‌کند، خرابش کنیم — این دو خطا را بالاخره یک روز می‌بینی و بهتر است اولین بار اینجا باشد، نه وسط پروژه.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>خرابکاری اول — پورت غلط:\u003C\u002Fstrong> از منوی Tools یک پورت دیگر انتخاب کن که اصلاً وجود ندارد و upload بزن. چیزی شبیه این می‌بینی:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>A fatal error occurred: Could not open COM7, the port doesn't exist\nFailed uploading: uploading error: exit status 2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>بخوانش: «نتوانستم COM7 را باز کنم — چنین پورتی وجود ندارد.» مثل زدنِ زنگِ خانه‌ای که اصلاً وجود ندارد! رفعش یک کلیک است: Tools بعد Port، پورت درست.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>خرابکاری دوم — برد غلط:\u003C\u002Fstrong> این‌بار پورت درست، ولی از Tools بعد Board به‌جای ESP32 Dev Module عمداً یک برد دیگر (مثلاً Arduino Uno) انتخاب کن. compile شاید حتی رد شود، ولی upload این را می‌دهد:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>avrdude: stk500_recv(): programmer is not responding\nFailed uploading: uploading error: exit status 1\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>این غرغرها یعنی: ابزار upload دارد با زبانِ یک برد دیگر با ESP32 حرف می‌زند و جوابی نمی‌گیرد — انگار به تراشه‌ی ما زبانی بیگانه حرف می‌زند! پیام‌ها هر چه باشد، درمان یکی است و از امروز چک‌لیست همیشگی توست: \u003Cstrong>اول Board، بعد Port، بعد Upload.\u003C\u002Fstrong> برد را برگردان روی ESP32 Dev Module — دوباره سبز.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>خرابکاری سوم — سمی‌کالن جاافتاده:\u003C\u002Fstrong> محبوب‌ترین خطای تازه‌کارهای C++. سمی‌کالن آخرِ \u003Ccode>delay(500);\u003C\u002Fcode> اولی را پاک کن و compile بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>error: expected ';' before 'digitalWrite'\n   11 |   digitalWrite(25, LOW);\n      |   ^~~~~~~~~~~~\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>نفس عمیق — این متن قرمز را با هم بخوانیم، چون خواندن خطای کامپایلر یک مهارت واقعی است. پیام می‌گوید: «قبل از \u003Ccode>digitalWrite\u003C\u002Fcode> انتظار یک \u003Ccode>;\u003C\u002Fcode> داشتم.» نکته‌ی ظریف را ببین: تو سمی‌کالن خط \u003Cstrong>۱۰\u003C\u002Fstrong> را پاک کردی، ولی کامپایلر خط \u003Cstrong>۱۱\u003C\u002Fstrong> را نشان می‌دهد! چرا؟ چون وقتی نقطه‌ی آخر جمله را نگذاری، شنونده تازه وسط جمله‌ی بعدی گیج می‌شود؛ کامپایلر هم جمله‌ی قبلی را ادامه داد تا رسید به جایی که دیگر معنا نداشت. پس قانون طلایی خواندن این خطا: \u003Cstrong>یک خط بالاتر از جای اعلام‌شده را هم نگاه کن.\u003C\u002Fstrong> سمی‌کالن را برگردان — سبز.\u003C\u002Fp>\n",{"kind":33,"heading":60,"html":61},"چالش: اول کدام منو؟","\u003Ch2 id=\"چالش-اول-کدام-منو\">چالش: اول کدام منو؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D8%A7%D9%88%D9%84-%DA%A9%D8%AF%D8%A7%D9%85-%D9%85%D9%86%D9%88\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اگر پیام خطا اسم \u003Ccode>avrdude\u003C\u002Fcode> یا یک برد دیگر را آورد، اول کدام منو را چک می‌کنی؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> اول منوی \u003Cstrong>Board\u003C\u002Fstrong> (از Tools). پیامِ \u003Ccode>avrdude\u003C\u002Fcode> یا اسم بردِ غریبه یعنی IDE فکر می‌کند دارد با تراشه‌ی دیگری حرف می‌زند. چک‌لیست همیشگی: اول Board، بعد Port، بعد Upload.\u003C\u002Fp>\n",{"kind":23,"heading":63,"html":64},"۶. یک برد، دو دنیا","\u003Ch2 id=\"۶-یک-برد-دو-دنیا\">۶. یک برد، دو دنیا\u003Ca class=\"head-anchor\" href=\"#%DB%B6-%DB%8C%DA%A9-%D8%A8%D8%B1%D8%AF-%D8%AF%D9%88-%D8%AF%D9%86%DB%8C%D8%A7\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>حالا که هر دو نسخه‌ی Blink را دیده‌ای، بیا کنار هم بگذاریمشان — این جدول را در دفترچه‌ی مهندسی‌ات هم بکش، بهترین برگه‌ی تقلبِ حلال این ترم است:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>کار\u003C\u002Fth>\n\u003Cth>MicroPython (ترم ۱)\u003C\u002Fth>\n\u003Cth>C++ (این فصل)\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>آماده کردن ابزار پایه‌ها\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>from machine import Pin\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>لازم نیست — از اول آماده است\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>پایه ۲۵ = خروجی\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>led = Pin(25, Pin.OUT)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>pinMode(25, OUTPUT);\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>روشن کردن\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>led.value(1)\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>digitalWrite(25, HIGH);\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>صبر نیم‌ثانیه\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>time.sleep(0.5)\u003C\u002Fcode> — ثانیه\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>delay(500);\u003C\u002Fcode> — میلی‌ثانیه!\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>تکرار بی‌پایان\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>while True:\u003C\u002Fcode> + تورفتگی\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>void loop() { }\u003C\u002Fcode> + آکولاد\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>پایان هر دستور\u003C\u002Ftd>\n\u003Ctd>رفتن به خط بعد\u003C\u002Ftd>\n\u003Ctd>سمی‌کالن \u003Ccode>;\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>می‌بینی؟ شش خط، شش ترجمه. هیچ فکرِ تازه‌ای اینجا نیست — فقط لهجه عوض شده. برای مقایسه، نسخه‌ی کامل MicroPython همان چشمک این است (از ترم ۱، همان که در آزمایشگاه اجرا می‌شود):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 1 - Session 05 - blink (nosakhe MicroPython baraye moghayese)\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> time\n\nled = Pin(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, Pin.OUT)\n\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>:\n    led.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">0.5\u003C\u002Fspan>)\n    led.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">0.5\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>و حالا راه برگشت — قولی که دادم. هر وقت خواستی به MicroPython برگردی، Arduino IDE را ببند، Thonny را باز کن و همان مسیر ترم ۱، فصل ۴ را برو: فلش کردن فریمور MicroPython روی برد. دو-سه دقیقه بعد، REPL برمی‌گردد، انگار نه انگار. پس خیالت راحت: هر وقت خواستی MicroPython، فلش کن؛ هر وقت خواستی C++، از آردوینو upload کن. یک برد، دو دنیا — و کلید هر دو دست توست.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.160.webp 160w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.320.webp 320w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.640.webp 640w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.1280.jpg\" srcset=\"\u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.160.jpg 160w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.320.jpg 320w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.640.jpg 640w, \u002F_img\u002F05-image-firmware-two-worlds.dc19007eaa.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"یک برد ESP32 در وسط مثل جزیره‌ای بین دو دروازه: دروازه‌ی آبی MicroPython با فلش «فلش فریمور» و دروازه‌ی نارنجی C++\u002FArduino با فلش «upload اسکچ»، و فلش‌های دوطرفه بالای تصویر که یعنی هر وقت خواستی بین دو دنیا رفت‌وآمد کن\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n",{"kind":23,"heading":66,"html":67},"واژه‌های تازه این فصل","\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>C++\u003C\u002Ftd>\n\u003Ctd>سی پلاس پلاس\u003C\u002Ftd>\n\u003Ctd>زبان دوم ما — کامپایلی و سریع، زبان دنیای Arduino\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Arduino IDE\u003C\u002Ftd>\n\u003Ctd>آردوینو آی‌دی‌ئی\u003C\u002Ftd>\n\u003Ctd>محیط نوشتن، compile و upload برنامه‌های C++\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Compile\u003C\u002Ftd>\n\u003Ctd>کامپایل\u003C\u002Ftd>\n\u003Ctd>ترجمه‌ی یک‌باره‌ی کل برنامه به زبان تراشه، روی کامپیوتر\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Upload\u003C\u002Ftd>\n\u003Ctd>آپلود\u003C\u002Ftd>\n\u003Ctd>فرستادن برنامه‌ی ترجمه‌شده داخل برد\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Sketch\u003C\u002Ftd>\n\u003Ctd>اسکچ\u003C\u002Ftd>\n\u003Ctd>اسم هر برنامه در دنیای Arduino\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>setup\u003C\u002Ftd>\n\u003Ctd>سِت‌آپ\u003C\u002Ftd>\n\u003Ctd>تابعی که فقط یک بار موقع روشن شدن برد اجرا می‌شود\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>loop\u003C\u002Ftd>\n\u003Ctd>لوپ\u003C\u002Ftd>\n\u003Ctd>تابعی که بی‌پایان تکرار می‌شود — همان \u003Ccode>while True\u003C\u002Fcode> خودمان\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Semicolon\u003C\u002Ftd>\n\u003Ctd>سمی‌کالن\u003C\u002Ftd>\n\u003Ctd>علامت \u003Ccode>;\u003C\u002Fcode> — نقطه‌ی پایان هر دستور C++\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",{"kind":33,"heading":69,"html":70},"تمرین‌ها","\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>اول چک‌لیست پایان فصل: Arduino IDE و هسته‌ی ESP32 نصب است؛ Blink را به C++ ترجمه، compile و upload کرده‌ای و LED چشمک می‌زند؛ هر دو خطای پورت\u002Fبرد و سمی‌کالن را دیده و رفع کرده‌ای؛ و راه برگشت به MicroPython را بلدی. اگر همه بله است، برو سراغ تمرین‌ها:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>تمرین اجباری:\u003C\u002Fstrong> چراغ راهنمایی ترم ۱ را به C++ ترجمه کن (\u003Ccode>traffic_cpp.ino\u003C\u002Fcode>): سه LED روی GPIO 25 و 26 و 27؛ قرمز دو ثانیه، سبز دو ثانیه، زرد سه چشمک کوتاه — همه فقط با \u003Ccode>pinMode\u003C\u002Fcode>، \u003Ccode>digitalWrite\u003C\u002Fcode> و \u003Ccode>delay\u003C\u002Fcode>. نکته‌ی صادقانه: چون هنوز حلقه‌ی \u003Ccode>for\u003C\u002Fcode> در C++ نخوانده‌ایم، سه چشمکِ زرد را مجبوری سه بار بنویسی — همان دردی که ترم ۱ قبل از یادگیری حلقه داشتی! فصل ۳ درمانش می‌رسد. در دفترچه‌ی مهندسی بنویس کدام خط‌ها عیناً تکرار شدند.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تمرین ستاره‌دار ⭐:\u003C\u002Fstrong> برنامه‌ی «ضربان قلب» بساز: دو چشمک کوتاه پشت هم، بعد یک مکث بلند — فقط با \u003Ccode>digitalWrite\u003C\u002Fcode> و \u003Ccode>delay\u003C\u002Fcode> (حواست به میلی‌ثانیه باشد!). آن را یک بار به C++ و یک بار به MicroPython بنویس (\u003Ccode>heartbeat_cpp.ino\u003C\u002Fcode> و \u003Ccode>heartbeat.py\u003C\u002Fcode>) و در دفترچه یک جدول دو ستونه بساز که هر خط را جلوی معادلش می‌گذارد. کدام نسخه خط بیشتری دارد؟ چرا؟\u003C\u002Fli>\n\u003C\u002Ful>\n",{"kind":23,"heading":72,"html":73},"در فصل بعد","\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> خورده، ماجرای کامل سمی‌کالن و آکولاد، و اینکه برد چطور با Serial با ما حرف می‌زند. پروژه‌ی دکمه و LED ترم ۱ را هم کامل به C++ ترجمه می‌کنیم — و دو غافلگیری می‌بینی که شاید باورت نشود: یک تقسیمِ ساده که در C++ جواب دیگری می‌دهد، و یک اشتباه تایپی که Python جلویش را می‌گرفت ولی C++ بی‌صدا اجرایش می‌کند!\u003C\u002Fp>\n",{"course":75,"entitled":12,"lessons":83,"payments_enabled":12,"terms":252,"live":5},{"active_window":76,"effective_price_toman":77,"free":5,"lesson_count":78,"price_toman":79,"slug":80,"summary_fa":81,"title_fa":82},null,0,56,1500000,"airo","خودآموز رباتیک برای ۱۲ تا ۱۵ ساله‌ها: از اولین LED تا ربات متصل به هوش مصنوعی، با ESP32 و MicroPython.","آیرو — خودآموز رباتیک",[84,87,90,94,97,100,104,108,112,116,120,123,127,130,133,136,139,142,145,148,151,154,157,159,162,165,168,171,174,177,180,183,186,189,192,195,198,201,204,207,210,213,216,219,222,223,224,225,228,231,234,237,240,243,246,249],{"free_preview":5,"order":6,"slug":85,"source":8,"term":6,"title_fa":86},"t1-s01-meet-robots","فصل ۱ — دنیای ربات‌ها و جعبه‌ابزار ما",{"free_preview":12,"order":18,"slug":88,"source":8,"term":6,"title_fa":89},"t1-s02-electricity-first-circuit","فصل ۲ — برق و اولین مدار",{"free_preview":12,"order":91,"slug":92,"source":8,"term":6,"title_fa":93},3,"t1-s03-breadboard-mastery","فصل ۳ — تسلط بر Breadboard",{"free_preview":12,"order":15,"slug":95,"source":8,"term":6,"title_fa":96},"t1-s04-esp32-setup","فصل ۴ — آشنایی با ESP32 و راه‌اندازی",{"free_preview":12,"order":9,"slug":98,"source":8,"term":6,"title_fa":99},"t1-s05-first-code-blink","فصل ۵ — اولین برنامه: چشمک‌زن",{"free_preview":12,"order":101,"slug":102,"source":8,"term":6,"title_fa":103},6,"t1-s06-variables","فصل ۶ — متغیرها: حافظهٔ برنامه",{"free_preview":12,"order":105,"slug":106,"source":8,"term":6,"title_fa":107},7,"t1-s07-loops","فصل ۷ — حلقه‌ها: قدرت تکرار",{"free_preview":12,"order":109,"slug":110,"source":8,"term":6,"title_fa":111},8,"t1-s08-button-input","فصل ۸ — ورودی دیجیتال: دکمه",{"free_preview":12,"order":113,"slug":114,"source":8,"term":6,"title_fa":115},9,"t1-s09-logic","فصل ۹ — منطق و تصمیم‌های ترکیبی",{"free_preview":12,"order":117,"slug":118,"source":8,"term":6,"title_fa":119},10,"t1-s10-buzzer-pwm-tone","فصل ۱۰ — صدا: Buzzer و اولین PWM",{"free_preview":12,"order":13,"slug":121,"source":8,"term":6,"title_fa":122},"t1-s11-term-project-build","فصل ۱۱ — پروژه ترم: چراغ راهنمایی هوشمند — ساخت",{"free_preview":12,"order":124,"slug":125,"source":8,"term":6,"title_fa":126},12,"t1-s12-term-project-upgrade","فصل ۱۲ — پروژه ترم: ارتقا و نمایش",{"free_preview":5,"order":6,"slug":128,"source":8,"term":18,"title_fa":129},"t2-s01-functions","فصل ۱ — توابع: کارخانه‌های کوچک کد",{"free_preview":12,"order":18,"slug":131,"source":8,"term":18,"title_fa":132},"t2-s02-pwm-dimming","فصل ۲ — PWM کامل: کنترل روشنایی",{"free_preview":12,"order":91,"slug":134,"source":8,"term":18,"title_fa":135},"t2-s03-adc-potentiometer","فصل ۳ — ورودی آنالوگ: پتانسیومتر",{"free_preview":12,"order":15,"slug":137,"source":8,"term":18,"title_fa":138},"t2-s04-ldr-night-light","فصل ۴ — سنسور نور و چراغ خودکار",{"free_preview":12,"order":9,"slug":140,"source":8,"term":18,"title_fa":141},"t2-s05-lists-data","فصل ۵ — لیست‌ها و داده‌ها",{"free_preview":12,"order":101,"slug":143,"source":8,"term":18,"title_fa":144},"t2-s06-dht11-library","فصل ۶ — دما و رطوبت: کتابخانه‌ها",{"free_preview":12,"order":105,"slug":146,"source":8,"term":18,"title_fa":147},"t2-s07-oled-display","فصل ۷ — نمایشگر OLED",{"free_preview":12,"order":109,"slug":149,"source":8,"term":18,"title_fa":150},"t2-s08-servo","فصل ۸ — Servo: اولین حرکت",{"free_preview":12,"order":113,"slug":152,"source":8,"term":18,"title_fa":153},"t2-s09-ultrasonic","فصل ۹ — سنسور فاصله HC-SR04",{"free_preview":12,"order":117,"slug":155,"source":8,"term":18,"title_fa":156},"t2-s10-term-project-build","فصل ۱۰ — پروژه ترم: ایستگاه هواشناسی رومیزی — ساخت",{"free_preview":12,"order":13,"slug":158,"source":8,"term":18,"title_fa":16},"t2-s11-term-project-upgrade",{"free_preview":5,"order":6,"slug":160,"source":8,"term":91,"title_fa":161},"t3-s01-robot-anatomy","فصل ۱ — آناتومی ربات متحرک",{"free_preview":12,"order":18,"slug":163,"source":8,"term":91,"title_fa":164},"t3-s02-motor-driver","فصل ۲ — چرخاندن موتور با L298N",{"free_preview":12,"order":91,"slug":166,"source":8,"term":91,"title_fa":167},"t3-s03-chassis-assembly","فصل ۳ — مونتاژ ربات و توابع حرکت",{"free_preview":12,"order":15,"slug":169,"source":8,"term":91,"title_fa":170},"t3-s04-calibration-choreography","فصل ۴ — کالیبراسیون و رقص ربات",{"free_preview":12,"order":9,"slug":172,"source":8,"term":91,"title_fa":173},"t3-s05-ultrasonic-brake","فصل ۵ — چشم ربات: ترمز خودکار",{"free_preview":12,"order":101,"slug":175,"source":8,"term":91,"title_fa":176},"t3-s06-obstacle-avoidance","فصل ۶ — ربات دوری‌گزین",{"free_preview":12,"order":105,"slug":178,"source":8,"term":91,"title_fa":179},"t3-s07-line-sensors","فصل ۷ — خواندن خط",{"free_preview":12,"order":109,"slug":181,"source":8,"term":91,"title_fa":182},"t3-s08-line-follower","فصل ۸ — دنبال‌کننده خط",{"free_preview":12,"order":113,"slug":184,"source":8,"term":91,"title_fa":185},"t3-s09-better-line-follower","فصل ۹ — دنبال‌کننده بهتر: کنترل P",{"free_preview":12,"order":117,"slug":187,"source":8,"term":91,"title_fa":188},"t3-s10-term-project-build","فصل ۱۰ — پروژه ترم: ربات ماموریت — ساخت",{"free_preview":12,"order":13,"slug":190,"source":8,"term":91,"title_fa":191},"t3-s11-term-project-run","فصل ۱۱ — پروژه ترم: اجرای ماموریت و نمایش",{"free_preview":5,"order":6,"slug":193,"source":8,"term":15,"title_fa":194},"t4-s01-wifi-basics","فصل ۱ — شبکه به زبان آدمیزاد و اتصال به WiFi",{"free_preview":12,"order":18,"slug":196,"source":8,"term":15,"title_fa":197},"t4-s02-http-requests","فصل ۲ — گرفتن داده از اینترنت",{"free_preview":12,"order":91,"slug":199,"source":8,"term":15,"title_fa":200},"t4-s03-web-server-led","فصل ۳ — وب‌سرور: کنترل LED از گوشی",{"free_preview":12,"order":15,"slug":202,"source":8,"term":15,"title_fa":203},"t4-s04-sensor-dashboard","فصل ۴ — داشبورد وب سنسورها",{"free_preview":12,"order":9,"slug":205,"source":8,"term":15,"title_fa":206},"t4-s05-robot-web-remote","فصل ۵ — ریموت وب: ربات را با گوشی بران",{"free_preview":12,"order":101,"slug":208,"source":8,"term":15,"title_fa":209},"t4-s06-json-apikeys","فصل ۶ — JSON و کلید API: زبان داده‌ها و کلیدِ درها",{"free_preview":12,"order":105,"slug":211,"source":8,"term":15,"title_fa":212},"t4-s07-first-ai-call","فصل ۷ — اولین تماس با AI: الگوی پل",{"free_preview":12,"order":109,"slug":214,"source":8,"term":15,"title_fa":215},"t4-s08-ai-sensor-assistant","فصل ۸ — دستیار سنسوری هوشمند",{"free_preview":12,"order":113,"slug":217,"source":8,"term":15,"title_fa":218},"t4-s09-esp32-direct-ai","فصل ۹ — وقتی برد خودش با AI حرف می‌زند",{"free_preview":12,"order":117,"slug":220,"source":8,"term":15,"title_fa":221},"t4-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":91,"slug":226,"source":8,"term":9,"title_fa":227},"t5-s03-cpp-functions-speed","فصل ۳ — توابع C++ و آزمون سرعت",{"free_preview":12,"order":15,"slug":229,"source":8,"term":9,"title_fa":230},"t5-s04-pid-line-follower","فصل ۴ — کنترل PID برای دنبال‌کننده خط",{"free_preview":12,"order":9,"slug":232,"source":8,"term":9,"title_fa":233},"t5-s05-mpu6050","فصل ۵ — حس تعادل: MPU6050",{"free_preview":12,"order":101,"slug":235,"source":8,"term":9,"title_fa":236},"t5-s06-bluetooth-control","فصل ۶ — کنترل Bluetooth با گوشی",{"free_preview":12,"order":105,"slug":238,"source":8,"term":9,"title_fa":239},"t5-s07-engineering-process","فصل ۷ — فرایند مهندسی پروژهٔ نهایی",{"free_preview":12,"order":109,"slug":241,"source":8,"term":9,"title_fa":242},"t5-s08-capstone-skeleton","فصل ۸ — پروژهٔ نهایی ۱: اسکلت",{"free_preview":12,"order":113,"slug":244,"source":8,"term":9,"title_fa":245},"t5-s09-capstone-features","فصل ۹ — پروژهٔ نهایی، بخش دوم: قابلیت‌ها",{"free_preview":12,"order":117,"slug":247,"source":8,"term":9,"title_fa":248},"t5-s10-capstone-debug","فصل ۱۰ — پروژهٔ نهایی، بخش سوم: رفعِ اشکال و پایداری",{"free_preview":12,"order":13,"slug":250,"source":8,"term":9,"title_fa":251},"t5-s11-graduation","فصل ۱۱ — فارغ‌التحصیلی: نمایشِ نهایی و مسیرِ آینده",[],1784827104574]