اولین ورودی و خروجی واقعی
برای خروجی LED، پایه را Output میکنیم:
const int ledPin = 8;
void setup() {
pinMode(ledPin, OUTPUT);
}
بعد با digitalWrite(ledPin, HIGH) و LOW وضعیت را عوض میکنیم. LED خارجی باید مقاومت محدودکننده جریان داشته باشد.
خواندن دکمه بدون ورودی معلق
یک روش ساده استفاده از Pull-up داخلی است:
const int buttonPin = 2;
void setup() {
pinMode(buttonPin, INPUT_PULLUP);
pinMode(ledPin, OUTPUT);
}
void loop() {
bool pressed = digitalRead(buttonPin) == LOW;
digitalWrite(ledPin, pressed ? HIGH : LOW);
}
دکمه بین Pin و GND است. Pull-up داخلی وقتی دکمه آزاد است پایه را HIGH نگه میدارد و با فشردن، GND آن را LOW میکند. نام pressed کمک میکند منطق معکوس در بقیه برنامه گیجکننده نباشد.
چرا مستقیم INPUT نگذاریم؟
اگر INPUT باشد و هیچ مقاومت خارجی سطح را مشخص نکند، ورودی ممکن است Floating شود. لمس سیم یا نویز محیط میتواند مقدار را تغییر دهد. این یکی از دلیلهای «خودش روشن و خاموش میشه» در پروژههای مبتدی است.
Bounce
اگر هر فشار دکمه باید فقط یک رویداد تولید کند، Bounce مکانیکی میتواند چند تغییر سریع ایجاد کند. برای پروژه اول، اگر فقط LED تا وقتی دکمه نگه داشته شده روشن است مشکل بزرگی نیست. برای شمارنده کلیک، بعدا Debounce نرمافزاری با زمان یا State Machine لازم میشود.
یک تست کوچک قبل از اتصال همه چیز
قبل از اینکه دکمه و LED را همزمان وارد برنامه کنی، خروجی و ورودی را جدا تست کن. اول یک Blink ساده روی همان ledPin اجرا کن تا مطمئن شوی LED، مقاومت و شماره پایه درستاند. بعد یک Sketch جدا بساز که فقط مقدار دکمه را روی Serial چاپ کند. وقتی هر دو بخش مستقل درست شدند، آنها را ترکیب کن. این روش «تست جزء به جزء» جلوی این را میگیرد که هنگام خطا همزمان دنبال مشکل در دکمه، LED و منطق برنامه بگردی.
تمرین
مدار دکمه→Arduino→LED را بساز و چهار وضعیت ثبت کن: دکمه آزاد/فشرده و digitalRead/LED مربوط. بعد سیم دکمه را موقتا از Pin جدا کن و ببین چرا بدون Pull-up/Pull-down ممکن است خواندن قابل اعتماد نباشد؛ این تست را فقط در مدار کمولتاژ انجام بده.