โค้ดกดสวิตช์ กดติด ปล่อยดับ
แต่ไม่ได้กดบางทีมันก็ติดเอง เป็นเพราะอะไรครับ
const int buttonPin1 = 2;
const int buttonPin2 = 4;
int ledPin = 12;
int buttonState1 = 0; //ตัวแปรสถานะของปุ่ม ตั้งค่าเริ่มต้นให้เป็น 0 ไว้ก่อน
int buttonState2 = 0;
void setup() {
pinMode(ledPin, OUTPUT); //กำหนดให้ Pin 13 เป็น Output
pinMode(buttonPin1, INPUT); //กำหนดให้ Pin 2 เป็น Input
pinMode(buttonPin2, INPUT);
Serial.begin(9600);
}
void loop(){
buttonState1 = digitalRead(buttonPin1);
buttonState2 = digitalRead(buttonPin2);
delay (300);
if (buttonState1 == LOW && buttonState2 == LOW) {
digitalWrite(ledPin, LOW);
Serial.println("0");
delay (500);
}
else if(buttonState1 == HIGH && buttonState2 == HIGH) {
digitalWrite(ledPin, HIGH);
Serial.println("1");
delay (500);
}
}
ปัญหานี้เกิดจาก 2 สาเหตุดังนี้ครับ
สาเหตุแรก ถ้าไม่ได้ต่อ R เพื่อกำหนดสถานะให้กับสวิตช์ จะต้องต่อให้ด้วย เพื่อกำหนดสถานะเป็น 0 หรือ 1 ให้กับสวิตช์ เรียกว่า pull up หรือ pull down ถ้าไม่ได้ต่อจะมีสัญญาณรบกวน
วิธีที่สะดวกที่สุดคือ pull up แบบใช้โคด จะไม่ต้องต่อ R เพิ่ม
เขียนแบบนี้
pinMode(buttonPin1, INPUT_PULLUP);
ถ้าต่อแล้ว ยังมีอีกสาเหตุเรียกว่า Debounce ครับ คือหน้าสวิตช์ไม่ได้เรียบเนียน แต่มีผิวขรุขระ ทำให้กดไป 1 ครั้ง อาจมีสถานะ 0 หรือ 1 เกิดขึ้นในเสี้ยววินาที
ถ้าโปรแกรมไม่เยอะ วิธีแก้ง่าย ๆ ใช้คำสั่ง delay(200); ไว้หลังคำสั่งอ่านค่าจากปุ่มกด
เช่น
buttonState1 = digitalRead(buttonPin1); delay(200);
แต่ถ้าโปรแกรมซับซ้อน คำสั่ง delay จะหน่วงเวลาไว้ทำให้โปรแกรมไม่รื่นไหล ใช้คำสั่ง millis() ในการหน่วงเวลาแทน ตัวอย่างตามนี้ครับ
https://www.arduino.cc/en/Tutorial/Debounce
http://wiki.t-o-f.info/Arduino/%C3%89liminationDuRebondissement