การตั้งค่าปุ่มกด
ปุ่มกด 3 ปุ่ม ใช้ตัวต้านทานแบบ Pull-down เชื่อมต่อกับขา GPIO บน MicroLearner ดังนี้:
- ปุ่ม A → GPIO 6
- ปุ่ม B → GPIO 7
- ปุ่ม C → GPIO 10
โค้ดตัวอย่างแบบง่าย
const int buttonPin = 6; // ปุ่ม A ที่ GPIO6
void setup() {
pinMode(buttonPin, INPUT); // ตั้งค่าเป็น INPUT
Serial.begin(9600); // เริ่ม Serial Monitor
}
void loop() {
if (digitalRead(buttonPin) == HIGH) { // ถ้าปุ่มถูกกด
Serial.println("Button A pressed"); // แสดงข้อความ
delay(250); // หน่วงเวลาเล็กน้อย
}
}
เพิ่มส่วนการ Debounce
โค้ดต่อไปนี้ เราจะมาพูดถึงการใช้งานปุ่มกด (Push Button) บนบอร์ด MicroLearner โดยเพิ่มเทคนิคการ “Debounce” เพื่อป้องกันการอ่านค่าสัญญาณรบกวนที่อาจเกิดขึ้นเมื่อกดปุ่ม ซึ่งเป็นปัญหาที่พบบ่อยในงานอิเล็กทรอนิกส์
โค้ดที่นำเสนอจะอยู่ในรูปแบบที่เข้าใจง่ายสำหรับผู้เริ่มต้น และมีการเพิ่มส่วนการ Debounce เข้าไป โดยยังคงโครงสร้างพื้นฐานที่ผู้ใช้สามารถปรับแต่งหรือเพิ่มการทำงานได้ตามต้องการ
โค้ดตัวอย่างพร้อมการ Debounce
// กำหนดตัวแปรสำหรับเก็บหมายเลขของพินปุ่ม
const int buttonPin1 = 6; // ปุ่ม A ที่ GPIO6
const int buttonPin2 = 7; // ปุ่ม B ที่ GPIO7
const int buttonPin3 = 10; // ปุ่ม C ที่ GPIO10
// ตัวแปรสำหรับเก็บสถานะปุ่ม (เริ่มต้นที่ 0)
int buttonState1 = 0;
int buttonState2 = 0;
int buttonState3 = 0;
// ตัวแปรสำหรับเก็บสถานะก่อนหน้าของปุ่ม (ใช้สำหรับ Debounce)
int lastButtonState1 = 0;
int lastButtonState2 = 0;
int lastButtonState3 = 0;
// ตัวแปรสำหรับเก็บเวลาที่ปุ่มถูกกดครั้งล่าสุด (ใช้สำหรับ Debounce)
unsigned long lastDebounceTime1 = 0;
unsigned long lastDebounceTime2 = 0;
unsigned long lastDebounceTime3 = 0;
// กำหนดระยะเวลา Debounce (หน่วยมิลลิวินาที)
const unsigned long debounceDelay = 50;
void setup() {
// กำหนดโหมดของพินปุ่มเป็น INPUT
pinMode(buttonPin1, INPUT);
pinMode(buttonPin2, INPUT);
pinMode(buttonPin3, INPUT);
// เริ่มการสื่อสารผ่าน Serial Monitor
Serial.begin(9600);
}
void loop() {
// อ่านค่าจากปุ่มทั้ง 3 ปุ่ม
int reading1 = digitalRead(buttonPin1);
int reading2 = digitalRead(buttonPin2);
int reading3 = digitalRead(buttonPin3);
// ตรวจสอบปุ่ม 1 พร้อม Debounce
if (reading1 != lastButtonState1) {
lastDebounceTime1 = millis(); // บันทึกเวลาที่มีการเปลี่ยนสถานะ
}
if ((millis() - lastDebounceTime1) > debounceDelay) {
if (reading1 != buttonState1) {
buttonState1 = reading1;
if (buttonState1 == HIGH) {
// ส่วนนี้สำหรับเพิ่มการทำงานเมื่อปุ่ม 1 ถูกกด
Serial.println("Button 1 pressed");
}
}
}
lastButtonState1 = reading1;
// ตรวจสอบปุ่ม 2 พร้อม Debounce
if (reading2 != lastButtonState2) {
lastDebounceTime2 = millis(); // บันทึกเวลาที่มีการเปลี่ยนสถานะ
}
if ((millis() - lastDebounceTime2) > debounceDelay) {
if (reading2 != buttonState2) {
buttonState2 = reading2;
if (buttonState2 == HIGH) {
// ส่วนนี้สำหรับเพิ่มการทำงานเมื่อปุ่ม 2 ถูกกด
Serial.println("Button 2 pressed");
}
}
}
lastButtonState2 = reading2;
// ตรวจสอบปุ่ม 3 พร้อม Debounce
if (reading3 != lastButtonState3) {
lastDebounceTime3 = millis(); // บันทึกเวลาที่มีการเปลี่ยนสถานะ
}
if ((millis() - lastDebounceTime3) > debounceDelay) {
if (reading3 != buttonState3) {
buttonState3 = reading3;
if (buttonState3 == HIGH) {
// ส่วนนี้สำหรับเพิ่มการทำงานเมื่อปุ่ม 3 ถูกกด
Serial.println("Button 3 pressed");
}
}
}
lastButtonState3 = reading3;
}
อธิบายการทำงานของโค้ด
1. การกำหนดตัวแปร
buttonPin1, buttonPin2, buttonPin3: เก็บหมายเลข GPIO ของปุ่ม A, B และ C ตามลำดับ
buttonState1, buttonState2, buttonState3: เก็บสถานะปุ่มปัจจุบัน (HIGH = กด, LOW = ไม่กด)
lastButtonState1, lastButtonState2, lastButtonState3: เก็บสถานะก่อนหน้าของปุ่ม เพื่อเปรียบเทียบการเปลี่ยนแปลง
lastDebounceTime1, lastDebounceTime2, lastDebounceTime3: เก็บเวลาที่ปุ่มเปลี่ยนสถานะครั้งล่าสุด
debounceDelay: กำหนดระยะเวลา Debounce (50 มิลลิวินาที) เพื่อกรองสัญญาณรบกวน
2.ฟังก์ชัน setup()
ตั้งค่า GPIO6, GPIO7 และ GPIO10 เป็น INPUT เพื่ออ่านสถานะปุ่ม
เริ่มการสื่อสารผ่าน Serial Monitor ที่ความเร็ว 9600 baud
ฟังก์ชัน loop()
อ่านค่าจากปุ่มด้วย digitalRead()
ใช้เทคนิค Debounce โดย:
-
- ตรวจสอบว่าสถานะปุ่มเปลี่ยนหรือไม่ (reading != lastButtonState)
-
- บันทึกเวลาที่เปลี่ยนสถานะด้วย millis()
-
- รอให้ผ่านระยะเวลา debounceDelay ก่อนยืนยันสถานะใหม่
เมื่อสถานะปุ่มเป็น HIGH (กดปุ่ม) จะพิมพ์ข้อความไปยัง Serial Monitor
การ Debounce
การ Debounce ช่วยกรองสัญญาณรบกวนที่เกิดจากการกดปุ่ม (เช่น สัญญาณกระตุก) โดยรอให้สถานะปุ่มคงที่เกิน 50 มิลลิวินาทีก่อนดำเนินการ
วิธีการเพิ่มการทำงาน
if (buttonState1 == HIGH) {
Serial.println("Button 1 pressed");
// เพิ่มโค้ดการทำงานที่นี่ เช่น digitalWrite(ledPin, HIGH);
}
ข้อดีของโค้ดนี้
- เข้าใจง่าย: โครงสร้างโค้ดชัดเจน แยกการทำงานของแต่ละปุ่ม
- ป้องกันสัญญาณรบกวน: การ Debounce ทำให้การอ่านค่าปุ่มแม่นยำขึ้น
- ปรับแต่งได้: ผู้ใช้สามารถเพิ่มการทำงานในส่วนที่ต้องการได้สะดวก