แปลง push switch ให้เป็น trigger สวิตซ์ ด้วย Arduino UNO
หลายคนคงรู้จัก push switch ดี เนื่องจาก switch ชนิดนี้จะพบได้ในวงจรอิเล็กทรอนิกส์ทั่วไป การทำงานของมันก็คือ เมื่อเรากดปุ่ม switch จะเชื่อมวงจรไฟฟ้าเข้าด้วยกันทำให้กระแสไฟฟ้าไหลครบวงจร แต่ถ้าเราปล่อยปุ่มเมื่อไหร่วงจรก็จะขาดกระแสไฟฟ้าจะไม่ไหลนั่นเอง
บทความนี้จะนำเสนอวิธีการนำ Aruduino UNO มาใช้ร่วมกับ push switch เพื่อให้เราเปลี่ยนจาก กดติดปล่อยดับ เป็น กดติด กดดับ หรือ ทำงานที่ซับซ้อนกว่านั้นได้ เช่น กดเปิด led สีแดง กดอีกทีเปิด led สีเหลือง กดอีกที ปิด led ทั้งหมด มาเริ่มกันเลยครับ
วิดีโอตัวอย่างการทำงาน push สวิตซ์ กดติด กดดับ
อุปกรณ์ที่ใช้ต่อวงจร
- Board Arduino UNO r3
- push switch
- บอร์ดเอนกประสงค์ (Bread board)
- ตัวต้านทาน 5K – 20K Ohms
- หลอด LED 3.3V และ ตัวต้านทาน 220 Ohms เพื่อลดแรงดัน 5v เข้า LED
การต่อวงจร Arduino push switch กดติด กดดับ
จากวงจรด้านบน เราจะแบ่งออกได้เป็น 2 ส่วนย่อยคือ
ส่วน output จาก pin 13 ไปยังหลอด LED
การไหลของกระแสไฟฟ้าจะเป็นไปตาม flow ดังนี้
- ไฟจากขา 13 ไปยัง ตัวต้านทาน 220 โอห์ม เพื่อลดแรงดัน 5v จาก บอร์ดป้องกัน LED เสียหาย
- ไฟที่เหลือจาก ตัวต้านทาน 220 โอห์ม ไปยังขาบวก ของ LED
- จากขาลบ ของ LED เพื่อลง ground
จะเห็นได้ว่าเมื่อใดที่เราสั่ง HIGH ที่ขา 13 ไฟ led จะไหลครบวงจรและทำให้หลอดสว่าง
ส่วน input จาก pin 8 เพื่ออ่านค่าไฟเข้ามายัง board
การไหลของกระแสไฟฟ้าจะเป็นดังนี้
- กระแส 5v ต่อออกจากบอร์ดไปยัง push switch
- จาก push switch เข้าไปยัง pin 8
- จาก push switch ไปยังตัวต้านทาน 10K โอห์ม
- จาก ตัวต้านทาน 10k โอห์มไปยัง Ground
จะเห็นได้ว่าเมื่อเรากด push switch ไฟฟ้าจะไหลครบวงจรและส่งค่า HIGH เข้าไปยัง pin 8 ซึ่งเราสามารถนำไปอ่านค่าได้ต่อไป
การที่เราตังต่อตัวต้านทาน 10k กับ ground ไว้ที่ทางออกก็เนื่องจาก ขา input ของ micro controller ทั่วไป (ไม่ได้จำกัดแค่ arduino) จะเป็น high impedence ทำให้การรับไฟเข้าไม่ค่อยแน่นอน ต้องใช้การต่อ pull-up resister ช่วย ซึ่งก็คือตัวต้านทาน 10K โอห์มที่เราต่อกับ ground ไว้นั่นเอง (สามารถใช้ตัวต้านทานได้ตั้งแต่ 5K-20K)
เมื่อนำวงจรมาต่อกับ Bread board ก็จะได้หน้าตาออกมาตามข้างล่าง
Concept การทำงานของโปรแกรม switch กดติดกดดับด้วย State Change
โปรแกรมนี้ดูเผินๆเหมือนง่าย แค่เราตรวจจับ switch ว่าถูกกดเมื่อไหร่ (input เป็น HIGH) ก็ให้ไปเปิด led ถ้าถูกกดอีกครั้ง (input เป็น HIGH อีกครั้ง) ก็ให้ไปปิด led แต่ความจริงแล้วมันไม่ง่ายอย่างนั้นครับ
เนื่องจาก loop ที่โปรแกรมรันอยู่ มันวนเป็นพันๆครั้งต่อวินาทีเลย ตัวอย่างเช่นขณะที่เรากดปุ่มลงไปเราใช้เวลา 1 วินาทีแช่ปุ่มก่อนจะปล่อย ค่า input HIGH จะถูกนับทำให้ led เปิดปิดเป็นพันครั้งโดยที่เราไม่สามารถควบคุมได้เลย ดังนั้นเราจึงต้องใช้เทคนิคที่เรียกว่า state change เข้าตรวจสอบ switch แทนครับ ซึ่งโดยปกติแล้วการกด switch ลงไปหนึ่งครั้งจะเกิดการเปลี่ยนแปลงดังนี้
- ยังไม่กด – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น LOW
- ตอนกำลังกดลง – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น HIGH
- ตอนกดแช่ไว้ – สถานะครั้งก่อนเป็น HIGH สถานะปัจจุบันเป็น HIGH
- ตอนกำลังปล่อย – สถานะครั้งก่อนเป็น HIGH สถานะปัจจุบันเป็น LOW
- ตอนปล่อยแล้ว – สถานะครั้งก่อนเป็น LOW สถานะปัจจุบันเป็น LOW
จะเห็นได้ว่า Stage change จะเกิดขึ้นตอนที่เรากำลังกด (LOW ไป HIGH) หรือกำลังปล่อย (HIGH ไป LOW) ซึ่งการเปลี่ยนแปลงนี้จะเกิดขึ้นครั้งเดียวเท่านั้นต่อการกดหนึ่งครั้ง ในที่นี้ เราจะตรวจจับสถานะปุ่มที่กำลังถูกปล่อย (HIGH ไป LOW) เพื่อเป็น trigger ในการเปิดหรือปิด led – ไปดูตัวโปรแกรมกันเลยครับ
การเขียนโปรแกรมเพื่อรับค่า push switch มาปิด/เปิด led
อธิบายการทำงานของโปรแกรม
บรรทัดที่ 1-6: กำหนดค่าตัวแปรของ pin และสถานะต่างๆที่เราจะใช้
บรรทัดที่ 8-13: กำหนดค่า input/output ของ pin สวิตซ์ และ led
บรรทัดที่ 17: อ่านค่าสถานะของสวิตซ์ ณ ปัจจุบัน
บรรทัดที่ 21:
ตรวจในกรณีที่สถานะของสวิตซ์ในรอบที่แล้วไม่เหมือนปัจจุบัน และ สถานะรอบที่แล้วเป็น HIGH (แสดงว่าเพิ่งปล่อยปุ่มกด) ให้ดำเนินการบรรทัดที่ 22-27 แต่ถ้าไม่ใช่ให้ข้ามไป
ตรวจในกรณีที่สถานะของสวิตซ์ในรอบที่แล้วไม่เหมือนปัจจุบัน และ สถานะรอบที่แล้วเป็น HIGH (แสดงว่าเพิ่งปล่อยปุ่มกด) ให้ดำเนินการบรรทัดที่ 22-27 แต่ถ้าไม่ใช่ให้ข้ามไป
บรรทัดที่ 23: เปลี่ยนตัวแปรค่าสถานะ led ให้เป็นตรงกันข้าม (ถ้าเปิดให้ปิด ถ้าปิดให้เปิด)
บรรทัดที่ 25: ส่งตัวแปรค่าสถานะ led ส่งสัญญาณ output ไปยัง pin 13 เพื่อเปิดหรือปิดหลอดไฟ
บรรทัดที่ 27: หน่วงเวลาทิ้งไว้ 0.1 วินาทีเพื่อกันข้อมูลทับซ้อนกัน
บรรทัดที่ 31: จำค่าสถานะสวิตซ์รอบปัจจุบันไว้ให้เป็นค่าเก่า
หลังจากนี้โปรแกรมก็จะวน loop ไปเรื่อยๆ (บรรทัด 15) ถ้ามีการเปลี่ยนแปลงสถานะของสวิตซ์เมื่อไหร่ ค่าของ led ก็จะเปลี่ยนอีกครั้ง
เรียบร้อยแล้วครับ โปรแกรมสวิตซ์กดติดกดดับของเรา ใครมีคำถาม ข้อสงสัย ข้อเสนอแนะ ทิ้งข้อความไว้ใน comment ด้านล่างได้เลยครับ
//ที่มา www.thaiarduino.club
ผมจะทำแบบนี้แต่เป็น IR remote ทำไงดีครับ
ตอบลบ