[{"data":1,"prerenderedAt":255},["ShallowReactive",2],{"lesson:t2-s01-functions":3,"course:airo":74},{"meta":4,"prev":11,"next":16,"sections":19},{"free_preview":5,"order":6,"slug":7,"source":8,"term":9,"title_fa":10},true,1,"t2-s01-functions","book",2,"فصل ۱ — توابع: کارخانه‌های کوچک کد",{"free_preview":12,"order":13,"slug":14,"source":8,"term":6,"title_fa":15},false,12,"t1-s12-term-project-upgrade","فصل ۱۲ — پروژه ترم: ارتقا و نمایش",{"free_preview":12,"order":9,"slug":17,"source":8,"term":9,"title_fa":18},"t2-s02-pwm-dimming","فصل ۲ — PWM کامل: کنترل روشنایی",[20,24,27,30,33,36,41,45,48,51,54,57,59,62,65,68,71],{"kind":21,"heading":22,"html":23},"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>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.160.webp 160w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.320.webp 320w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.640.webp 640w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.1280.jpg\" srcset=\"\u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.160.jpg 160w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.320.jpg 320w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.640.jpg 640w, \u002F_img\u002F03-image-spaghetti-vs-functions.d11aa3b400.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"مقایسهٔ دو دنیا: سمتی بشقاب اسپاگتی از روبان‌های درهم کد که روی پنجرهٔ ویرایشگر ریخته، و سمت دیگر همان روبان‌ها مرتب‌شده در چهار جعبهٔ کارخانه‌ای کوچک با خط‌های تمیز بینشان\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>آخر این فصل می‌توانی:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>با \u003Ccode>def\u003C\u002Fcode> یک تابع تعریف کنی، با پرانتز صدایش بزنی و فرق «تعریف کردن» و «اجرا شدن» را توضیح بدهی.\u003C\u002Fli>\n\u003Cli>به تابع پارامتر بدهی و تابع \u003Ccode>blink\u003C\u002Fcode> با سه پارامتر (کدام LED، چند بار، با چه سرعتی) بنویسی.\u003C\u002Fli>\n\u003Cli>با \u003Ccode>return\u003C\u002Fcode> از تابع جواب بگیری و بگویی چرا \u003Ccode>return\u003C\u002Fcode> به‌تنهایی چیزی چاپ نمی‌کند.\u003C\u002Fli>\n\u003Cli>کد شلوغ را به چند تابع کوچک سازمان بدهی و از ترکیبشان ریموت یک‌دکمه‌ای بسازی.\u003C\u002Fli>\n\u003Cli>سه خطای معروف دنیای توابع (دونقطهٔ فراموش‌شده، صدا زدن قبل از تعریف، پرانتز جاافتاده) را بشناسی و خودت رفعشان کنی.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"kind":21,"heading":25,"html":26},"قبل از شروع: چک‌لیست پیش‌نیاز","\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> مدار LED با مقاومت ۲۲۰ اهم را روی Breadboard می‌بندی و با \u003Ccode>machine.Pin\u003C\u002Fcode> و \u003Ccode>time.sleep\u003C\u002Fcode> کنترلش می‌کنی.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۶:\u003C\u002Fstrong> با متغیر، انواع int\u002Ffloat\u002Fstr و \u003Ccode>print\u003C\u002Fcode> با f-string راحتی.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۷:\u003C\u002Fstrong> حلقه‌های \u003Ccode>while True\u003C\u002Fcode> و \u003Ccode>for i in range(...)\u003C\u002Fcode> را می‌نویسی و تورفتگی را رعایت می‌کنی.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۸ و ۹:\u003C\u002Fstrong> دکمه با pull-up داخلی (فشرده = ۰)، \u003Ccode>if\u002Felse\u003C\u002Fcode> و debounce ساده.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>از ترم ۱، فصل ۱۰:\u003C\u002Fstrong> Buzzer را با PWM در حد tone کنترل می‌کنی: \u003Ccode>freq()\u003C\u002Fcode> برای زیر و بمی، \u003Ccode>duty(512)\u003C\u002Fcode> روشن و \u003Ccode>duty(0)\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 بزرگ\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>دو Breadboard کوچک کنار هم\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LED قرمز \u002F زرد \u002F سبز\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>دکمهٔ فشاری (Push button)\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>دو سر یک سیم جامپر را لحظه‌ای به هم بزن\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Buzzer پسیو\u003C\u002Ftd>\n\u003Ctd>۱\u003C\u002Ftd>\n\u003Ctd>بدون آن، بخش‌های صدا را فقط بخوان\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>سیم جامپر\u003C\u002Ftd>\n\u003Ctd>حدود ۱۰\u003C\u002Ftd>\n\u003Ctd>—\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",{"kind":21,"heading":28,"html":29},"۱. امتحان ورودی: سه پیش‌بینی","\u003Ch2 id=\"۱-امتحان-ورودی-سه-پیش‌بینی\">۱. امتحان ورودی: سه پیش‌بینی\u003Ca class=\"head-anchor\" href=\"#%DB%B1-%D8%A7%D9%85%D8%AA%D8%AD%D8%A7%D9%86-%D9%88%D8%B1%D9%88%D8%AF%DB%8C-%D8%B3%D9%87-%D9%BE%DB%8C%D8%B4%E2%80%8C%D8%A8%DB%8C%D9%86%DB%8C\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>قبل از هر چیز جدید، یک بازی — اسمش را گذاشته‌ایم «امتحان ورودی ترم ۲»، ولی نترس: نمره ندارد و به سبک مسابقه است. سه قطعه کد از ترم ۱ می‌بینی. قانون بازی: قبل از خواندن جواب، دستت را روی آن بگذار و بلند بگو این کد چه می‌کند.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.160.webp 160w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.320.webp 320w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.640.webp 640w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.1280.jpg\" srcset=\"\u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.160.jpg 160w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.320.jpg 320w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.640.jpg 640w, \u002F_img\u002F01-image-entry-quiz-arcade.84dbbdefb1.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"صحنهٔ مسابقهٔ بازی‌های قدیمی: سه پنل جواب درخشان کنار هم روی پس‌زمینهٔ سرمه‌ای با خط‌های مدار و ستاره‌های پیکسلی\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>قطعهٔ اول:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> machine\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nled = machine.Pin(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, machine.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\">1\u003C\u002Fspan>)\n    led.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>پیش‌بینی‌ات چیست؟\u003C\u002Fp>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> LED روی پایهٔ ۲۵ یک ثانیه روشن و یک ثانیه خاموش می‌شود و چون \u003Ccode>while True\u003C\u002Fcode> هیچ‌وقت تمام نمی‌شود، این چشمک تا ابد ادامه دارد. درست گفتی؟ یعنی فصل‌های ۵ و ۷ ترم ۱ سر جایشان‌اند.\u003C\u002Fp>\n\u003Cp>قطعهٔ دوم کمی موذی‌تر است:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> machine\n\nbutton = machine.Pin(\u003Cspan class=\"tok-num\">32\u003C\u002Fspan>, machine.Pin.IN, machine.Pin.PULL_UP)\nled = machine.Pin(\u003Cspan class=\"tok-num\">27\u003C\u002Fspan>, machine.Pin.OUT)\n\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>:\n    \u003Cspan class=\"tok-kw\">if\u003C\u002Fspan> button.value() == \u003Cspan class=\"tok-num\">0\u003C\u002Fspan>:\n        led.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-kw\">else\u003C\u002Fspan>:\n        led.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>سؤال: LED سبز کی روشن می‌شود — وقتی دکمه را فشار می‌دهیم یا وقتی رها می‌کنیم؟\u003C\u002Fp>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> وقتی فشار می‌دهیم! این همان تلهٔ معروف pull-up داخلی است: در حالت عادی پایه عدد ۱ را می‌خواند و فشردن دکمه آن را به ۰ می‌رساند؛ پس شرط \u003Ccode>== 0\u003C\u002Fcode> یعنی «دکمه فشرده شده». اگر برعکس گفتی، اشکالی ندارد — ده دقیقه فصل ۸ ترم ۱ را مرور کن.\u003C\u002Fp>\n\u003Cp>و قطعهٔ سوم، خاطره‌انگیزترینش:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> machine\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nbuzzer = machine.PWM(machine.Pin(\u003Cspan class=\"tok-num\">4\u003C\u002Fspan>))\nnotes = [\u003Cspan class=\"tok-num\">262\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">330\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">392\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">523\u003C\u002Fspan>]\n\n\u003Cspan class=\"tok-kw\">for\u003C\u002Fspan> n \u003Cspan class=\"tok-kw\">in\u003C\u002Fspan> notes:\n    buzzer.freq(n)\n    buzzer.duty(\u003Cspan class=\"tok-num\">512\u003C\u002Fspan>)\n    time.sleep(\u003Cspan class=\"tok-num\">0.3\u003C\u002Fspan>)\n\nbuzzer.duty(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> جعبهٔ نت‌های فصل ۱۰ ترم ۱: چهار نت پشت سر هم پخش می‌شوند — دو، می، سل، دویِ بالا — و آخرش \u003Ccode>duty(0)\u003C\u002Fcode> صدا را قطع می‌کند. راستی آن عدد ۵۱۲ را می‌بینی؟ ترم قبل قول دادیم یک روز رازش را بگوییم. آن روز فصل بعد است؛ فعلاً همین‌قدر بدان که ۵۱۲ عدد جادویی نیست — یک راز شیرین دارد.\u003C\u002Fp>\n\u003Cp>هر سه را درست گفتی؟ امتحان ورودی را با نمرهٔ کامل پاس شدی. یکی دو تا اشتباه؟ هیچ اتفاق بدی نیفتاده — فقط حالا می‌دانی کدام فصل ترم ۱ را مرور کنی.\u003C\u002Fp>\n\u003Cp>و این هم بازیگرهای جدید این ترم — فقط برای آشنایی، چون امروز به هیچ‌کدامشان دست نمی‌زنیم:\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.160.webp 160w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.320.webp 320w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.640.webp 640w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.1280.jpg\" srcset=\"\u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.160.jpg 160w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.320.jpg 320w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.640.jpg 640w, \u002F_img\u002F02-image-term2-kit-lineup.65ee5ececc.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"شش قطعهٔ کیت ترم ۲ روی میز، هر کدام در کارت خودش: پتانسیومتر چرخان، سنسور نور LDR، ماژول آبی دما و رطوبت DHT11، نمایشگر کوچک OLED، موتور Servo با پره‌های سفید و سنسور فاصلهٔ دوچشمی\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>یک ولوم چرخان، یک سنسور نور، یک سنسور دما و رطوبت، یک نمایشگر کوچک، یک موتور که زاویه می‌فهمد و یک سنسور فاصله که مثل خفاش کار می‌کند. فهرست کامل کیت ترم ۲ و جایگزین‌های ارزان‌تر در فایل معرفی ترم آمده — با خانواده تصمیم بگیرید.\u003C\u002Fp>\n",{"kind":21,"heading":31,"html":32},"۲. تابع چیست؟ درد اسپاگتی و ایدهٔ کارخانه","\u003Ch2 id=\"۲-تابع-چیست-درد-اسپاگتی-و-ایدهٔ-کارخانه\">۲. تابع چیست؟ درد اسپاگتی و ایدهٔ کارخانه\u003Ca class=\"head-anchor\" href=\"#%DB%B2-%D8%AA%D8%A7%D8%A8%D8%B9-%DA%86%DB%8C%D8%B3%D8%AA-%D8%AF%D8%B1%D8%AF-%D8%A7%D8%B3%D9%BE%D8%A7%DA%AF%D8%AA%DB%8C-%D9%88-%D8%A7%DB%8C%D8%AF%D9%87%D9%94-%DA%A9%D8%A7%D8%B1%D8%AE%D8%A7%D9%86%D9%87\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>بگذار از یک درد شروع کنیم. پروژهٔ چراغ راهنمایی ترم ۱ را یادت هست؟ کدش کار می‌کرد، ولی یک مشکل بزرگ داشت: همه‌چیز پشت سر هم ریخته شده بود. چشمک‌زدن LED را سه جای مختلف کپی کرده بودیم؛ بوق زدن را دو جا. به این می‌گویند کد اسپاگتی — مثل بشقاب ماکارونی که نمی‌دانی هر رشته از کجا شروع شده. اگر بخواهی سرعت چشمک را عوض کنی، باید سه جا را پیدا و اصلاح کنی — و احتمالاً یکی را جا می‌اندازی.\u003C\u002Fp>\n\u003Cp>راه‌حل چیزی است به اسم function — تابع. تابع مثل یک کارخانهٔ کوچک است: یک بار می‌سازیش، بعد هر وقت خواستی فقط دکمه‌اش را می‌زنی.\u003C\u002Fp>\n\u003Cp>دو مثال از زندگی خودت. اول، ماشین آبمیوه‌گیری: یک بار طرز کارش ساخته شده؛ تو فقط میوه می‌ریزی و دکمه را می‌زنی. لازم نیست هر بار از اول موتور و تیغه اختراع کنی. دوم، مخصوص گیمرها: دکمهٔ کمبو. در خیلی از بازی‌ها می‌توانی یک حرکت ترکیبی — پرش، چرخش، ضربه — را یک بار تعریف کنی و روی یک دکمه بگذاری. از آن به بعد، یک دکمه یعنی کل حرکت. تابع دقیقاً همین است: \u003Cstrong>یک بار تعریف می‌کنی، بعد با یک اسم صدایش می‌زنی.\u003C\u002Fstrong>\u003C\u002Fp>\n",{"kind":21,"heading":34,"html":35},"۳. اولین تابع: def و صدا زدن","\u003Ch2 id=\"۳-اولین-تابع-def-و-صدا-زدن\">۳. اولین تابع: def و صدا زدن\u003Ca class=\"head-anchor\" href=\"#%DB%B3-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D8%AA%D8%A7%D8%A8%D8%B9-def-%D9%88-%D8%B5%D8%AF%D8%A7-%D8%B2%D8%AF%D9%86\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>Thonny را باز کن و یک فایل جدید بساز — برای این تمرین حتی سخت‌افزار هم لازم نیست. می‌خواهیم بنویسیم \u003Ccode>def say_hello():\u003C\u002Fcode>. سه چیز در این خط هست:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>def\u003C\u002Fcode> — مخفف define یعنی «تعریف کن». داریم به پایتون می‌گوییم: می‌خواهم یک کارخانهٔ جدید بسازم.\u003C\u002Fli>\n\u003Cli>اسم تابع، \u003Ccode>say_hello\u003C\u002Fcode> — اسم را ما انتخاب می‌کنیم، مثل اسم متغیر: انگلیسی، بدون فاصله.\u003C\u002Fli>\n\u003Cli>پرانتز باز و بسته و بعد دونقطه. پرانتز فعلاً خالی است — بخش بعد می‌فهمی برای چیست — و دونقطه یعنی «بدنهٔ این تابع از خط بعد شروع می‌شود». درست مثل \u003Ccode>if\u003C\u002Fcode> و \u003Ccode>while\u003C\u002Fcode> و \u003Ccode>for\u003C\u002Fcode> که هر سه دونقطه داشتند. و مثل همان‌ها، بدنهٔ تابع باید تورفتگی داشته باشد.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>ولی قبل از نسخهٔ درست، خودت یک خرابکاری عمدی بکن که همهٔ ما حداقل صد بار انجامش می‌دهیم: دونقطه را ننویس و Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> say_hello()\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;Salam! Man yek tabe hastam&quot;\u003C\u002Fspan>)\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>Traceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1\nSyntaxError: invalid syntax\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>SyntaxError\u003C\u002Fcode> را از ترم ۱ می‌شناسی: «جمله‌ات از نظر دستور زبان غلط است.» پایتون حتی شماره خط را هم گفته. قانون طلایی: هر خطی که با \u003Ccode>def\u003C\u002Fcode> شروع می‌شود، مثل \u003Ccode>if\u003C\u002Fcode> و \u003Ccode>for\u003C\u002Fcode>، حتماً با دونقطه تمام می‌شود. دونقطه را اضافه کن و دوباره Run بزن.\u003C\u002Fp>\n\u003Cp>اجرا شد و... هیچ اتفاقی نیفتاد! نه خطا، نه پیغام سلام. چرا؟\u003C\u002Fp>\n\u003Cp>این مهم‌ترین نکتهٔ فصل است: \u003Cstrong>تعریف کردنِ تابع با اجرا کردنش فرق دارد.\u003C\u002Fstrong> \u003Ccode>def\u003C\u002Fcode> فقط کارخانه را می‌سازد؛ کارخانه تا وقتی سفارشی نیاید، تولیدی ندارد. مثل ذخیره‌کردن شمارهٔ یک دوست در گوشی: شماره را ذخیره کرده‌ای، ولی تا زنگ نزنی، تماسی برقرار نمی‌شود.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.160.webp 160w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.320.webp 320w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.640.webp 640w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.1280.jpg\" srcset=\"\u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.160.jpg 160w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.320.jpg 320w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.640.jpg 640w, \u002F_img\u002F05-image-define-vs-call-phone.ce53b9bff7.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"دو گوشی کنار هم: در یکی کارت مخاطب فقط ذخیره می‌شود و گوشی ساکت است، در دیگری همان مخاطب واقعاً در حال تماس گرفته شدن است و گوشی می‌درخشد و زنگ می‌خورد\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cp>برای زنگ زدن به تابع، اسمش را با پرانتز می‌نویسیم: \u003Ccode>say_hello()\u003C\u002Fcode>. به این کار می‌گوییم call — صدا زدن. برنامهٔ کامل این تمرین (فایل \u003Ccode>src\u002F01_first_function.py\u003C\u002Fcode> کنار درس):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 2 - Session 01 - avalin tabe: tarif va seda zadan\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> say_hello():\n    \u003Cspan class=\"tok-com\"># in khat-ha faghat vaghti ejra mishavand ke tabe seda zadeh shavad\u003C\u002Fspan>\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;Salam! Man yek tabe hastam&quot;\u003C\u002Fspan>)\n    \u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;Har bar sedam bezani hamin kar ra mikonam&quot;\u003C\u002Fspan>)\n\n\u003Cspan class=\"tok-com\"># tarif kardan yani sakhtan-e dokme, seda zadan yani feshordan-e an\u003C\u002Fspan>\nsay_hello()\nsay_hello()\nsay_hello()\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> بعد از Run باید هر دو پیغام، سه بار پشت سر هم در Shell چاپ شوند. سه بار صدا زدی، سه بار کل بدنه اجرا شد — یک بار نوشتی، هر چند بار خواستی استفاده کردی. این قدرت تابع است.\u003C\u002Fp>\n\u003Cp>دو خرابکاری عمدی دیگر هم مانده — هر دو را خودت انجام بده. اول: خط \u003Ccode>say_hello()\u003C\u002Fcode> را ببر بالای فایل، قبل از \u003Ccode>def\u003C\u002Fcode>، و Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>Traceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;\nNameError: name 'say_hello' isn't defined\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>«اسمی به نام say_hello تعریف نشده.» چرا؟ چون پایتون فایل را مثل کتاب از بالا به پایین می‌خواند: در خط اول به \u003Ccode>say_hello()\u003C\u002Fcode> می‌رسد در حالی که هنوز کارخانه‌ای ساخته نشده. قانون: \u003Cstrong>اول تعریف، بعد صدا زدن.\u003C\u002Fstrong> برای همین عادت خوب این است که همهٔ تابع‌ها را بالای فایل بنویسیم و برنامهٔ اصلی را پایین. خط را برگردان پایین.\u003C\u002Fp>\n\u003Cp>دوم — بی‌سروصداترین خطای امروز: پرانتز را جا بینداز و فقط بنویس \u003Ccode>say_hello\u003C\u002Fcode>. Run بزن... هیچ خطایی نیست، ولی هیچ سلامی هم چاپ نشد! این از آن باگ‌های موذی است، چون پایتون اصلاً شکایتی نمی‌کند. این‌طور یادت بماند: اسم تابع بدون پرانتز، اسم است — مثل اسم یک نفر روی کاغذ. پرانتز، فعل است — یعنی «انجام بده!». پرانتز که برگردد، تازه صدا زدن اتفاق می‌افتد.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> بعد از \u003Ccode>def say_hello():\u003C\u002Fcode> خطای \u003Ccode>IndentationError: expected an indented block\u003C\u002Fcode> گرفتی؟ بدنهٔ تابع تورفتگی ندارد — خط‌های بدنه را با چهار فاصله تو ببر؛ در Thonny کلید Tab همین کار را می‌کند. برنامه بدون خطا اجرا می‌شود ولی هیچ اتفاقی نمی‌افتد؟ پایین فایل را چک کن: تابع حتماً باید با پرانتز صدا زده شده باشد.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>یک خبر خوب هم برای وقتی دور از میز کارت هستی:\u003C\u002Fp>\n",{"kind":37,"heading":38,"html":39,"embed":40},"lab","","این تمرین هیچ سخت‌افزاری نمی‌خواهد — say_hello را می‌توانی در REPL آزمایشگاه هم تعریف و صدا بزنی.","\u002Flab",{"kind":42,"heading":43,"html":44},"checkpoint","چالش: فایلی که فقط def دارد","\u003Ch2 id=\"چالش-فایلی-که-فقط-def-دارد\">چالش: فایلی که فقط def دارد\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%D9%81%D8%A7%DB%8C%D9%84%DB%8C-%DA%A9%D9%87-%D9%81%D9%82%D8%B7-def-%D8%AF%D8%A7%D8%B1%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>اگر فایلی فقط شامل تعریف یک تابع باشد و هیچ صدازدنی نداشته باشد، موقع اجرا چه می‌بینیم؟ اول خودت جواب بده.\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> هیچ‌چیز. چون \u003Ccode>def\u003C\u002Fcode> فقط کارخانه را می‌سازد؛ تا صدا نزنیم، بدنه اجرا نمی‌شود.\u003C\u002Fp>\n",{"kind":21,"heading":46,"html":47},"۴. پارامتر: جای خالی کارخانه","\u003Ch2 id=\"۴-پارامتر-جای-خالی-کارخانه\">۴. پارامتر: جای خالی کارخانه\u003Ca class=\"head-anchor\" href=\"#%DB%B4-%D9%BE%D8%A7%D8%B1%D8%A7%D9%85%D8%AA%D8%B1-%D8%AC%D8%A7%DB%8C-%D8%AE%D8%A7%D9%84%DB%8C-%DA%A9%D8%A7%D8%B1%D8%AE%D8%A7%D9%86%D9%87\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>حالا آن پرانتز خالی را پر کنیم. فرض کن می‌خواهی LED قرمز گاهی سه بار آرام چشمک بزند، گاهی ده بار تند. با چیزی که تا الان بلدیم باید دو تابع جدا بنویسیم — و اگر فردا چشمک پنج‌تایی خواستیم، تابع سوم؟ نه. راه بهتری هست: \u003Cstrong>پارامتر\u003C\u002Fstrong> — جای خالی در تعریف تابع؛ مثل دستگاه آبمیوه‌گیری که «میوه» را تو انتخاب می‌کنی. دستگاه یکی است، ورودی هر بار فرق می‌کند.\u003C\u002Fp>\n\u003Cp>اول مدار فصل را ببند — همان نقشهٔ همیشگی دوره:\u003C\u002Fp>\n\u003Col>\n\u003Cli>کابل USB را جدا کن (قانون ترم ۱: سیم جابه‌جا می‌کنیم، برق قطع).\u003C\u002Fli>\n\u003Cli>سه LED را با مقاومت‌های ۲۲۰ اهم به پایه‌های ۲۵ (قرمز)، ۲۶ (زرد) و ۲۷ (سبز) وصل کن — پایهٔ بلند سمت مقاومت، پایهٔ کوتاه به GND.\u003C\u002Fli>\n\u003Cli>دکمه را روی شکاف وسط سوار کن: یک پایه به پایهٔ ۳۲ و پایهٔ آن‌طرفش به GND.\u003C\u002Fli>\n\u003Cli>Buzzer را به پایهٔ ۴ و پایهٔ دیگرش را به GND بزن.\u003C\u002Fli>\n\u003Cli>کابل USB را وصل کن.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Cp>جدول کامل اتصالات:\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Component\u003C\u002Fth>\n\u003Cth>ESP32 Pin\u003C\u002Fth>\n\u003Cth>Notes\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\n\u003Ctr>\n\u003Ctd>LED red (+220 ohm)\u003C\u002Ftd>\n\u003Ctd>GPIO 25\u003C\u002Ftd>\n\u003Ctd>long leg -&gt; resistor -&gt; GPIO, short -&gt; GND\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LED yellow (+220 ohm)\u003C\u002Ftd>\n\u003Ctd>GPIO 26\u003C\u002Ftd>\n\u003Ctd>same as above\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>LED green (+220 ohm)\u003C\u002Ftd>\n\u003Ctd>GPIO 27\u003C\u002Ftd>\n\u003Ctd>same as above\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Push button\u003C\u002Ftd>\n\u003Ctd>GPIO 32\u003C\u002Ftd>\n\u003Ctd>other leg -&gt; GND (internal PULL_UP)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Passive buzzer\u003C\u002Ftd>\n\u003Ctd>GPIO 4\u003C\u002Ftd>\n\u003Ctd>other leg -&gt; GND\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n\u003Cp>قبل از تابع، دو میان‌بر کوچک که از امروز استاندارد کدهای این دوره می‌شوند:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>شکل کوتاه import:\u003C\u002Fstrong> تا حالا می‌نوشتیم \u003Ccode>import machine\u003C\u002Fcode> و بعد هر بار \u003Ccode>machine.Pin\u003C\u002Fcode>. از این ترم می‌نویسیم \u003Ccode>from machine import Pin\u003C\u002Fcode> یعنی «از جعبه‌ابزار machine فقط Pin را بردار و بیاور سر میز». از این به بعد به‌جای \u003Ccode>machine.Pin(25, machine.Pin.OUT)\u003C\u002Fcode> می‌نویسیم \u003Ccode>Pin(25, Pin.OUT)\u003C\u002Fcode> — همان کار، کدِ خلوت‌تر.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>\u003Ccode>time.sleep_ms\u003C\u002Fcode>:\u003C\u002Fstrong> برادر دقیق‌ترِ \u003Ccode>time.sleep\u003C\u002Fcode> که به‌جای ثانیه، میلی‌ثانیه می‌گیرد: \u003Ccode>time.sleep_ms(500)\u003C\u002Fcode> یعنی نیم ثانیه. برای چشمک‌های تند، شمردن با میلی‌ثانیه خیلی راحت‌تر از نوشتن ۰٫۵ و ۰٫۱ است.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>و حالا تابع \u003Ccode>blink\u003C\u002Fcode> — برنامهٔ کامل (فایل \u003Ccode>src\u002F02_blink_function.py\u003C\u002Fcode> کنار درس):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 2 - Session 01 - blink ba parameter (LED 25)\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_red = Pin(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, Pin.OUT)\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> blink(pin_obj, times, delay_ms):\n    \u003Cspan class=\"tok-com\"># pin_obj: kodam LED, times: chand bar, delay_ms: sorat-e cheshmak\u003C\u002Fspan>\n    \u003Cspan class=\"tok-kw\">for\u003C\u002Fspan> i \u003Cspan class=\"tok-kw\">in\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">range\u003C\u002Fspan>(times):\n        pin_obj.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n        time.sleep_ms(delay_ms)\n        pin_obj.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n        time.sleep_ms(delay_ms)\n\nblink(led_red, \u003Cspan class=\"tok-num\">3\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">500\u003C\u002Fspan>)    \u003Cspan class=\"tok-com\"># 3 bar cheshmak-e aram\u003C\u002Fspan>\ntime.sleep_ms(\u003Cspan class=\"tok-num\">1000\u003C\u002Fspan>)\nblink(led_red, \u003Cspan class=\"tok-num\">10\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">100\u003C\u002Fspan>)   \u003Cspan class=\"tok-com\"># 10 bar cheshmak-e tond\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>داخل پرانتزِ تعریف، سه پارامتر گذاشتیم و با ویرگول جدا کردیم: \u003Ccode>pin_obj\u003C\u002Fcode> یعنی کدام LED — بله، می‌شود خودِ شیء Pin را به تابع داد! — \u003Ccode>times\u003C\u002Fcode> یعنی چند بار، و \u003Ccode>delay_ms\u003C\u002Fcode> یعنی هر روشن یا خاموش چند میلی‌ثانیه طول بکشد. داخل بدنه چیز جدیدی نیست: همان حلقهٔ \u003Ccode>for\u003C\u002Fcode> ترم ۱، فقط به‌جای عددهای ثابت، پارامتر نشسته.\u003C\u002Fp>\n\u003Cp>و یک واژهٔ جدید: به مقدارهایی که موقع صدا زدن می‌فرستیم — مثل \u003Ccode>led_red\u003C\u002Fcode> و \u003Ccode>3\u003C\u002Fcode> و \u003Ccode>500\u003C\u002Fcode> — می‌گویند argument، آرگومان. پارامتر جای خالی است؛ آرگومان چیزی است که در آن جای خالی می‌گذاریم.\u003C\u002Fp>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> بعد از Run باید سه چشمک آرام ببینی، یک ثانیه مکث، بعد ده چشمک تند. یک تابع، بی‌نهایت رفتار.\u003C\u002Fp>\n\u003Cp>یک آزمایش هم بکن: عمداً یک آرگومان کم بده — \u003Ccode>blink(led_red, 3)\u003C\u002Fcode> — و Run بزن:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>Traceback (most recent call last):\n  File &quot;&lt;stdin&gt;&quot;, line 12, in &lt;module&gt;\nTypeError: function takes 3 positional arguments but 2 were given\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>پایتون شمرده و شفاف می‌گوید: این تابع سه جای خالی دارد، تو فقط دو تا پر کردی. کارخانهٔ سه‌ورودی با دو ورودی روشن نمی‌شود. آرگومان سوم را برگردان تا درست شود.\u003C\u002Fp>\n",{"kind":21,"heading":49,"html":50},"۵. return: کارخانه‌ای که محصول تحویل می‌دهد","\u003Ch2 id=\"۵-return-کارخانه‌ای-که-محصول-تحویل-می‌دهد\">۵. return: کارخانه‌ای که محصول تحویل می‌دهد\u003Ca class=\"head-anchor\" href=\"#%DB%B5-return-%DA%A9%D8%A7%D8%B1%D8%AE%D8%A7%D9%86%D9%87%E2%80%8C%D8%A7%DB%8C-%DA%A9%D9%87-%D9%85%D8%AD%D8%B5%D9%88%D9%84-%D8%AA%D8%AD%D9%88%DB%8C%D9%84-%D9%85%DB%8C%E2%80%8C%D8%AF%D9%87%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>تا این‌جا تابع‌های ما فقط «کاری انجام می‌دادند»: چشمک، بوق. ولی بعضی کارخانه‌ها محصول تحویل می‌دهند — مثل ماشین‌حساب: دو عدد می‌دهی، جواب پس می‌گیری. در پایتون به این «پس دادن جواب» می‌گویند return.\u003C\u002Fp>\n\u003Cp>بهترین مثالش اتفاقاً به همین ترم ربط دارد: تبدیل دما. سنسور دمایی که چند فصل دیگر وصل می‌کنیم، دما را سلسیوس می‌دهد؛ اگر بخواهیم به فارنهایت — واحد رایج بعضی کشورها — تبدیلش کنیم، فرمولش ضرب در ۱٫۸ و جمع با ۳۲ است. تابعش فقط دو خط است: \u003Ccode>def c_to_f(c):\u003C\u002Fcode> و بعد \u003Ccode>return c * 1.8 + 32\u003C\u002Fcode>. کلمهٔ \u003Ccode>return\u003C\u002Fcode> یعنی: «این مقدار را به هر کسی که مرا صدا زد، تحویل بده.»\u003C\u002Fp>\n\u003Cp>حالا یک آزمایش مهم. در فایل بنویس \u003Ccode>c_to_f(25)\u003C\u002Fcode> — بدون هیچ print — و Run بزن... هیچ‌چیز چاپ نشد! تعجب کردی؟ تابع کار خودش را کرد: عدد ۷۷ را حساب کرد و تحویل داد — ولی ما تحویلش نگرفتیم. جواب مثل بستهٔ پستی برگشت خورد، چون کسی در را باز نکرد. دو راه برای تحویل گرفتن داریم: در متغیر بگذاریم — \u003Ccode>f = c_to_f(25)\u003C\u002Fcode> — یا مستقیم چاپش کنیم — \u003Ccode>print(c_to_f(25))\u003C\u002Fcode>. برنامهٔ کامل با همهٔ آزمایش‌ها (فایل \u003Ccode>src\u002F03_return_c_to_f.py\u003C\u002Fcode> کنار درس):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 2 - Session 01 - return: tabe-i ke javab pas midahad\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> c_to_f(c):\n    \u003Cspan class=\"tok-com\"># dama-ye Celsius ra be Fahrenheit tabdil mikonad\u003C\u002Fspan>\n    \u003Cspan class=\"tok-kw\">return\u003C\u002Fspan> c * \u003Cspan class=\"tok-num\">1.8\u003C\u002Fspan> + \u003Cspan class=\"tok-num\">32\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> add(a, b):\n    \u003Cspan class=\"tok-com\"># jam-e do adad, faghat baraye tamrin-e return\u003C\u002Fspan>\n    \u003Cspan class=\"tok-kw\">return\u003C\u002Fspan> a + b\n\n\u003Cspan class=\"tok-com\"># return be tanhayi chizi chap nemikonad!\u003C\u002Fspan>\nc_to_f(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>)   \u003Cspan class=\"tok-com\"># in khat ejra mishavad vali hich chizi ruye safhe nemi-ayad\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-com\"># baraye tahvil gereftan-e javab: motghayer ya print\u003C\u002Fspan>\nf = c_to_f(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>)\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;25 daraje Celsius =&quot;\u003C\u002Fspan>, f, \u003Cspan class=\"tok-str\">&quot;Fahrenheit&quot;\u003C\u002Fspan>)\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">f&quot;40 daraje Celsius = {c_to_f(40)} Fahrenheit&quot;\u003C\u002Fspan>)\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;2 + 3 =&quot;\u003C\u002Fspan>, add(\u003Cspan class=\"tok-num\">2\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">3\u003C\u002Fspan>))\n\n\u003Cspan class=\"tok-com\"># dar REPL khodet emtehan kon:\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\"># &gt;&gt;&gt; c_to_f(100)\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\"># 212.0\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\"># REPL javab ra az sar-e mehrabani neshan midahad,\u003C\u002Fspan>\n\u003Cspan class=\"tok-com\"># vali dakhel-e barname faghat print ya motghayer!\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> سه خط چاپ‌شده باید ببینی — و هیچ اثری از آن \u003Ccode>c_to_f(25)\u003C\u002Fcode> تنها.\u003C\u002Fp>\n\u003Cp>یک نکتهٔ ریز که بعداً در بخش همیار AI به دردمان می‌خورد: در REPL — همان پنجرهٔ Shell — اگر تایپ کنی \u003Ccode>c_to_f(100)\u003C\u002Fcode>، خودِ REPL از سر مهربانی جواب را نشانت می‌دهد: ۲۱۲٫۰. ولی این لطفِ REPL است، نه کارِ return. داخل برنامه چنین لطفی وجود ندارد.\u003C\u002Fp>\n",{"kind":42,"heading":52,"html":53},"چالش: print یا return؟","\u003Ch2 id=\"چالش-print-یا-return\">چالش: print یا return؟\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-print-%DB%8C%D8%A7-return\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>بدون نگاه کردن به بالا جواب بده: فرق \u003Ccode>print\u003C\u002Fcode> داخل تابع با \u003Ccode>return\u003C\u002Fcode> چیست؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> \u003Ccode>print\u003C\u002Fcode> فقط چیزی را روی صفحه نشان می‌دهد و بعدش دود می‌شود؛ \u003Ccode>return\u003C\u002Fcode> مقدار را به صدازننده تحویل می‌دهد تا بتواند در متغیر نگهش دارد یا با آن محاسبه کند.\u003C\u002Fp>\n",{"kind":21,"heading":55,"html":56},"۶. پروژه: ریموت یک‌دکمه‌ای","\u003Ch2 id=\"۶-پروژه-ریموت-یک‌دکمه‌ای\">۶. پروژه: ریموت یک‌دکمه‌ای\u003Ca class=\"head-anchor\" href=\"#%DB%B6-%D9%BE%D8%B1%D9%88%DA%98%D9%87-%D8%B1%DB%8C%D9%85%D9%88%D8%AA-%DB%8C%DA%A9%E2%80%8C%D8%AF%DA%A9%D9%85%D9%87%E2%80%8C%D8%A7%DB%8C\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>همهٔ قطعات را داری: تابع بدون پارامتر، تابع با پارامتر، return. وقت ساخت است. ایده ساده است: هر بار دکمه را فشار بدهی، یک نمایش کامل اجرا می‌شود — نور مثل موج از روی سه LED رد می‌شود، سه بوق بالارونده می‌زند و آخرش LED سبز جشن می‌گیرد. مثل دکمهٔ کمبو: یک فشار، یک حرکت نمایشی کامل.\u003C\u002Fp>\n\u003Cp>زیبایی کار در سازمان‌دهی‌اش است. به‌جای یک کد اسپاگتی بلند، چهار کارخانهٔ کوچک می‌سازیم که هر کدام یک کار را خوب بلدند:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Ccode>blink\u003C\u002Fcode> — که نوشتیم.\u003C\u002Fli>\n\u003Cli>\u003Ccode>beep\u003C\u002Fcode> — دو پارامتر \u003Ccode>freq_hz\u003C\u002Fcode> و \u003Ccode>duration_ms\u003C\u002Fcode>؛ داخلش همان سه خط آشنای ترم ۱: فرکانس را تنظیم کن، \u003Ccode>duty(512)\u003C\u002Fcode> صدا روشن، مکث، \u003Ccode>duty(0)\u003C\u002Fcode> صدا خاموش.\u003C\u002Fli>\n\u003Cli>\u003Ccode>chase\u003C\u002Fcode> — موج نور، که خودش سه بار \u003Ccode>blink\u003C\u002Fcode> را صدا می‌زند.\u003C\u002Fli>\n\u003Cli>\u003Ccode>show\u003C\u002Fcode> — کارگردان، که بقیه را به صف می‌کند.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>حلقهٔ اصلی هم فقط چند خط است: اگر دکمه فشرده شد، \u003Ccode>show()\u003C\u002Fcode> را صدا بزن و یک \u003Ccode>time.sleep_ms(200)\u003C\u002Fcode> برای debounce — همان ترفند فصل ۹ ترم ۱ که نمی‌گذارد یک فشار، چند فشار حساب شود. برنامهٔ کامل (فایل \u003Ccode>src\u002F04_one_button_show.py\u003C\u002Fcode> کنار درس):\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode>\u003Cspan class=\"tok-com\"># Term 2 - Session 01 - remote yek-dokmei: har feshar yek show\u003C\u002Fspan>\n\u003Cspan class=\"tok-kw\">from\u003C\u002Fspan> machine \u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> Pin, PWM\n\u003Cspan class=\"tok-kw\">import\u003C\u002Fspan> time\n\nled_red = Pin(\u003Cspan class=\"tok-num\">25\u003C\u002Fspan>, Pin.OUT)\nled_yellow = Pin(\u003Cspan class=\"tok-num\">26\u003C\u002Fspan>, Pin.OUT)\nled_green = Pin(\u003Cspan class=\"tok-num\">27\u003C\u002Fspan>, Pin.OUT)\nbutton1 = Pin(\u003Cspan class=\"tok-num\">32\u003C\u002Fspan>, Pin.IN, Pin.PULL_UP)\nbuzzer = PWM(Pin(\u003Cspan class=\"tok-num\">4\u003C\u002Fspan>))\nbuzzer.duty(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)   \u003Cspan class=\"tok-com\"># aval-e kar seda ra ghat kon!\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> blink(pin_obj, times, delay_ms):\n    \u003Cspan class=\"tok-com\"># cheshmak: kodam LED, chand bar, ba che sorati\u003C\u002Fspan>\n    \u003Cspan class=\"tok-kw\">for\u003C\u002Fspan> i \u003Cspan class=\"tok-kw\">in\u003C\u002Fspan> \u003Cspan class=\"tok-fn\">range\u003C\u002Fspan>(times):\n        pin_obj.value(\u003Cspan class=\"tok-num\">1\u003C\u002Fspan>)\n        time.sleep_ms(delay_ms)\n        pin_obj.value(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)\n        time.sleep_ms(delay_ms)\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> beep(freq_hz, duration_ms):\n    \u003Cspan class=\"tok-com\"># yek boogh-e kutah ba farkans-e delkhah\u003C\u002Fspan>\n    buzzer.freq(freq_hz)\n    buzzer.duty(\u003Cspan class=\"tok-num\">512\u003C\u002Fspan>)    \u003Cspan class=\"tok-com\"># seda roshan\u003C\u002Fspan>\n    time.sleep_ms(duration_ms)\n    buzzer.duty(\u003Cspan class=\"tok-num\">0\u003C\u002Fspan>)      \u003Cspan class=\"tok-com\"># seda khamush\u003C\u002Fspan>\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> chase(delay_ms):\n    \u003Cspan class=\"tok-com\"># mowj-e noor: ghermez -&gt; zard -&gt; sabz\u003C\u002Fspan>\n    blink(led_red, \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>, delay_ms)\n    blink(led_yellow, \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>, delay_ms)\n    blink(led_green, \u003Cspan class=\"tok-num\">1\u003C\u002Fspan>, delay_ms)\n\n\u003Cspan class=\"tok-kw\">def\u003C\u002Fspan> show():\n    \u003Cspan class=\"tok-com\"># kargardan-e nomayesh: hame chiz ra be saf mikonad\u003C\u002Fspan>\n    chase(\u003Cspan class=\"tok-num\">150\u003C\u002Fspan>)\n    chase(\u003Cspan class=\"tok-num\">150\u003C\u002Fspan>)\n    beep(\u003Cspan class=\"tok-num\">600\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">150\u003C\u002Fspan>)\n    beep(\u003Cspan class=\"tok-num\">800\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">150\u003C\u002Fspan>)\n    beep(\u003Cspan class=\"tok-num\">1000\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">300\u003C\u002Fspan>)\n    blink(led_green, \u003Cspan class=\"tok-num\">3\u003C\u002Fspan>, \u003Cspan class=\"tok-num\">100\u003C\u002Fspan>)\n\n\u003Cspan class=\"tok-fn\">print\u003C\u002Fspan>(\u003Cspan class=\"tok-str\">&quot;Dokme ra feshar bede ta show shoroo shavad!&quot;\u003C\u002Fspan>)\n\n\u003Cspan class=\"tok-kw\">while\u003C\u002Fspan> \u003Cspan class=\"tok-kw\">True\u003C\u002Fspan>:\n    \u003Cspan class=\"tok-kw\">if\u003C\u002Fspan> button1.value() == \u003Cspan class=\"tok-num\">0\u003C\u002Fspan>:     \u003Cspan class=\"tok-com\"># pull-up: feshorde = 0\u003C\u002Fspan>\n        show()\n        time.sleep_ms(\u003Cspan class=\"tok-num\">200\u003C\u002Fspan>)       \u003Cspan class=\"tok-com\"># debounce-e sade az term 1\u003C\u002Fspan>\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>✅ \u003Cstrong>چک کن:\u003C\u002Fstrong> دکمه را فشار بده — موج نور، بوق‌های بالارونده، جشن سبز. دوباره فشار بده — دوباره از اول. حالا لطف تابع را حس می‌کنی؟ اگر بخواهی نمایش را عوض کنی، فقط بدنهٔ \u003Ccode>show\u003C\u002Fcode> را دست می‌زنی؛ حلقهٔ اصلی هیچ تغییری لازم ندارد. اسم این «سازمان‌دهی کد» است — و از امروز امضای کدنویسی ماست: تابع‌ها بالا، برنامهٔ اصلی کوتاه و خوانا پایین.\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🔧 \u003Cstrong>اگر کار نکرد:\u003C\u002Fstrong> دکمه را می‌زنی و هیچ اتفاقی نمی‌افتد — یا نمایش خودش مدام اجرا می‌شود؟ پایهٔ دوم دکمه به GND وصل نیست، دکمه روی شکاف وسط درست ننشسته، یا \u003Ccode>Pin.PULL_UP\u003C\u002Fcode> در کد جا افتاده؛ خط ساخت دکمه را با کد بالا مقایسه کن. Buzzer از همان لحظهٔ اجرا صدای ممتد می‌دهد؟ خط \u003Ccode>buzzer.duty(0)\u003C\u002Fcode> بعد از ساختن \u003Ccode>PWM(Pin(4))\u003C\u002Fcode> جا افتاده — بلافاصله بعد از ساختن شیء PWM صدا را قطع کن. و خطای \u003Ccode>NameError: name 'blink' isn't defined\u003C\u002Fcode> یعنی یا تابع را پایین‌تر از جای صدا زدن تعریف کرده‌ای، یا اسمش را غلط تایپ کرده‌ای (\u003Ccode>blnik\u003C\u002Fcode>!) — املای صدا زدن را با خط \u003Ccode>def\u003C\u002Fcode> مقایسه کن.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>و اگر هنوز قطعه‌هایت کامل نیست:\u003C\u002Fp>\n",{"kind":37,"heading":38,"html":58,"embed":40},"راستش را بگوییم: صدای Buzzer و PWM هنوز در شبیه‌ساز آزمایشگاه اجرا نمی‌شود — بوق‌ها را فقط روی برد واقعی می‌شنوی. ولی مدار و کد کامل این فصل آن‌جا هست: ببینشان، کپی کن و چشمک‌های LED را همان‌جا امتحان کن.",{"kind":42,"heading":60,"html":61},"چالش: کارخانه‌ای که کارخانه صدا می‌زند","\u003Ch2 id=\"چالش-کارخانه‌ای-که-کارخانه-صدا-می‌زند\">چالش: کارخانه‌ای که کارخانه صدا می‌زند\u003Ca class=\"head-anchor\" href=\"#%DA%86%D8%A7%D9%84%D8%B4-%DA%A9%D8%A7%D8%B1%D8%AE%D8%A7%D9%86%D9%87%E2%80%8C%D8%A7%DB%8C-%DA%A9%D9%87-%DA%A9%D8%A7%D8%B1%D8%AE%D8%A7%D9%86%D9%87-%D8%B5%D8%AF%D8%A7-%D9%85%DB%8C%E2%80%8C%D8%B2%D9%86%D8%AF\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>تابع \u003Ccode>chase\u003C\u002Fcode> خودش سه بار تابع \u003Ccode>blink\u003C\u002Fcode> را صدا می‌زند. اسم این کار چیست و چه فایده‌ای دارد؟\u003C\u002Fp>\n\u003Chr>\n\u003Cp>\u003Cstrong>جواب:\u003C\u002Fstrong> ترکیب تابع‌ها — تابع‌های بزرگ‌تر از تابع‌های کوچک‌تر ساخته می‌شوند و هر تکه فقط یک بار نوشته می‌شود. \u003Ccode>show\u003C\u002Fcode> هم همین کار را با \u003Ccode>chase\u003C\u002Fcode> و \u003Ccode>beep\u003C\u002Fcode> و \u003Ccode>blink\u003C\u002Fcode> می‌کند.\u003C\u002Fp>\n",{"kind":21,"heading":63,"html":64},"۷. با AI: توضیح خط‌به‌خط و راستی‌آزمایی","\u003Ch2 id=\"۷-با-ai-توضیح-خط‌به‌خط-و-راستی‌آزمایی\">۷. با AI: توضیح خط‌به‌خط و راستی‌آزمایی\u003Ca class=\"head-anchor\" href=\"#%DB%B7-%D8%A8%D8%A7-ai-%D8%AA%D9%88%D8%B6%DB%8C%D8%AD-%D8%AE%D8%B7%E2%80%8C%D8%A8%D9%87%E2%80%8C%D8%AE%D8%B7-%D9%88-%D8%B1%D8%A7%D8%B3%D8%AA%DB%8C%E2%80%8C%D8%A2%D8%B2%D9%85%D8%A7%DB%8C%DB%8C\" aria-label=\"پیوند به این بخش\">#\u003C\u002Fa>\u003C\u002Fh2>\n\u003Cp>ترم قبل یاد گرفتی متن خطا را به chatbot بدهی و بپرسی «این error یعنی چه؟». این ترم مهارت جدیدی تمرین می‌کنیم: از AI بخواهیم کد را خط‌به‌خط توضیح بدهد و برایمان مثال تمرینی بسازد.\u003C\u002Fp>\n\u003Cp>مثلاً تابع \u003Ccode>c_to_f\u003C\u002Fcode> را در chatbot می‌چسبانی و می‌نویسی: «من تازه‌کارم. این کد را خط‌به‌خط توضیح بده: هر خط چه کار می‌کند؟» جواب خوبی می‌گیری: توضیح می‌دهد \u003Ccode>def\u003C\u002Fcode> تابع می‌سازد، \u003Ccode>c\u003C\u002Fcode> پارامتر ورودی است و خط دوم فرمول تبدیل را حساب می‌کند. بعد درخواست دوم: «یک تمرین شبیه همین برای من بساز که فقط از def و return و عملگرهای حسابی استفاده کند.» و مثلاً پیشنهاد می‌دهد: تابعی بنویس که قد را از سانتی‌متر به اینچ تبدیل کند — تمرینی دقیقاً هم‌سطح خودت.\u003C\u002Fp>\n\u003Cp>ولی حواست جمع باشد. در همین گفت‌وگو ممکن است AI وسط توضیحش یک جملهٔ مشکوک بگوید — مثلاً: «وقتی return اجرا شود، نتیجه روی صفحه چاپ می‌شود.» هوم! ما همین چند صفحه پیش خلافش را با چشم دیدیم. چه می‌کنیم؟ آزمایش: فایل جدید، فقط تعریف \u003Ccode>c_to_f\u003C\u002Fcode> و یک خط \u003Ccode>c_to_f(25)\u003C\u002Fcode> بدون print. اجرا... Shell خالی است. پس AI این‌جا دقیق نبود: return تحویل می‌دهد، چاپ نمی‌کند؛ چاپ کار print است. با یک آزمایش بیست‌ثانیه‌ای حرف AI را راستی‌آزمایی کردی. AI یک همیار فوق‌العاده است — ولی همیار توست، نه معلم معصوم. داور نهایی همیشه اجرای واقعی کد است.\u003C\u002Fp>\n\u003Cp>\u003Cpicture>\u003Csource type=\"image\u002Fwebp\" srcset=\"\u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.160.webp 160w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.320.webp 320w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.640.webp 640w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.1280.webp 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\">\u003Cimg src=\"\u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.1280.jpg\" srcset=\"\u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.160.jpg 160w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.320.jpg 320w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.640.jpg 640w, \u002F_img\u002F06-image-ai-three-rules-cards.12f40d9011.1280.jpg 1280w\" sizes=\"(max-width: 900px) 100vw, 800px\" alt=\"سه کارت گرافیکی کنار هم: نوجوانی که اول خودش فکر می‌کند و لامپ ایده بالای سرش روشن است، ذره‌بینی که خط‌به‌خط روی کد حرکت می‌کند، و چهرهٔ ربات مهربانی با آچار هشدار کوچک — ربات‌ها هم اشتباه می‌کنند\" width=\"1376\" height=\"768\" loading=\"lazy\" decoding=\"async\">\u003C\u002Fpicture>\u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>🤖 \u003Cstrong>با AI:\u003C\u002Fstrong> خودت امتحان کن: کد \u003Ccode>blink\u003C\u002Fcode> را در chatbot بچسبان و بخواه خط‌به‌خطش را توضیح بدهد؛ بعد ازش یک تمرین هم‌سطح بخواه و حلش کن. سه قانون همیشگی سر جایشان‌اند: یک — «اول خودت، بعد AI»: اول حدس خودت را بزن. دو — «خط به خط»: کدی که نمی‌فهمی در پروژه‌ات نگذار. سه — «AI هم اشتباه می‌کند»: جوابش را با اجرا امتحان کن. و مثل همیشه: حساب کاربری فقط با اجازه و کمک والدین.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n",{"kind":21,"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>function\u003C\u002Ftd>\n\u003Ctd>فانکشِن\u003C\u002Ftd>\n\u003Ctd>تابع؛ کارخانهٔ کوچک کد که یک بار تعریف می‌شود و بارها استفاده می‌شود\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>define\u003C\u002Ftd>\n\u003Ctd>دیفاین\u003C\u002Ftd>\n\u003Ctd>تعریف کردن؛ ساختن تابع با کلمهٔ \u003Ccode>def\u003C\u002Fcode> (هنوز اجرا نیست!)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>call\u003C\u002Ftd>\n\u003Ctd>کال\u003C\u002Ftd>\n\u003Ctd>صدا زدن تابع با پرانتز تا بدنه‌اش واقعاً اجرا شود\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>parameter\u003C\u002Ftd>\n\u003Ctd>پَرَمیتِر\u003C\u002Ftd>\n\u003Ctd>جای خالی در تعریف تابع؛ مثل \u003Ccode>times\u003C\u002Fcode> در \u003Ccode>blink\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>argument\u003C\u002Ftd>\n\u003Ctd>آرگیومِنت\u003C\u002Ftd>\n\u003Ctd>مقدار واقعی که موقع صدا زدن در جای خالی می‌گذاریم؛ مثل عدد ۳\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>return\u003C\u002Ftd>\n\u003Ctd>ریتِرن\u003C\u002Ftd>\n\u003Ctd>تحویل دادن جواب تابع به صدازننده (بدون چاپ کردن!)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\n\u003C\u002Ftable>\n",{"kind":42,"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>اول چک‌لیست پایان فصل: ریموت یک‌دکمه‌ای کار می‌کند و هر فشار، نمایش کامل را یک بار اجرا می‌کند؛ می‌توانی توضیح بدهی چرا فایلی که فقط \u003Ccode>def\u003C\u002Fcode> دارد هیچ خروجی ندارد؛ \u003Ccode>blink\u003C\u002Fcode> را با آرگومان‌های دلخواه صدا زده‌ای و نتیجه همان بوده که پیش‌بینی کردی؛ و جواب \u003Ccode>c_to_f(25)\u003C\u002Fcode> را یک بار در REPL و یک بار با \u003Ccode>print\u003C\u002Fcode> گرفته‌ای و فرقشان را می‌دانی. اگر هر چهار تا بله است، برو سراغ تمرین‌ها:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>تمرین اجباری:\u003C\u002Fstrong> به تابع \u003Ccode>show()\u003C\u002Fcode> یک حرکت جدید اضافه کن — مثلاً بعد از جشن سبز، یک بوق بم (فرکانس ۳۰۰) و دو چشمک قرمز. بعد یک فراخوانی جدید بنویس که LED سبز پنج بار خیلی تند (۵۰ میلی‌ثانیه) چشمک بزند.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>تمرین ستاره‌دار ⭐:\u003C\u002Fstrong> تابع \u003Ccode>police()\u003C\u002Fcode> بساز که پنج بار پشت هم قرمز و زرد را یک‌درمیان چشمک بزند و همراهش آژیر دوصدایی (دو فرکانس متناوب) پخش کند. بعد دکمهٔ دوم (پایهٔ ۳۳) را به مدار اضافه کن: دکمهٔ ۱ همان \u003Ccode>show()\u003C\u002Fcode> و دکمهٔ ۲ \u003Ccode>police()\u003C\u002Fcode> را اجرا کند.\u003C\u002Fli>\n\u003C\u002Ful>\n",{"kind":21,"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>بالاخره راز عدد ۵۱۲ باز می‌شود — و LED ها یاد می‌گیرند نفس بکشند: کم‌نور، پرنور و هر چیزِ بینشان.\u003C\u002Fp>\n",{"course":75,"entitled":12,"lessons":83,"payments_enabled":12,"terms":254,"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,98,102,106,110,114,118,122,126,127,128,129,132,135,138,141,144,147,150,153,156,159,162,165,168,171,174,177,180,183,186,189,192,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":85,"source":8,"term":6,"title_fa":86},"t1-s01-meet-robots","فصل ۱ — دنیای ربات‌ها و جعبه‌ابزار ما",{"free_preview":12,"order":9,"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":95,"slug":96,"source":8,"term":6,"title_fa":97},4,"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":123,"slug":124,"source":8,"term":6,"title_fa":125},11,"t1-s11-term-project-build","فصل ۱۱ — پروژه ترم: چراغ راهنمایی هوشمند — ساخت",{"free_preview":12,"order":13,"slug":14,"source":8,"term":6,"title_fa":15},{"free_preview":5,"order":6,"slug":7,"source":8,"term":9,"title_fa":10},{"free_preview":12,"order":9,"slug":17,"source":8,"term":9,"title_fa":18},{"free_preview":12,"order":91,"slug":130,"source":8,"term":9,"title_fa":131},"t2-s03-adc-potentiometer","فصل ۳ — ورودی آنالوگ: پتانسیومتر",{"free_preview":12,"order":95,"slug":133,"source":8,"term":9,"title_fa":134},"t2-s04-ldr-night-light","فصل ۴ — سنسور نور و چراغ خودکار",{"free_preview":12,"order":99,"slug":136,"source":8,"term":9,"title_fa":137},"t2-s05-lists-data","فصل ۵ — لیست‌ها و داده‌ها",{"free_preview":12,"order":103,"slug":139,"source":8,"term":9,"title_fa":140},"t2-s06-dht11-library","فصل ۶ — دما و رطوبت: کتابخانه‌ها",{"free_preview":12,"order":107,"slug":142,"source":8,"term":9,"title_fa":143},"t2-s07-oled-display","فصل ۷ — نمایشگر OLED",{"free_preview":12,"order":111,"slug":145,"source":8,"term":9,"title_fa":146},"t2-s08-servo","فصل ۸ — Servo: اولین حرکت",{"free_preview":12,"order":115,"slug":148,"source":8,"term":9,"title_fa":149},"t2-s09-ultrasonic","فصل ۹ — سنسور فاصله HC-SR04",{"free_preview":12,"order":119,"slug":151,"source":8,"term":9,"title_fa":152},"t2-s10-term-project-build","فصل ۱۰ — پروژه ترم: ایستگاه هواشناسی رومیزی — ساخت",{"free_preview":12,"order":123,"slug":154,"source":8,"term":9,"title_fa":155},"t2-s11-term-project-upgrade","فصل ۱۱ — پروژه ترم: ارتقا و نمایش",{"free_preview":5,"order":6,"slug":157,"source":8,"term":91,"title_fa":158},"t3-s01-robot-anatomy","فصل ۱ — آناتومی ربات متحرک",{"free_preview":12,"order":9,"slug":160,"source":8,"term":91,"title_fa":161},"t3-s02-motor-driver","فصل ۲ — چرخاندن موتور با L298N",{"free_preview":12,"order":91,"slug":163,"source":8,"term":91,"title_fa":164},"t3-s03-chassis-assembly","فصل ۳ — مونتاژ ربات و توابع حرکت",{"free_preview":12,"order":95,"slug":166,"source":8,"term":91,"title_fa":167},"t3-s04-calibration-choreography","فصل ۴ — کالیبراسیون و رقص ربات",{"free_preview":12,"order":99,"slug":169,"source":8,"term":91,"title_fa":170},"t3-s05-ultrasonic-brake","فصل ۵ — چشم ربات: ترمز خودکار",{"free_preview":12,"order":103,"slug":172,"source":8,"term":91,"title_fa":173},"t3-s06-obstacle-avoidance","فصل ۶ — ربات دوری‌گزین",{"free_preview":12,"order":107,"slug":175,"source":8,"term":91,"title_fa":176},"t3-s07-line-sensors","فصل ۷ — خواندن خط",{"free_preview":12,"order":111,"slug":178,"source":8,"term":91,"title_fa":179},"t3-s08-line-follower","فصل ۸ — دنبال‌کننده خط",{"free_preview":12,"order":115,"slug":181,"source":8,"term":91,"title_fa":182},"t3-s09-better-line-follower","فصل ۹ — دنبال‌کننده بهتر: کنترل P",{"free_preview":12,"order":119,"slug":184,"source":8,"term":91,"title_fa":185},"t3-s10-term-project-build","فصل ۱۰ — پروژه ترم: ربات ماموریت — ساخت",{"free_preview":12,"order":123,"slug":187,"source":8,"term":91,"title_fa":188},"t3-s11-term-project-run","فصل ۱۱ — پروژه ترم: اجرای ماموریت و نمایش",{"free_preview":5,"order":6,"slug":190,"source":8,"term":95,"title_fa":191},"t4-s01-wifi-basics","فصل ۱ — شبکه به زبان آدمیزاد و اتصال به WiFi",{"free_preview":12,"order":9,"slug":193,"source":8,"term":95,"title_fa":194},"t4-s02-http-requests","فصل ۲ — گرفتن داده از اینترنت",{"free_preview":12,"order":91,"slug":196,"source":8,"term":95,"title_fa":197},"t4-s03-web-server-led","فصل ۳ — وب‌سرور: کنترل LED از گوشی",{"free_preview":12,"order":95,"slug":199,"source":8,"term":95,"title_fa":200},"t4-s04-sensor-dashboard","فصل ۴ — داشبورد وب سنسورها",{"free_preview":12,"order":99,"slug":202,"source":8,"term":95,"title_fa":203},"t4-s05-robot-web-remote","فصل ۵ — ریموت وب: ربات را با گوشی بران",{"free_preview":12,"order":103,"slug":205,"source":8,"term":95,"title_fa":206},"t4-s06-json-apikeys","فصل ۶ — JSON و کلید API: زبان داده‌ها و کلیدِ درها",{"free_preview":12,"order":107,"slug":208,"source":8,"term":95,"title_fa":209},"t4-s07-first-ai-call","فصل ۷ — اولین تماس با AI: الگوی پل",{"free_preview":12,"order":111,"slug":211,"source":8,"term":95,"title_fa":212},"t4-s08-ai-sensor-assistant","فصل ۸ — دستیار سنسوری هوشمند",{"free_preview":12,"order":115,"slug":214,"source":8,"term":95,"title_fa":215},"t4-s09-esp32-direct-ai","فصل ۹ — وقتی برد خودش با AI حرف می‌زند",{"free_preview":12,"order":119,"slug":217,"source":8,"term":95,"title_fa":218},"t4-s10-term-project-build","فصل ۱۰ — پروژه ترم: دستیار هوشمند",{"free_preview":12,"order":123,"slug":220,"source":8,"term":95,"title_fa":155},"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":9,"slug":225,"source":8,"term":99,"title_fa":226},"t5-s02-cpp-syntax","فصل ۲ — سینتکس C++: قواعد کشور جدید",{"free_preview":12,"order":91,"slug":228,"source":8,"term":99,"title_fa":229},"t5-s03-cpp-functions-speed","فصل ۳ — توابع C++ و آزمون سرعت",{"free_preview":12,"order":95,"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":123,"slug":252,"source":8,"term":99,"title_fa":253},"t5-s11-graduation","فصل ۱۱ — فارغ‌التحصیلی: نمایشِ نهایی و مسیرِ آینده",[],1784827101876]