🧩 1. หลักการทำงานของ Button Switch

Button (สวิตช์กดติด–ปล่อยดับ) คืออุปกรณ์ที่ใช้ “ส่งสัญญาณควบคุม” ให้ไมโครคอนโทรลเลอร์
โดยเมื่อกดปุ่ม วงจรจะเชื่อมต่อ (short) ระหว่างสองขาเข้าด้วยกัน

  • ขณะ ไม่กดปุ่ม → วงจร “เปิด” (ไม่มีสัญญาณ)
  • ขณะ กดปุ่ม → วงจร “ปิด” (กระแสไฟผ่านได้)

ESP32 หรือ Arduino จะอ่านค่านี้เป็น:

  • HIGH (1) = มีไฟแรงดัน 3.3V หรือ 5V
  • LOW (0) = ต่อกราวด์ (0V)

🧠 2. ปัญหาที่เกิดขึ้นเมื่อไม่ใช้ตัวต้านทาน Pull-up / Pull-down

ถ้าเราต่อปุ่มกดตรง ๆ เข้าขา Input โดยไม่มีตัวต้านทาน จะเกิดสถานะที่เรียกว่า

Floating State” — ขา Input จะลอย ไม่มีค่าแน่นอน (อ่านค่าได้มั่ว HIGH หรือ LOW สลับไปมา)

🔧 วิธีแก้:

ใช้ ตัวต้านทาน (Resistor) ดึงขา Input ให้มีค่าคงที่:

  • ดึงขึ้น (Pull-up) → ให้ขาอยู่ที่ HIGH เมื่อไม่กด
  • ดึงลง (Pull-down) → ให้ขาอยู่ที่ LOW เมื่อไม่กด

🧩 3. วงจรแบบ Pull-up

📘 หลักการ:

  • เมื่อไม่กด → ขา Input ต่อกับ VCC ผ่านตัวต้านทาน → อ่านค่า HIGH
  • เมื่อกด → ขา Input ต่อกับ GND → อ่านค่า LOW

🔌 การต่อวงจร:

C++
  +3.3V

   [10kΩ]  ← Pull-up Resistor

Button───► GPIO (Input)

   GND

📘 ตัวอย่างโค้ด:

C++
const int button = 4;
const int led = 2;

void setup() {
  pinMode(button, INPUT_PULLUP); // เปิด Pull-up ภายใน
  pinMode(led, OUTPUT);
}

void loop() {
  int state = digitalRead(button);  // อ่านค่า
  if (state == LOW) {               // เมื่อกดปุ่ม (LOW)
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }
}

🔎 คำอธิบาย:

  • INPUT_PULLUP คือการเปิด Pull-up resistor ภายในบอร์ด (ไม่ต้องต่อภายนอก)
  • เมื่อไม่กด = HIGH
  • เมื่อกด = LOW

🧩 4. วงจรแบบ Pull-down

📘 หลักการ:

  • เมื่อไม่กด → ขา Input ต่อกับ GND ผ่านตัวต้านทาน → อ่านค่า LOW
  • เมื่อกด → ขา Input ต่อกับ VCC → อ่านค่า HIGH

🔌 การต่อวงจร:

C++
GPIO (Input) ─── Button ─── +3.3V

   [10kΩ]

    GND

📘 ตัวอย่างโค้ด:

C++
const int button = 4;
const int led = 2;

void setup() {
  pinMode(button, INPUT);  // ไม่มี Pull-up ภายใน
  pinMode(led, OUTPUT);
}

void loop() {
  int state = digitalRead(button);
  if (state == HIGH) {      // เมื่อกดปุ่ม (HIGH)
    digitalWrite(led, HIGH);
  } else {
    digitalWrite(led, LOW);
  }
}

🔎 คำอธิบาย:

  • ใช้ตัวต้านทาน 10kΩ ต่อจากขา Input ลง GND
  • เมื่อไม่กด = LOW
  • เมื่อกด = HIGH

🧠 5. ตารางเปรียบเทียบ Pull-up vs Pull-down

