การใช้งานปุ่มกด Push Button (Pull-Down) และดีบาวซ์ (Debounce)

การใช้งานปุ่มกด Push Button (Pull-Down) และดีบาวซ์ (Debounce)

การตั้งค่าปุ่มกด

ปุ่มกด 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 มิลลิวินาทีก่อนดำเนินการ

วิธีการเพิ่มการทำงาน

หากต้องการให้ปุ่มทำอะไรเพิ่มเติม เช่น เปิดไฟ LED หรือส่งสัญญาณอื่น ๆ ให้เพิ่มโค้ดในส่วนที่ระบุว่า:
if (buttonState1 == HIGH) {
  Serial.println("Button 1 pressed");
  // เพิ่มโค้ดการทำงานที่นี่ เช่น digitalWrite(ledPin, HIGH);
}
ทำเช่นเดียวกันกับปุ่ม 2 และ 3 ในส่วนที่เกี่ยวข้อง

ข้อดีของโค้ดนี้

  • เข้าใจง่าย: โครงสร้างโค้ดชัดเจน แยกการทำงานของแต่ละปุ่ม
  • ป้องกันสัญญาณรบกวน: การ Debounce ทำให้การอ่านค่าปุ่มแม่นยำขึ้น
  • ปรับแต่งได้: ผู้ใช้สามารถเพิ่มการทำงานในส่วนที่ต้องการได้สะดวก
BESTการใช้งานปุ่มกด Push Button (Pull-Down) และดีบาวซ์ (Debounce)

Related Posts