در این درس با ورودی دیجیتال (خواندن وضعیت یک دکمهٔ فشاری) و مفهوم مقاومت Pull-up/Pull-down آشنا میشوید — همان مفهومی که در نسخهٔ میکروپایتون دیدید، اینبار با API آردوینو.
چرا به Pull-up نیاز داریم؟
یک پایهٔ ورودی که به هیچ ولتاژ مشخصی وصل نباشد، «شناور» (Floating) است و نویز محیط میتواند مقدار خواندهشده را تصادفی کند. راهحل: یک مقاومت داخلی بین پایه و ۳٫۳ ولت فعال میکنیم تا در حالت عادی (دکمه رها) همیشه HIGH بخوانیم؛ با فشردن دکمه، پایه مستقیماً به GND وصل و LOW میشود.
const int BUTTON_PIN = 4;
const int LED_PIN = 2;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
}
void loop() {
if (digitalRead(BUTTON_PIN) == LOW) { // دکمه فشرده شده
digitalWrite(LED_PIN, HIGH);
} else {
digitalWrite(LED_PIN, LOW);
}
delay(50);
}خط به خط
pinMode(BUTTON_PIN, INPUT_PULLUP);— معادلPin(4, Pin.IN, Pin.PULL_UP)در میکروپایتون: هم پایه را ورودی میکند و هم مقاومت داخلی Pull-up آن را فعال میکند، هر دو در یک دستور.digitalRead(BUTTON_PIN)— مقدار فعلی پایه را میخواند:HIGHاگر دکمه رها شده،LOWاگر فشرده شده باشد.
در حالت Pull-up: دکمهٔ رهاشده = HIGH، دکمهٔ فشرده = LOW. این برعکس چیزی است که خیلیها ابتدا انتظار دارند، اما چون از Pull-up استفاده میکنیم، دقیقاً همینطور است.
حذف لرزش کلید (Debounce)
دقیقاً مثل نسخهٔ میکروپایتون، تماس فلزی داخل دکمه هنگام فشردن چند بار خیلی سریع نوسان میکند («لرزش» یا Bounce). با نگهداشتن آخرین وضعیت در یک متغیر و تشخیص فقط لحظهٔ «تغییر»، میتوانیم فشردنهای تکراری کاذب را فیلتر کنیم.
const int BUTTON_PIN = 4;
const int LED_PIN = 2;
int counter = 0;
int lastState = HIGH;
void setup() {
pinMode(BUTTON_PIN, INPUT_PULLUP);
pinMode(LED_PIN, OUTPUT);
Serial.begin(115200);
}
void loop() {
int state = digitalRead(BUTTON_PIN);
if (state == LOW && lastState == HIGH) {
delay(30); // debounce
counter++;
digitalWrite(LED_PIN, counter % 2);
Serial.print("تعداد فشردن: ");
Serial.println(counter);
}
lastState = state;
delay(10);
}کارگاه عملی: برنامه را طوری تغییر دهید که با هر بار فشردن دکمه، یک پیام متفاوت در سریال چاپ شود (مثلاً با یک آرایه از رشتهها و شمارنده).