รายการPull-upPull-down
ค่าเมื่อ “ไม่กด”HIGHLOW
ค่าเมื่อ “กด”LOWHIGH
การใช้ตัวต้านทานภายในใช้ได้ (INPUT_PULLUP)❌ ไม่มีใน ESP32/UNO (ต้องต่อภายนอก)
ความนิยมใช้⭐⭐⭐⭐ (นิยมกว่า)⭐⭐
เหมาะกับปุ่มทั่วไป, สวิตช์หลายตัวเซนเซอร์ที่ส่งสัญญาณ HIGH เมื่อกด
แรงดันไฟฟ้า3.3V / 5V3.3V / 5V

🧩 6. การทดสอบผลลัพธ์ผ่าน Serial Monitor

C++
const int button = 4;

void setup() {
  Serial.begin(115200);
  pinMode(button, INPUT_PULLUP);
}

void loop() {
  int val = digitalRead(button);
  Serial.println(val);
  delay(200);
}

ผลลัพธ์:

C++
1 1 1 0 0 0 1 1 ...

เมื่อกดปุ่ม = 0
เมื่อปล่อยปุ่ม = 1


🔧 7. การแก้ปัญหาการเด้งของปุ่ม (Switch Bounce)

เมื่อกดปุ่มจริง สัญญาณอาจ “เด้ง” ไปมาหลายครั้งในไม่กี่มิลลิวินาที ทำให้ไมโครคอนโทรลเลอร์อ่านได้หลายครั้งต่อการกดครั้งเดียว

วิธีแก้:

1️⃣ ใช้ หน่วงเวลา (Software Debounce)
2️⃣ หรือใช้ ตัวเก็บประจุ (Hardware Debounce) ต่อขนานกับสวิตช์

📘 ตัวอย่างโค้ด Software Debounce:

C++
const int button = 4;
const int led = 2;
unsigned long lastPress = 0;

void setup() {
  pinMode(button, INPUT_PULLUP);
  pinMode(led, OUTPUT);
}

void loop() {
  int reading = digitalRead(button);
  if (reading == LOW && millis() - lastPress > 300) {
    lastPress = millis();
    digitalWrite(led, !digitalRead(led)); // สลับสถานะไฟ
  }
}

🧩 8. แบบฝึกหัดท้ายตอน

1️⃣ ต่อปุ่มแบบ Pull-up แล้วเขียนโค้ดเปิด LED เมื่อกดปุ่ม
2️⃣ ต่อปุ่มแบบ Pull-down แล้วเขียนโค้ดเปิด LED เมื่อกดปุ่ม
3️⃣ เขียนโค้ดให้ LED “สลับสถานะ” ทุกครั้งที่กดปุ่ม
4️⃣ เพิ่มฟังก์ชัน Serial.println() เพื่อแสดงสถานะปุ่มแบบเรียลไทม์
5️⃣ ทดลองเพิ่ม Debounce Delay แล้วเปรียบเทียบความแตกต่าง


🧾 9. สรุปแนวคิดสำคัญ

หัวข้อสรุป
Button Switchใช้สัญญาณ Digital Input (0/1)
Floating Stateสัญญาณไม่คงที่เมื่อไม่มี Pull-up/Down
Pull-upขาอยู่ที่ HIGH เมื่อไม่กด (ใช้ INPUT_PULLUP ได้)
Pull-downขาอยู่ที่ LOW เมื่อไม่กด (ต้องต่อ Resistor ภายนอก)
Debounceการหน่วงป้องกันการอ่านค่าซ้ำตอนกดปุ่ม
Best Practiceใช้ Pull-up ภายใน (INPUT_PULLUP) เพราะง่ายและเสถียรที่สุด

📘 สรุปภาพรวมการทำงานของวงจรปุ่มกด

C++
         (Pull-up)
   +3.3V ──[10kΩ]───┐

                 GPIO (Input)

                 Button

                    GND
  • ไม่กด = HIGH
  • กด = LOW