[{"data":1,"prerenderedAt":13},["ShallowReactive",2],{"blog:pushbutton":3},{"category":4,"cover_image":5,"html":6,"published_at":7,"seo_description":8,"seo_title":9,"slug":10,"sort_order":11,"title_fa":12},"sensors-inputs","\u002Fblog\u002Fpushbutton.jpg","\u003Cp>در فصل‌های «ورودی دیجیتال: دکمه» و «منطق و تصمیم‌های ترکیبی» با ساده‌ترین وسیله‌ی ورودی آشنا شدی: \u003Cstrong>دکمه‌ی فشاری\u003C\u002Fstrong>. ظاهرش از همه‌چیز ساده‌تر است، ولی پشتِ همین دکمه دو مفهومِ مهم پنهان شده که تا نفهمی‌شان، ورودی‌های ربات مدام تو را گیج می‌کنند: پایه‌ی شناور و لرزشِ کلید.\u003C\u002Fp>\n\n\u003Ch2>چطور واقعاً کار می‌کند\u003C\u002Fh2>\n\u003Cp>یک دکمه‌ی فشاری در باطن فقط دو تکه فلز است که معمولاً از هم جدا هستند. وقتی فشارش می‌دهی، یک پُلِ فلزی این دو را به هم وصل می‌کند و مسیرِ برق بسته می‌شود؛ رهایش کنی، دوباره باز می‌شود. برد این وضعیت را به‌شکل \u003Ccode dir=\"ltr\">HIGH\u003C\u002Fcode> یا \u003Ccode dir=\"ltr\">LOW\u003C\u002Fcode> (یک یا صفر) می‌خواند.\u003C\u002Fp>\n\u003Cp>حالا مشکلِ اصلی: \u003Cstrong>پایه‌ی شناور\u003C\u002Fstrong> (\u003Ccode dir=\"ltr\">floating\u003C\u002Fcode>). تصور کن یک پایه‌ی ورودی را فقط به یک سرِ دکمه وصل کنی و کارِ دیگری نکنی. وقتی دکمه رها است، آن پایه به هیچ ولتاژِ مشخصی وصل نیست؛ مثل یک آنتنِ کوچک نویزِ محیط را می‌گیرد و مقدارش تصادفی بین صفر و یک می‌پرد. نتیجه؟ ربات بی‌دلیل فکر می‌کند دکمه فشار داده شده. راه‌حل یک مقاومتِ \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> یا \u003Ccode dir=\"ltr\">pull-down\u003C\u002Fcode> است که وقتی دکمه رها است، پایه را به یک مقدارِ مطمئن می‌کشد. \u003Ccode dir=\"ltr\">ESP32\u003C\u002Fcode> مقاومتِ \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> داخلی دارد، پس با یک خط کد فعالش می‌کنیم.\u003C\u002Fp>\n\u003Cp>با \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> منطق کمی وارونه می‌شود و این خیلی‌ها را گیج می‌کند: وقتی دکمه \u003Cstrong>رها\u003C\u002Fstrong> است پایه به \u003Ccode dir=\"ltr\">HIGH\u003C\u002Fcode> (یک) کشیده می‌شود، و وقتی دکمه را \u003Cstrong>فشار\u003C\u002Fstrong> می‌دهی پایه به \u003Ccode dir=\"ltr\">GND\u003C\u002Fcode> وصل و برابرِ \u003Ccode dir=\"ltr\">LOW\u003C\u002Fcode> (صفر) می‌شود. پس «صفر» یعنی «فشرده».\u003C\u002Fp>\n\u003Cp>مسئله‌ی دومِ واقعی، \u003Cstrong>لرزشِ کلید\u003C\u002Fstrong> (\u003Ccode dir=\"ltr\">bounce\u003C\u002Fcode>) است. آن دو تکه فلز در لحظه‌ی برخورد چند میلی‌ثانیه به‌طور فیزیکی می‌لرزند و چند بار سریع وصل و قطع می‌شوند. برد این را چند بار فشردن می‌بیند، در حالی که تو فقط یک بار فشار داده‌ای. راه‌حل \u003Ccode dir=\"ltr\">debounce\u003C\u002Fcode> است: یا در نرم‌افزار کمی صبر می‌کنی، یا در سخت‌افزار یک خازنِ کوچک می‌گذاری.\u003C\u002Fp>\n\n\u003Ch2>کاربردهای واقعی\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>هر کلیدِ صفحه‌کلید، دکمه‌ی ریموت و دسته‌ی بازی.\u003C\u002Fli>\n\u003Cli>دکمه‌ی روشن\u002Fخاموش و دکمه‌ی \u003Ccode dir=\"ltr\">reset\u003C\u002Fcode> دستگاه‌ها.\u003C\u002Fli>\n\u003Cli>دکمه‌های آسانسور، مایکروویو و زنگِ درِ خانه.\u003C\u002Fli>\n\u003Cli>کلیکِ ماوس (که در باطن یک میکروسوییچ است).\u003C\u002Fli>\n\u003Cli>پنل‌های کنترلِ صنعتی و دکمه‌ی توقفِ اضطراری.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>در عمل: سیم‌کشی و کد\u003C\u002Fh2>\n\u003Cp>یک پایه‌ی دکمه را به \u003Ccode dir=\"ltr\">GPIO 32\u003C\u002Fcode> و پایه‌ی دیگرش را به \u003Ccode dir=\"ltr\">GND\u003C\u002Fcode> وصل کن؛ همین. مقاومتِ \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> داخلی را با آرگومان \u003Ccode dir=\"ltr\">PULL_UP\u003C\u002Fcode> فعال می‌کنیم و یادمان می‌ماند که «صفر یعنی فشرده»:\u003C\u002Fp>\n\u003Cpre class=\"code-block\" dir=\"ltr\">\u003Ccode dir=\"ltr\">import machine\nimport time\n\nbutton = machine.Pin(32, machine.Pin.IN, machine.Pin.PULL_UP)\nled = machine.Pin(25, machine.Pin.OUT)\n\nwhile True:\n    if button.value() == 0:   # 0 = feshorde\n        led.value(1)\n    else:\n        led.value(0)\n    time.sleep(0.05)\u003C\u002Fcode>\u003C\u002Fpre>\n\n\u003Ch2>اشتباه‌های رایج\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>\u003Cstrong>پایه‌ی شناور:\u003C\u002Fstrong> بدون \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> یا \u003Ccode dir=\"ltr\">pull-down\u003C\u002Fcode>، دکمه رفتارِ تصادفی و غیرقابل‌اعتماد دارد.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>وارونه‌گرفتنِ منطق:\u003C\u002Fstrong> با \u003Ccode dir=\"ltr\">pull-up\u003C\u002Fcode> یادت باشد فشرده یعنی صفر، نه یک.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>بی‌توجهی به \u003Ccode dir=\"ltr\">bounce\u003C\u002Fcode>:\u003C\u002Fstrong> بدون \u003Ccode dir=\"ltr\">debounce\u003C\u002Fcode> یک فشار ممکن است چند بار شمرده شود.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>بستنِ هر دو پایه به یک ریل:\u003C\u002Fstrong> اگر هر دو سرِ دکمه به یک سیم برود، هیچ‌وقت مداری بسته یا باز نمی‌شود.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>انتظار مقدارِ آنالوگ:\u003C\u002Fstrong> دکمه فقط دو حالت دارد؛ برای مقادیرِ پیوسته باید سراغ پتانسیومتر بروی.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\u003Ch2>همین حالا امتحان کن\u003C\u002Fh2>\n\u003Cp>دکمه را در مرورگر فشار بده و منطقِ ترکیبی را ببین: \u003Ca href=\"\u002Flab\u002Fembed\u002Fterm-1-foundations\u002Fsession-09-logic\">شبیه‌ساز منطق و دکمه را باز کن\u003C\u002Fa>. برای یادگیری کاملِ ورودی دیجیتال سراغ \u003Ca href=\"\u002Fcourses\u002Fairo\u002Flessons\u002Ft1\u002Fs08-button-input\">فصل ورودی دیجیتال: دکمه\u003C\u002Fa> برو.\u003C\u002Fp>","2026-07-18T05:30:00Z","دکمه فشاری (Pushbutton) چطور کار می‌کند، چرا پایه‌ی شناور خطرناک است، مقاومت pull-up\u002Fpull-down و مشکل bounce با راه‌حل debounce.","دکمه فشاری (Pushbutton) و پایه‌ی شناور چطور کار می‌کنند؟ | یادستان","pushbutton",50,"دکمه فشاری (Pushbutton) و رازِ پایه‌ی شناور",1784827101873]