กลับไปหน้ารวมไฟล์
youve-been-using-a-button-wrong-this-whole-time-02cb7f.md

แน่นอนว่าน้องๆ คงรู้วิธีเชื่อมปุ่มกดกับ Arduino แบบพื้นฐานสุดๆ กันอยู่แล้ว ใช่ไหม? ก็ประมาณนี้แหละ:

โอเค วิธีนี้ไม่ได้ผิดอะไรนะ แต่พี่จะมาบอกวิธีที่ง่ายกว่าและดีกว่าที่น้องอาจยังไม่รู้! รับรองว่าได้ใช้แน่ๆ

จากรูปจะเห็นว่าใช้สายไฟสามเส้นกับตัวต้านทาน (Resistor) หนึ่งตัวต่อกับปุ่มกด ใช้สายสำหรับ Ground, สายสำหรับ 5V และสายที่ต่อกับขา Digital Pin พร้อมตัวต้านทาน 100 โอห์ม แต่รู้ไหมว่าเราทำงานเดียวกันนี้ได้ด้วยแค่ 2 จุดต่อ และไม่ต้องใช้ตัวต้านทานเลย! หลักการมันเป็นยังไง ตามพี่มาดู

อธิบายแบบชิวๆ:

เหตุผลที่เราต่อปุ่มกดกับ Arduino ด้วยแค่ 2 จุดต่อและไม่ต้องใช้ตัวต้านทานภายนอก มันง่ายมากเลยนะ ขออธิบายแบบเด็กช่างหน่อย: ทุกขา Digital Pin ของ Arduino มันมี "ตัวต้านทานดึงขึ้นภายใน" (internal pull-up resistor) ซ่อนอยู่แล้ว เราสามารถเรียกใช้ผ่านซอฟต์แวร์ได้เลย ตัวต้านทานพวกนี้ค่าปกติจะอยู่ที่ 20K - 50K โอห์ม วิธีการเรียกใช้ก็ง่ายมาก แค่ตั้งค่า pinMode() ของขานั้นๆ เป็น INPUT_PULLUP เท่านั้นเอง การตั้งค่านี้จะ "สลับ" ลอจิกการทำงานของขา Input นิดหน่อย คือสถานะ HIGH จะหมายถึง "ปิด" และ LOW จะหมายถึง "เปิด" พอเราใช้โหมด INPUT_PULLUP แล้ว อีกข้างขององค์ประกอบ (เช่นปุ่มกด) ก็ต้องต่อกับ Ground เท่านั้นเอง ดังนั้น การใช้ตัวต้านทานดึงขึ้นภายในของ Arduino ช่วยให้เราไม่ต้องเสียเงินซื้อตัวต้านทานเพิ่ม และยังมีข้อดีอื่นๆ อีกด้วย งานเข้าจัดไปวัยรุ่น!

วิศวะขั้นเทพ: จัดการสัญญาณ Input อย่างมืออาชีพ

โปรเจกต์ "Masterclass" นี้จะเผยความลับที่ซ่อนอยู่เบื้องหลังการเชื่อมต่อปุ่มกดแบบฟิสิคัล ไม่ใช่แค่ตรวจจับ HIGH/LOW ธรรมดาๆ แต่เป็นการควบคุมฮาร์ดแวร์ระดับโปร

  • ตรวจจับขอบสัญญาณด้วย Interrupt: แทนที่จะใช้วิธีโพล (polling) ตลอดเวลา (ซึ่งเปลือง CPU มาก) วิธีนี้ใช้ ฮาร์ดแวร์อินเตอร์รัปต์ (เช่น FALLING หรือ RISING) เพื่อตอบสนองต่อการกดปุ่มแบบเรียลไทม์ ในขณะที่ลูปหลักทำงานอื่นๆ ต่อไปได้
  • กำจัดสัญญาณรบกวนแบบขั้นสูง: อธิบายว่าทำไมแค่ใช้ delay(50) ถึงไม่พอสำหรับแอปพลิเคชันระดับมืออาชีพ มันจะใช้ State Machine ทางเวลาเพื่อยืนยันความเสถียรของสัญญาณผ่านหลายๆ ตัวอย่าง ป้องกันการกดหลอนจากสัญญาณรบกวนไฟฟ้า ห้ามช็อตนะตัวนี้!

ประสบการณ์ผู้ใช้ (UX)

  • ลอจิกหลายฟังก์ชันในปุ่มเดียว: แสดงวิธีทำ "กดค้าง" (hold 2 วินาที) และ "ดับเบิลคลิก" บนปุ่มฟิสิคัลเดียว เพิ่มขีดความสามารถของฮาร์ดแวร์ได้เป็นสามเท่าโดยไม่ต้องเพิ่มชิ้นส่วนเลย สู้งานนะน้อง!

มาลองทำกันเลย!

ตอนนี้เรารู้หลักการของตัวต้านทานดึงขึ้นภายในของ Arduino แล้ว ถึงเวลาลงมือทำจริงแล้ว ในตัวอย่างนี้เราจะใช้ LED คู่กับปุ่มกดของเราเพื่อดูการทำงาน ลองดูวงจรกัน

วงจร

