DIY Arduino ProjectAugust 20th, 2017
หลายคนคงรู้จัก push switch ดี เนื่องจาก switch ชนิดนี้จะพบได้ในวงจรอิเล็กทรอนิกส์ทั่วไป การทำงานของมันก็คือ เมื่อเรากดปุ่ม switch จะเชื่อมวงจรไฟฟ้าเข้าด้วยกันทำให้กระแสไฟฟ้าไหลครบวงจร แต่ถ้าเราปล่อยปุ่มเมื่อไหร่วงจรก็จะขาดกระแสไฟฟ้าจะไม่ไหลนั่นเอง
บทความนี้จะนำเสนอวิธีการนำ Aruduino UNO มาใช้ร่วมกับ push switch เพื่อให้เราเปลี่ยนจาก กดติดปล่อยดับ เป็น กดติด กดดับ หรือ ทำงานที่ซับซ้อนกว่านั้นได้ เช่น กดเปิด led สีแดง กดอีกทีเปิด led สีเหลือง กดอีกที ปิด led ทั้งหมด มาเริ่มกันเลยครับ
จากวงจรด้านบน เราจะแบ่งออกได้เป็น 2 ส่วนย่อยคือ
การไหลของกระแสไฟฟ้าจะเป็นไปตาม flow ดังนี้
จะเห็นได้ว่าเมื่อใดที่เราสั่ง HIGH ที่ขา 13 ไฟ led จะไหลครบวงจรและทำให้หลอดสว่าง
การไหลของกระแสไฟฟ้าจะเป็นดังนี้
จะเห็นได้ว่าเมื่อเรากด push switch ไฟฟ้าจะไหลครบวงจรและส่งค่า HIGH เข้าไปยัง pin 8 ซึ่งเราสามารถนำไปอ่านค่าได้ต่อไป
การที่เราตังต่อตัวต้านทาน 10k กับ ground ไว้ที่ทางออกก็เนื่องจาก ขา input ของ micro controller ทั่วไป (ไม่ได้จำกัดแค่ arduino) จะเป็น high impedence ทำให้การรับไฟเข้าไม่ค่อยแน่นอน ต้องใช้การต่อ pull-up resister ช่วย ซึ่งก็คือตัวต้านทาน 10K โอห์มที่เราต่อกับ ground ไว้นั่นเอง (สามารถใช้ตัวต้านทานได้ตั้งแต่ 5K-20K)
เมื่อนำวงจรมาต่อกับ Bread board ก็จะได้หน้าตาออกมาตามข้างล่าง
โปรแกรมนี้ดูเผินๆเหมือนง่าย แค่เราตรวจจับ switch ว่าถูกกดเมื่อไหร่ (input เป็น HIGH) ก็ให้ไปเปิด led ถ้าถูกกดอีกครั้ง (input เป็น HIGH อีกครั้ง) ก็ให้ไปปิด led แต่ความจริงแล้วมันไม่ง่ายอย่างนั้นครับ
เนื่องจาก loop ที่โปรแกรมรันอยู่ มันวนเป็นพันๆครั้งต่อวินาทีเลย ตัวอย่างเช่นขณะที่เรากดปุ่มลงไปเราใช้เวลา 1 วินาทีแช่ปุ่มก่อนจะปล่อย ค่า input HIGH จะถูกนับทำให้ led เปิดปิดเป็นพันครั้งโดยที่เราไม่สามารถควบคุมได้เลย ดังนั้นเราจึงต้องใช้เทคนิคที่เรียกว่า state change เข้าตรวจสอบ switch แทนครับ ซึ่งโดยปกติแล้วการกด switch ลงไปหนึ่งครั้งจะเกิดการเปลี่ยนแปลงดังนี้
จะเห็นได้ว่า Stage change จะเกิดขึ้นตอนที่เรากำลังกด (LOW ไป HIGH) หรือกำลังปล่อย (HIGH ไป LOW) ซึ่งการเปลี่ยนแปลงนี้จะเกิดขึ้นครั้งเดียวเท่านั้นต่อการกดหนึ่งครั้ง ในที่นี้ เราจะตรวจจับสถานะปุ่มที่กำลังถูกปล่อย (HIGH ไป LOW) เพื่อเป็น trigger ในการเปิดหรือปิด led – ไปดูตัวโปรแกรมกันเลยครับ
1const int buttonPin = 8; // ขา pin ที่เราจะใช้อ่านค่าการกด push button2const int ledPin = 13; // ขา pin ที่เราใช้ส่งออกไฟไปยัง LED34int currentButtonState = LOW; // ค่าสถานะปัจจุบนของปุ่ม5int previousButtonState = LOW; // ค่าสถานะของปุ่มกดครั้งที่แล้ว6bool isLedOn = false; // ค่าสถานะของ led เริ่มต้นเป้นหลอดปิด78void setup() {9// บอกระบบว่าเราจะใช้ขา 13 เป้นตัวส่งค่าออก10pinMode(ledPin, OUTPUT);11// บอกระบบว่า เราจะใช้ขา 8 เป็นตัวรับค่าเข้ามา12pinMode(buttonPin, INPUT);13}1415void loop() {16// อ่านค่าสถานะของ push switch (ว่ากด หรือ ไม่กด)17currentButtonState = digitalRead(buttonPin);1819// ตรวจสอบกรณีที่สถานะปุ่มกดไม่เหมือนครั้งที่แล้วและครั้งนี้สถานะเป็นปล่อย20// ซึ่งก็คือปุ่มถูกกดค้างไว้และได้ถูกปล่อยออกนั่นเอง21if ((currentButtonState != previousButtonState) && previousButtonState == HIGH){22// สั่งให้ค่า led เป็นตรงกันข้าม (ถ้าเปิดให้ปิด ถ้าปิดให้เปิด)23isLedOn = !isLedOn;24// ส่งค่าไปยังขา 13 เพื่อให้เปิดหรือปิด led ตามสถานะปัจจุบัน25digitalWrite(ledPin, isLedOn);26// หน่วงเวลา 0.1 วินาทีหน่วงค่าความคลาดเคลื่อนตอนเริ่มต้นกด switch27delay(100);28}2930// จำค่าการกดปุ่ม ณ ปัจจุบันไว้ เพื่อนำไปใช้เปรียบเทียบครั้งต่อไป31previousButtonState = currentButtonState;32}
บรรทัดที่ 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 ด้านล่างได้เลยครับ
สอบถาม ติดชม เสนอแนะ ได้ที่ช่อง comment ด้านล่างเลยครับ