แปลง push switch ให้เป็น trigger สวิตซ์ ด้วย Arduino UNO

 

หลายคนคงรู้จัก push switch ดี เนื่องจาก switch ชนิดนี้จะพบได้ในวงจรอิเล็กทรอนิกส์ทั่วไป การทำงานของมันก็คือ เมื่อเรากดปุ่ม switch จะเชื่อมวงจรไฟฟ้าเข้าด้วยกันทำให้กระแสไฟฟ้าไหลครบวงจร แต่ถ้าเราปล่อยปุ่มเมื่อไหร่วงจรก็จะขาดกระแสไฟฟ้าจะไม่ไหลนั่นเอง

บทความนี้จะนำเสนอวิธีการนำ Aruduino UNO มาใช้ร่วมกับ push switch เพื่อให้เราเปลี่ยนจาก กดติดปล่อยดับ เป็น กดติด กดดับ หรือ ทำงานที่ซับซ้อนกว่านั้นได้ เช่น กดเปิด led สีแดง กดอีกทีเปิด led สีเหลือง กดอีกที ปิด led ทั้งหมด มาเริ่มกันเลยครับ

วิดีโอตัวอย่างการทำงาน push สวิตซ์ กดติด กดดับ

 

อุปกรณ์ที่ใช้ต่อวงจร

การต่อวงจร Arduino push switch กดติด กดดับ

วงจร push switch กดเปิด กดปิด

จากวงจรด้านบน เราจะแบ่งออกได้เป็น 2 ส่วนย่อยคือ

ส่วน output จาก pin 13 ไปยังหลอด LED

การไหลของกระแสไฟฟ้าจะเป็นไปตาม flow ดังนี้

  1. ไฟจากขา 13 ไปยัง ตัวต้านทาน 220 โอห์ม เพื่อลดแรงดัน 5v จาก บอร์ดป้องกัน LED เสียหาย
  2. ไฟที่เหลือจาก ตัวต้านทาน 220 โอห์ม ไปยังขาบวก ของ LED
  3. จากขาลบ ของ LED เพื่อลง ground

จะเห็นได้ว่าเมื่อใดที่เราสั่ง HIGH ที่ขา 13 ไฟ led จะไหลครบวงจรและทำให้หลอดสว่าง

ส่วน input จาก pin 8 เพื่ออ่านค่าไฟเข้ามายัง board

การไหลของกระแสไฟฟ้าจะเป็นดังนี้

  1. กระแส 5v ต่อออกจากบอร์ดไปยัง push switch
  2. จาก push switch เข้าไปยัง pin 8
  3. จาก push switch ไปยังตัวต้านทาน 10K โอห์ม
  4. จาก ตัวต้านทาน 10k โอห์มไปยัง Ground

จะเห็นได้ว่าเมื่อเรากด push switch ไฟฟ้าจะไหลครบวงจรและส่งค่า HIGH เข้าไปยัง pin 8 ซึ่งเราสามารถนำไปอ่านค่าได้ต่อไป

การที่เราตังต่อตัวต้านทาน 10k กับ ground ไว้ที่ทางออกก็เนื่องจาก ขา input ของ micro controller ทั่วไป (ไม่ได้จำกัดแค่ arduino) จะเป็น high impedence ทำให้การรับไฟเข้าไม่ค่อยแน่นอน ต้องใช้การต่อ pull-up resister ช่วย ซึ่งก็คือตัวต้านทาน 10K โอห์มที่เราต่อกับ ground ไว้นั่นเอง (สามารถใช้ตัวต้านทานได้ตั้งแต่ 5K-20K)

เมื่อนำวงจรมาต่อกับ Bread board ก็จะได้หน้าตาออกมาตามข้างล่าง

Bread board push switch กดเปิด กดปิด

Concept การทำงานของโปรแกรม switch กดติดกดดับด้วย State Change

โปรแกรมนี้ดูเผินๆเหมือนง่าย แค่เราตรวจจับ switch ว่าถูกกดเมื่อไหร่ (input เป็น HIGH) ก็ให้ไปเปิด led ถ้าถูกกดอีกครั้ง (input เป็น HIGH อีกครั้ง) ก็ให้ไปปิด led แต่ความจริงแล้วมันไม่ง่ายอย่างนั้นครับ

เนื่องจาก loop ที่โปรแกรมรันอยู่ มันวนเป็นพันๆครั้งต่อวินาทีเลย ตัวอย่างเช่นขณะที่เรากดปุ่มลงไปเราใช้เวลา 1 วินาทีแช่ปุ่มก่อนจะปล่อย ค่า input HIGH จะถูกนับทำให้ led เปิดปิดเป็นพันครั้งโดยที่เราไม่สามารถควบคุมได้เลย ดังนั้นเราจึงต้องใช้เทคนิคที่เรียกว่า state change เข้าตรวจสอบ switch แทนครับ ซึ่งโดยปกติแล้วการกด switch ลงไปหนึ่งครั้งจะเกิดการเปลี่ยนแปลงดังนี้

  1. ยังไม่กด – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น LOW
  2. ตอนกำลังกดลง – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น HIGH
  3. ตอนกดแช่ไว้ – สถานะครั้งก่อนเป็น HIGH สถานะปัจจุบันเป็น HIGH
  4. ตอนกำลังปล่อย – สถานะครั้งก่อนเป็น HIGH สถานะปัจจุบันเป็น LOW
  5. ตอนปล่อยแล้ว – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น LOW