จากแผนภาพเบรดบอร์ดด้านล่าง จะเห็นว่าเราใช้สายไฟเส้นหนึ่งต่อขาหนึ่งของปุ่มกดเข้ากับ Ground และอีกเส้นต่อกับขา Digital Pin 12 ดูสิว่ามันง่ายแค่ไหน! ต่อไปคือ LED ขาแอโนด (ขาที่ยาวกว่า) ต่อกับขา Digital Pin 13 และขาแคโทด (ขาที่สั้นกว่า) ต่อกับตัวต้านทานที่ต่อไปยัง Ground ต่อไปก็มาดูส่วนซอฟต์แวร์ของโปรเจกต์นี้กัน

โค้ด

น้องๆ สามารถดูโค้ดได้โดยคลิกที่ส่วนชื่อ Code ในสารบัญ อาจจะสังเกตเห็นว่า Sketch นี้ดูคล้ายกับตัวอย่าง Button ในตัวของ Arduino IDE มาก และน้องคิดถูกแล้ว มันคล้ายกันมาก แต่มีข้อแตกต่างเล็กน้อย อย่างหนึ่งคือพี่ไม่ได้ใช้ตัวแปร buttonState (แต่น้องจะใช้ก็ได้ถ้าอยาก) และตอนนี้เรามาถึงความแตกต่างที่สำคัญที่สุด ความแตกต่างที่ทำให้วิธีนี้ทำงานได้ นั่นคือแทนที่จะตั้งโหมดของปุ่มเป็น INPUT พี่ตั้งมันเป็น INPUT_PULLUP แค่นั้นเอง พี่อธิบายเหตุผลไว้แล้วในส่วน Explanation ด้านบน และยังมีการเปลี่ยนแปลงสุดท้ายอีกหนึ่งอย่างที่ต้องทำ

อย่างที่พี่บอกไปก่อนหน้า ตัว INPUT_PULLUP มันทำงานสวนทางกับโหมด INPUT นะจ๊ะน้อง หมายความว่า HIGH ในที่นี้แปลว่า "ปิด" ส่วน LOW แปลว่า "เปิด" ต่างหากล่ะ งงมะ? ฮ่าๆ

สรุปง่ายๆ: ตอนปุ่มกดยังไม่โดนกด สถานะของมันจะเป็น HIGH พอเรากดปุ่มลงไป สถานะมันจะกลายเป็น LOW ทันที

ดังนั้นในโค้ดของเรา เราต้องสั่งว่า: ถ้าปุ่มอ่านค่าได้เป็น LOW ก็ให้เปิดไฟ LED แต่ถ้าอ่านได้เป็น HIGH ก็ให้ปิดไฟ LED ไปซะ

ลองทำดูเลยวัยรุ่น! กดปุ่มที ไฟควรจะติด ปล่อยปุ่มที ไฟควรจะดับ ถ้ามันไม่เป็นงั้น... กลับไปตรวจวงจรกับโค้ดอีกรอบน้า อย่าเพิ่งช็อตนะตัวนี้!

พี่หวังว่าจากบทเรียนนี้ น้องจะได้ความรู้ใหม่ๆ ไปใช้ในโปรเจคเจ๋งๆ ของน้องต่อไปนะ สู้งานนะน้อง!

-SMM2

ข้อมูล Frontmatter ดั้งเดิม

title: "ใช้ปุ่มกดแบบผิดๆ มาตลอดรึเปล่า วัยรุ่น? มาเรียนวิธีเทพๆ กัน!"
description: "มาดูวิธีตึงๆ ที่จะใช้ปุ่มกดกับ Arduino แบบง่ายสุดๆ แต่โคตรหล่อ ด้วย Interrupt จัดไป!"
author: "SMM2"
category: "Lab Stuff"
tags:
  - "digital"
  - "button"
  - "switch"
views: 23611
likes: 4
price: 299
difficulty: "Easy"
components:
  - "1x Arduino UNO"
  - "1x Pushbutton switch 12mm"
  - "1x LED (generic)"
  - "1x Breadboard (generic)"
  - "1x Resistor 221 ohm"
  - "1x Jumper wires (generic)"
tools: []
apps:
  - "1x Arduino Web Editor"
  - "1x Arduino IDE"
downloadableFiles:
  - "https://create.arduino.cc/editor/SMM2/b36c18fa-cc78-47a8-b06e-d52a444b7303/preview"
  - "https://create.arduino.cc/editor/SMM2/b36c18fa-cc78-47a8-b06e-d52a444b7303/preview"
documentationLinks: []
passwordHash: "5926fc3d5aca82e224142dd2fb75260caa655abcdfc8598176cf941a513a4ef8"
encryptedPayload: "U2FsdGVkX1/r0i/+bHuou5nCoTs1QNE78dBMiGcBb9GU1HTLDZVKeqtD/wYGjWjgGbE1ZP7VoPtRQr+/AMf9VOGNZfDwM64HPT1HC12PuEp1mxAf3b/rNfbUarBVQ2v8"
seoDescription: "Learn the best and easiest way to use a pushbutton with your Arduino board in this tutorial. Perfect for all DIY electronics enthusiasts."
videoLinks: []
heroImage: "https://cdn.jsdelivr.net/gh/bigboxthailand/arduino-assets@main/images/projects/youve-been-using-a-button-wrong-this-whole-time-02cb7f_cover.JPG"
lang: "en"