🔘 دکمه فشاری (Push Button)
| اسم انگلیسی | Push Button |
|---|---|
| در ووکوی (Wokwi) | wokwi-pushbutton |
| دسته | 🎛️ کلید، دکمه و ورودی |
| در شبیهساز فارسی | مود ساده (بدون کد) و مود آردوینو · رایگان |
دکمه فشاری (Push Button) یک کلید لحظهای است: تا فشارش میدهی وصل است و رهایش کنی قطع میشود. اولین ورودی هر پروژهی آردوینو همین دکمه است: زنگ در، شروع بازی، شمارنده، منو. دو چیز در آن تازهکارها را گیج میکند: چهار پایهای که دوبهدو به هم وصلاند، و منطق برعکس INPUT_PULLUP. هر دو را اینجا، هم در ووکوی و هم روی بردبورد، روشن میکنیم.
دکمه در ووکوی (Wokwi)
شناسهی قطعه wokwi-pushbutton است و با ویژگی color رنگ کلاهکش را عوض میکنی. حین اجرای شبیهسازی، با کلیک روی دکمه فشارش میدهی.
{
"version": 1,
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 0, "left": 0, "attrs": {} },
{ "type": "wokwi-pushbutton", "id": "btn1", "top": -100, "left": 160, "attrs": { "color": "green" } }
],
"connections": [
[ "btn1:1.l", "uno:2", "green", [] ],
[ "btn1:2.l", "uno:GND.1", "black", [] ]
]
}
| پایه در ووکوی | به کجا | توضیح |
|---|---|---|
1.l و 1.r | uno:2 (یکیشان کافی است) | دو پایهی یک طرف کلید، همیشه به هم وصل |
2.l و 2.r | uno:GND.1 (یکیشان کافی است) | طرف دیگر کلید؛ با فشار به طرف 1 وصل میشود |
دکمهی فشاری در تینکرکد فارسی هم، در مود ساده و مود آردوینو، رایگان است؛ پروژهی دکمه و LED نقطهی شروع خوبی است.
سیمکشی با آردوینو
دکمهی چهارپایهی واقعی را روی شیار وسط بردبورد بگذار. ترفند همیشهدرست: دو پایهی قطری را استفاده کن؛ دو پایهای که روی قطر دکمه روبهروی هماند هیچوقت از داخل به هم وصل نیستند، پس مطمئنی از دو طرف کلید برداشتهای.
| پایهی قطعه | وصل به |
|---|---|
| یک پایهی دکمه | پین 2 آردوینو (با INPUT_PULLUP) |
| پایهی قطری روبهرو | GND |
| LED با مقاومت ۲۲۰ اهم | پین 13 به GND |
اگر بهجای پولآپ داخلی مقاومت بیرونی دوست داری، یک مقاومت ۱۰ کیلواهم از پین ۲ به GND (پایینکش) بگذار و پایهی دیگر دکمه را به 5V بزن؛ آنوقت فشرده یعنی HIGH. هر دو روش درستاند، فقط شرط کد باید با سیمکشی جور باشد. روی ESP32 و پیکو هم همین منطق برقرار است، با این فرق که تغذیهشان ۳٫۳ ولت است.
کد نمونه
// Toggle an LED with each press (pin 2 to GND through the button), with debounce
const int BUTTON_PIN = 2;
const int LED_PIN = 13;
const unsigned long DEBOUNCE_MS = 30;
bool ledOn = false;
int lastReading = HIGH;
int stableState = HIGH;
unsigned long lastChange = 0;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
int reading = digitalRead(BUTTON_PIN);
if (reading != lastReading) {
lastChange = millis(); // contacts moved, start waiting
lastReading = reading;
}
if (millis() - lastChange > DEBOUNCE_MS && reading != stableState) {
stableState = reading;
if (stableState == LOW) { // a real, settled press
ledOn = !ledOn;
digitalWrite(LED_PIN, ledOn ? HIGH : LOW);
}
}
}
کد بهجای delay با millis صبر میکند، پس همزمان میتواند کارهای دیگری هم بکند. توضیح مفصلتر این روش در درس لرزش دکمه و debounce هست.
اشتباههای رایج
- دو پایهی همطرف: اگر دو پایهای را برداری که از داخل به هم وصلاند، آردوینو همیشه «فشرده» میخواند. راهحل همان پایههای قطری است.
- ورودی شناور: با
INPUTساده و بدون مقاومت، پایهی دکمهی رهاشده عدد تصادفی میدهد؛INPUT_PULLUPیا یک مقاومت ۱۰ کیلواهم پایینکش لازم است. - شرط برعکس: با پولآپ، فشرده یعنی
LOW. نوشتن== HIGHیعنی LED وقتی روشن میشود که دکمه را ول کردهای. - دکمه بین 5V و GND: دکمه را هیچوقت مستقیم بین 5V و GND نگذار؛ با فشار، اتصال کوتاه میسازی.
آموزشهای مرتبط
- ۴۰ مدار آردوینو برای ووکوی (زنگ در، پیانو، تاس)
- دکمه و وقفه با میکروپایتون روی پیکو
- مقاومت پولآپ و حذف لرزش سختافزاری
- کلید تاکتایل کوچک
سؤالهای رایج
پایههای 1.l و 1.r در دکمهی ووکوی یعنی چه؟
دکمهی ووکوی مثل دکمهی واقعی چهار پایه دارد. 1.l و 1.r دو پایهی یک طرف کلیدند و از داخل همیشه به هم وصلاند؛ 2.l و 2.r هم طرف دیگر. با فشار دادن دکمه، طرف 1 به طرف 2 وصل میشود.
چرا با INPUT_PULLUP دکمهی فشرده LOW میخواند؟
چون مقاومت داخلی پایه را به ۵ ولت میکشد و دکمه آن را به GND وصل میکند. پس بدون فشار HIGH و با فشار LOW است. در کد باید به همین برعکس بودن فکر کنی.
لرزش دکمه چیست؟
تیغههای فلزی داخل دکمه موقع فشار چند میلیثانیه چند بار باز و بسته میشوند. اگر کدت فقط تغییر را بشمارد، یک فشار ممکن است چند فشار حساب شود. با صبر کردن چند ده میلیثانیه بعد از هر تغییر این مشکل حل میشود.