

ปุ่มกดเป็นอุปกรณ์ที่ดูตรงไปตรงมา คนใช้กดหนึ่งครั้งก็ควรเกิดงานหนึ่งครั้ง แต่สำหรับบอร์ด สิ่งที่เห็นคือระดับไฟฟ้าบนขาที่เปลี่ยนไป หากอ่านทุกการเปลี่ยนเป็นคำสั่งทันที การกดครั้งเดียวก็อาจถูกมองเป็นหลายเหตุการณ์ได้
ส่วนหนึ่งมาจากหน้าสัมผัสที่ยังไม่นิ่งระหว่างกดหรือปล่อย และอีกส่วนอาจมาจากวงจรรับสัญญาณที่ไม่ได้กำหนดระดับให้ชัด การใส่ delay ยาวๆ หลังเจอการเปลี่ยนอาจดูเหมือนช่วยได้ แต่ก็อาจทำให้โปรแกรมไม่ทันรับงานอื่นหรืออ่านจังหวะกดเร็วผิดไปด้วย
ก่อนเลือกเวลาหน่วงจึงควรแยกให้ชัดครับ ว่ากำลังทำให้ระดับสัญญาณนิ่งพอเชื่อถือได้ หรือกำลังตีความความตั้งใจของคนใช้จากการกดหลายจังหวะ
ถ้าปุ่มทำหน้าที่เชื่อมขาเข้ากับกราวด์ตอนกด ช่วงที่ปล่อยก็ควรมีวงจรดึงระดับไปยังค่าที่ออกแบบไว้ เช่น pull-up ที่เหมาะกับวงจร ไม่ปล่อยให้ขาไม่มีระดับแน่นอนแล้วหวังให้ซอฟต์แวร์กรองทุกอย่างแทน
ต้องตรวจด้วยว่าขาที่เลือกมี pull-up หรือ pull-down ภายในจริงหรือไม่ เอกสาร ESP32 รุ่นเดิมระบุว่าขารับอย่างเดียวบางกลุ่มไม่มีตัวดึงระดับที่เปิดด้วยซอฟต์แวร์ได้ จึงไม่ควรคัดลอกการตั้งค่าจากอีกขามาใช้แล้วถือว่าวงจรเหมือนกัน
ระดับที่ถือว่ากดต้องตรงกันทั้งวงจรกับโปรแกรม หากต่อแบบกดแล้วเป็น low แต่กำหนด active level เป็น high ความหมายของ pressed กับ released ก็จะกลับด้าน การปรับ debounce ไม่ได้แก้ความเข้าใจผิดเรื่องนี้ให้เอง

แนวทางหนึ่งของ debounce คือเมื่อพบว่าระดับเปลี่ยน ให้รอหลักฐานว่าระดับใหม่อยู่ต่อเนื่องตามเงื่อนไขที่กำหนด แล้วค่อยเปลี่ยนสถานะที่ยอมรับ ถ้าระหว่างนั้นกลับไปกลับมา ก็ยังไม่รีบส่งทุกการเปลี่ยนเป็นคำสั่งผู้ใช้
จึงควรมีทั้งระดับที่อ่านล่าสุด ระดับที่ยืนยันแล้ว และข้อมูลเวลาที่ใช้ตัดสิน แทนการเอาค่าที่อ่านครั้งเดียวไปเปลี่ยนงานปลายทางทันที เมื่อคิดแยกแบบนี้จะเห็นว่าระบบกำลังสร้างสถานะที่ผ่านการตรวจจากสัญญาณดิบอยู่
เวลาที่เหมาะสมขึ้นกับปุ่ม วงจร จังหวะอ่านและประสบการณ์ที่ต้องการ ค่าเดียวอาจทำให้บางงานช้าเกินไปหรือกรองไม่พอ จึงควรตรวจจากสัญญาณของชุดที่ใช้งานจริง ไม่ตั้งตัวเลขจากตัวอย่างแล้วอ้างว่าใช้ได้กับสวิตช์ทุกแบบ
ถ้าใช้การอ่านเป็นรอบ ระยะห่างระหว่างรอบกำหนดว่าเราจะเห็นการเปลี่ยนได้ละเอียดแค่ไหน ส่วน debounce เป็นกติกาว่าต้องรอหลักฐานแบบใดก่อนยอมรับ การลด debounce ลงมากแต่ยังอ่านห่างเหมือนเดิมจึงไม่ได้สร้างรายละเอียดสัญญาณที่ไม่เคยถูกอ่านขึ้นมา
ในทางกลับกัน การอ่านถี่มากก็ไม่ได้ทำให้ทุกค่าที่อ่านเป็นการกดใหม่ ควรส่งเหตุการณ์เมื่อสถานะที่ยืนยันเปลี่ยน ไม่เรียกงานกดซ้ำในทุก loop ที่ขายังอยู่ระดับกด หากต้องการการทำซ้ำขณะค้าง ควรเป็นกติกา repeat ที่แยกไว้อีกชั้น
วิธีรอไม่จำเป็นต้องหยุดโปรแกรมทั้งหมด อาจเก็บเวลาที่เริ่มเห็นการเปลี่ยนแล้วกลับมาตรวจในรอบถัดไป หรือใช้ component ที่ดูแลการสแกนกับ debounce ตามระบบที่เลือก จะได้ให้การสื่อสารและงานส่วนอื่นเดินต่อระหว่างรอได้
เมื่อได้สถานะ pressed กับ released ที่เชื่อถือได้แล้ว ยังมีขั้นตีความต่อว่าคนใช้ต้องการ single click, double click หรือ long press ตัวอย่าง component ปุ่มของ Espressif จึงแยกเหตุการณ์กดลง ปล่อย กดค้างและจำนวนครั้งออกจากกัน
หากต้องรองรับ double click การยืนยัน single click อาจต้องรอช่วงที่เปิดโอกาสให้กดครั้งที่สองตามกติกา ถ้าให้ single click ทำผลทันทีตั้งแต่ครั้งแรก แล้วภายหลังค่อยแจ้ง double click อีก ก็อาจเกิดสองคำสั่งจากการกระทำที่คนใช้ตั้งใจเป็นอย่างเดียว
การกดค้างก็ต้องกำหนดว่าเริ่มทำเมื่อผ่านเกณฑ์เวลา ทำซ้ำระหว่างค้างหรือไม่ และตอนปล่อยควรเกิดคำสั่งใดอีก การใช้ callback หลายตัวจึงต้องอ่านความหมายของ event ให้ครบ ไม่ผูกทุกตัวให้สั่งเปิดปิดอุปกรณ์เดียวกันโดยไม่ดูความซ้ำ

