مبتدی⏱ 14 دقیقه مطالعه

در این درس با ورودی دیجیتال (خواندن وضعیت یک دکمهٔ فشاری) و مفهوم مقاومت Pull-up/Pull-down آشنا می‌شوید — همان مفهومی که در نسخهٔ میکروپایتون دیدید، این‌بار با API آردوینو.

چرا به Pull-up نیاز داریم؟

یک پایهٔ ورودی که به هیچ ولتاژ مشخصی وصل نباشد، «شناور» (Floating) است و نویز محیط می‌تواند مقدار خوانده‌شده را تصادفی کند. راه‌حل: یک مقاومت داخلی بین پایه و ۳٫۳ ولت فعال می‌کنیم تا در حالت عادی (دکمه رها) همیشه HIGH بخوانیم؛ با فشردن دکمه، پایه مستقیماً به GND وصل و LOW می‌شود.

CPP
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). با نگه‌داشتن آخرین وضعیت در یک متغیر و تشخیص فقط لحظهٔ «تغییر»، می‌توانیم فشردن‌های تکراری کاذب را فیلتر کنیم.

CPP
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);
}
شبیه‌سازی زندهٔ دکمه و LED — دقیقاً همان پایه‌های BUTTON_PIN=4 و LED_PIN=2 و منطق INPUT_PULLUP که در این درس دیدید باز کردن در Wokwi ↗
در حال بارگذاری شبیه‌ساز… (ممکن است چند ثانیه طول بکشد)

این یک شبیه‌سازی واقعی و قابل اجراست؛ روی دکمه پخش (▶) در Wokwi بزنید تا کد روی برد مجازی ESP32 اجرا شود. اگر جعبهٔ بالا بیش از حد سیاه/خالی ماند، صفحه را رفرش کنید یا از دکمهٔ «باز کردن در Wokwi» بالا استفاده کنید.

🛠️ کارگاه عملی

کارگاه عملی: برنامه را طوری تغییر دهید که با هر بار فشردن دکمه، یک پیام متفاوت در سریال چاپ شود (مثلاً با یک آرایه از رشته‌ها و شمارنده).

❓ در حالت INPUT_PULLUP، وقتی دکمه فشرده می‌شود digitalRead() چه مقداری برمی‌گرداند؟
طراحی و توسعه: امین شیخ نجدیglcd.ir | نسخهٔ افزونه: 1.21.0