🧩 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
🔌 การต่อวงจร:
+3.3V
│
[10kΩ] ← Pull-up Resistor
│
Button───► GPIO (Input)
│
GND
📘 ตัวอย่างโค้ด:
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
🔌 การต่อวงจร:
GPIO (Input) ─── Button ─── +3.3V
│
[10kΩ]
│
GND
📘 ตัวอย่างโค้ด:
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-up | Pull-down |
|---|---|---|
| ค่าเมื่อ “ไม่กด” | HIGH | LOW |
| ค่าเมื่อ “กด” | LOW | HIGH |
| การใช้ตัวต้านทานภายใน | ใช้ได้ (INPUT_PULLUP) | ❌ ไม่มีใน ESP32/UNO (ต้องต่อภายนอก) |
| ความนิยมใช้ | ⭐⭐⭐⭐ (นิยมกว่า) | ⭐⭐ |
| เหมาะกับ | ปุ่มทั่วไป, สวิตช์หลายตัว | เซนเซอร์ที่ส่งสัญญาณ HIGH เมื่อกด |
| แรงดันไฟฟ้า | 3.3V / 5V | 3.3V / 5V |
🧩 6. การทดสอบผลลัพธ์ผ่าน Serial Monitor
const int button = 4;
void setup() {
Serial.begin(115200);
pinMode(button, INPUT_PULLUP);
}
void loop() {
int val = digitalRead(button);
Serial.println(val);
delay(200);
}
ผลลัพธ์:
1 1 1 0 0 0 1 1 ...
เมื่อกดปุ่ม = 0
เมื่อปล่อยปุ่ม = 1
🔧 7. การแก้ปัญหาการเด้งของปุ่ม (Switch Bounce)
เมื่อกดปุ่มจริง สัญญาณอาจ “เด้ง” ไปมาหลายครั้งในไม่กี่มิลลิวินาที ทำให้ไมโครคอนโทรลเลอร์อ่านได้หลายครั้งต่อการกดครั้งเดียว
วิธีแก้:
1️⃣ ใช้ หน่วงเวลา (Software Debounce)
2️⃣ หรือใช้ ตัวเก็บประจุ (Hardware Debounce) ต่อขนานกับสวิตช์
📘 ตัวอย่างโค้ด Software Debounce:
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) เพราะง่ายและเสถียรที่สุด |
📘 สรุปภาพรวมการทำงานของวงจรปุ่มกด
(Pull-up)
+3.3V ──[10kΩ]───┐
│
GPIO (Input)
│
Button
│
GND
- ไม่กด = HIGH
- กด = LOW