จะเห็นได้ว่า Stage change จะเกิดขึ้นตอนที่เรากำลังกด (LOW ไป HIGH) หรือกำลังปล่อย (HIGH ไป LOW) ซึ่งการเปลี่ยนแปลงนี้จะเกิดขึ้นครั้งเดียวเท่านั้นต่อการกดหนึ่งครั้ง ในที่นี้ เราจะตรวจจับสถานะปุ่มที่กำลังถูกปล่อย (HIGH ไป LOW) เพื่อเป็น trigger ในการเปิดหรือปิด led – ไปดูตัวโปรแกรมกันเลยครับ

การเขียนโปรแกรมเพื่อรับค่า push switch มาปิด/เปิด led

 

const int buttonPin = 8;     // ขา pin ที่เราจะใช้อ่านค่าการกด push button
const int ledPin =  13;      // ขา pin ที่เราใช้ส่งออกไฟไปยัง LED

int currentButtonState = LOW; // ค่าสถานะปัจจุบนของปุ่ม
int previousButtonState = LOW;        // ค่าสถานะของปุ่มกดครั้งที่แล้ว
bool isLedOn = false;                 // ค่าสถานะของ led เริ่มต้นเป้นหลอดปิด             

void setup() {
  // บอกระบบว่าเราจะใช้ขา 13 เป้นตัวส่งค่าออก
  pinMode(ledPin, OUTPUT);
  // บอกระบบว่า เราจะใช้ขา 8 เป็นตัวรับค่าเข้ามา
  pinMode(buttonPin, INPUT);
}

void loop() {
  // อ่านค่าสถานะของ push switch (ว่ากด หรือ ไม่กด)
  currentButtonState = digitalRead(buttonPin);

  // ตรวจสอบกรณีที่สถานะปุ่มกดไม่เหมือนครั้งที่แล้วและครั้งนี้สถานะเป็นปล่อย
  // ซึ่งก็คือปุ่มถูกกดค้างไว้และได้ถูกปล่อยออกนั่นเอง
  if ((currentButtonState != previousButtonState) && previousButtonState == HIGH){
      // สั่งให้ค่า led เป็นตรงกันข้าม (ถ้าเปิดให้ปิด ถ้าปิดให้เปิด)
      isLedOn = !isLedOn;
      // ส่งค่าไปยังขา 13 เพื่อให้เปิดหรือปิด led ตามสถานะปัจจุบัน
      digitalWrite(ledPin, isLedOn);
      // หน่วงเวลา 0.1 วินาทีหน่วงค่าความคลาดเคลื่อนตอนเริ่มต้นกด switch
      delay(100);
  }

  // จำค่าการกดปุ่ม ณ ปัจจุบันไว้ เพื่อนำไปใช้เปรียบเทียบครั้งต่อไป
  previousButtonState = currentButtonState;
}

อธิบายการทำงานของโปรแกรม

บรรทัดที่ 1-6: กำหนดค่าตัวแปรของ pin และสถานะต่างๆที่เราจะใช้

บรรทัดที่ 8-13: กำหนดค่า input/output ของ pin สวิตซ์ และ led

บรรทัดที่ 17: อ่านค่าสถานะของสวิตซ์ ณ ปัจจุบัน

บรรทัดที่ 21:
ตรวจในกรณีที่สถานะของสวิตซ์ในรอบที่แล้วไม่เหมือนปัจจุบัน และ สถานะรอบที่แล้วเป็น HIGH (แสดงว่าเพิ่งปล่อยปุ่มกด) ให้ดำเนินการบรรทัดที่ 22-27 แต่ถ้าไม่ใช่ให้ข้ามไป

บรรทัดที่ 23: เปลี่ยนตัวแปรค่าสถานะ led ให้เป็นตรงกันข้าม (ถ้าเปิดให้ปิด ถ้าปิดให้เปิด)

บรรทัดที่ 25: ส่งตัวแปรค่าสถานะ led ส่งสัญญาณ output ไปยัง pin 13 เพื่อเปิดหรือปิดหลอดไฟ

บรรทัดที่ 27: หน่วงเวลาทิ้งไว้ 0.1 วินาทีเพื่อกันข้อมูลทับซ้อนกัน

บรรทัดที่ 31: จำค่าสถานะสวิตซ์รอบปัจจุบันไว้ให้เป็นค่าเก่า

หลังจากนี้โปรแกรมก็จะวน loop ไปเรื่อยๆ (บรรทัด 15) ถ้ามีการเปลี่ยนแปลงสถานะของสวิตซ์เมื่อไหร่ ค่าของ led ก็จะเปลี่ยนอีกครั้ง

เรียบร้อยแล้วครับ โปรแกรมสวิตซ์กดติดกดดับของเรา ใครมีคำถาม ข้อสงสัย ข้อเสนอแนะ ทิ้งข้อความไว้ใน comment ด้านล่างได้เลยครับ