คำว่า callback ไม่ได้หมายถึง ISR เสมอไป บาง component เรียกจาก task หรือ timer ของมันเอง จึงต้องอ่านเอกสารก่อนเลือก API และวิธีส่งต่องาน เอกสารปุ่มของ Espressif ยังระบุไม่ให้ทำงานแบบ blocking เช่นหน่วง task อยู่ใน callback ของ component
หากกดแล้วต้องส่งเครือข่ายหรือบันทึกข้อมูล ควรส่งคำขอไปให้ส่วนทำงานที่เหมาะสม แล้วให้ตัวรับปุ่มกลับมาดูเหตุการณ์ต่อ ไม่ทำให้การตรวจปุ่มทั้งหมดรอจนปลายทางตอบกลับ ซึ่งอาจกินเวลาต่างกันในแต่ละครั้ง
แต่การย้ายเข้าคิวก็ต้องมีกติกาเมื่อคิวเต็มด้วย เช่น งานเปลี่ยนระดับเสียงอาจรวมสถานะล่าสุดได้ตามการออกแบบ ขณะที่คำสั่งบันทึกแต่ละครั้งอาจต้องรักษาตัวตนของงาน การทิ้งเหตุการณ์เงียบๆ จึงไม่ใช่คำตอบเดียวที่ใช้เหมือนกันทุกปุ่ม
ช่วงเริ่มบูตก็ต้องกำหนดพฤติกรรมด้วย หากเปิดเครื่องขณะปุ่มถูกกดอยู่ ควรถือเป็นการเริ่มกดใหม่หรือรอให้ปล่อยก่อนตามงาน การอ่านครั้งแรกแล้วสั่งงานทันทีอาจไม่ตรงกับสิ่งที่คนใช้ตั้งใจ จึงควรมีกรณีนี้ในนิยามสถานะเริ่มต้นด้วย
ชุดทดลองควรมีการกดสั้น กดค้าง กดติดกันและปล่อยค้าง พร้อมตรวจว่าแต่ละแบบเกิดคำสั่งกี่ครั้งตามสัญญา รวมถึงตอนที่งานเครือข่ายช้าหรือมีงานอื่นรันอยู่ เพื่อดูว่าจังหวะตรวจปุ่มยังต่อเนื่องพอหรือไม่
ถ้าต้องวัดการเด้งของสัญญาณ ควรใช้เครื่องมือและจุดวัดที่เหมาะกับวงจร แล้วเก็บเงื่อนไขของการวัดไว้ บทนี้ไม่มีรูปคลื่นจากปุ่มจริง จึงไม่มีเวลา debounce หรือผลนับที่รับรองกับอุปกรณ์ของผู้ใช้อยู่แล้ว
การอ่านปุ่มให้ตรงกับคนใช้ต้องดูตั้งแต่ระดับไฟฟ้า การยืนยันสถานะ ไปจนถึงความหมายของการกดแต่ละจังหวะ เมื่อแยก debounce ออกจาก click และ long press พร้อมส่งงานออกจากส่วนรับปุ่มอย่างเหมาะสม เราจะปรับพฤติกรรมได้มีเหตุผลขึ้น โดยไม่ต้องหยุดโปรแกรมทั้งหมดทุกครั้งที่ต้องรอสัญญาณนิ่ง