# Button "Bounce" Principles

การเชื่อมต่อ push button switch เพื่อเป็นอินพุตไปยังไมโครคอนโทรลเลอร์เป็นเรื่องที่ไม่ยาก แต่ก็จะเกิดปัญหาในบางครั้ง ซึ่ง ปัญหาหลักคือสวิตช์จะมีการกระเด้ง (Bouncing) ซึ่งหมายถึง เมื่อมีการกด (หรือปล่อย) push button switch มันจะมักเปลี่ยนระดับสองครั้งก่อนที่จะคงที่ที่ระดับใหม่ ดังนั้นถ้าเชื่อมต่อสวิตช์กับขาที่เปิดใช้งาน interrupt ภายนอก เมื่อมีการกดปุ่มครั้งเดียว มีโอกาสที่จะได้รับสัญญาณ interrupts หลายครั้งซ้อนกัน ทำให้โปรแกรมอาจจะเข้าใจผิดว่ามีการกดเกิดขึ้นหลายครั้ง โดยทั่วไปประมาณ 10 ถึง 100 ครั้งในช่วงเวลาประมาณ 1 มิลลิวินาที *("The Art of electronics", Horowitz & Hill, Second edition, p. 506)* ดังแสดงในรูป

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FVQ1gs63EYjkvmmOa67sq%2Fbutton_bounce.jpeg?alt=media&#x26;token=48fb3b27-0a8e-483c-8c10-de41c91f286a" alt=""><figcaption></figcaption></figure>

หนึ่งในเทคนิคที่ถูกนำใช้เพื่อจัดการกับปัญหานี้คือ ให้มีการตรวจสอบ (check/poll) ค่าสถานะของ push button switch เป็นระยะๆ และตัดสินใจว่า push button switch ได้ถูกกดอยู่ ถ้าหากมันอยู่ในสถานะที่ถูกกดเป็นครั้งที่สอง

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

<figure><img src="https://1856353139-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2F-MClo3nC-1US0rbK8Qau%2Fuploads%2FsV9Ut0b6bklna891kp5h%2Fresistor.jpg?alt=media&#x26;token=ed8e45cd-a7d5-4978-a575-6963b75b445a" alt=""><figcaption></figcaption></figure>

เนื่องจากไมโครคอนโทรเลอร์ มีตัวต้านทาน pull-up ภายใน เรามักจะเลือกการตั้งค่าที่มีสถานะต่ำที่แสดงอยู่ทางซ้ายในภาพ เราสามารถข้ามตัวต้านทานภายนอกและเปิดใช้งานตัวต้านทาน pull-up ภายในแทน
