กลับไปหน้ารวมไฟล์
10-buttons-using-1-interrupt-analog-ladder.md

Analog Multiplexing: 10 ปุ่มบน 1 พิน Interrupt

Arduino Uno มีพินดิจิทัลที่จำกัดอย่างมาก หากคุณต่อสายปุ่มกด 10 ปุ่มด้วยวิธีการมาตรฐาน คุณจะใช้สาย IO ทั้งหมด 10 เส้นจนหมดทันที ทำให้ไม่มีพื้นที่เหลือสำหรับ LCD, อุปกรณ์ SPI หรือ Relays เลย! เทคนิค 10 Buttons Using 1 Interrupt ใช้การมัลติเพล็กซ์แบบแอนะล็อก 'Resistor Ladder' ขั้นสูง ผสมผสานกับฮาร์ดแวร์เกตอันชาญฉลาด โดยบังคับให้ปุ่มทั้ง 10 ปุ่มทำงานผ่านพิน Analog Input เพียงเส้นเดียว (A0) ขณะเดียวกันก็ต่อสายทริกเกอร์หลักเข้ากับ Hardware Interrupt Pin 2 โดยตรง ทำให้การใช้พินลดลงจากสิบเส้นเหลือเพียงแค่ สอง เส้น!

invisible_mess_glasses_relay_schema_1772681179521.png

Resistor Ladder Matrix (analogRead())

แทนที่จะให้แต่ละปุ่มรับแรงดัน 5V ปุ่มเหล่านี้จะถูกต่ออนุกรมผ่าน Resistors ที่มีค่าต่างกัน (เช่น 1K, 2K, 3K, 4K...)

  1. เมื่อกดปุ่ม 1 สัญญาณจะผ่าน Resistors ทั้งหมดไป ส่ง 5V (Analog 1023) เข้าสู่พิน A0 โดยตรง
  2. เมื่อกดปุ่ม 5 กระแสจะไหลผ่าน 4,000 โอห์ม ทำให้ส่ง 2.5V (Analog 512) ไปยังพิน A0 อย่างแม่นยำ
  3. Arduino จะเปรียบเทียบค่าแรงดันที่เข้ามากับอาร์เรย์ทางคณิตศาสตร์ที่กำหนดไว้ เพื่อระบุว่ากดปุ่มใดกันแน่ โดยใช้เพียงพินเดียว!

ทริกเกอร์ Hardware Interrupt ขั้นสูงสุด

หาก Arduino เพียงแค่รัน analogRead(A0) ใน loop() มันจะสิ้นเปลือง Clock Cycles จำนวนมากไปกับการ Poll ปุ่มที่ไม่ได้ใช้งาน

  • มีการสร้างเมทริกซ์ลอจิก Diode OR Gate ขึ้น!
  • เอาต์พุตของปุ่มทุกปุ่มยังถูกต่อผ่าน Diode (เพื่อป้องกัน Backfeed) ตรงไปยัง Digital Pin 2
  • เมื่อ ใด ๆ กระแสจะไหลไปยัง Analog Pin เพื่อวัดค่า แต่ในขณะเดียวกันก็ทริกเกอร์ Hardware Interrupt บน Pin 2!
void setup() {
  // รอจนกว่าฮาร์ดแวร์จะตรวจพบแรงดันที่พุ่งขึ้น!
  attachInterrupt(digitalPinToInterrupt(2), buttonWakeISR, RISING);
}

void buttonWakeISR() {
  int rawAnalog = analogRead(A0); // ดึงค่าแรงดันมาทันที!
  
  if (rawAnalog > 950) targetButton = 1;
  else if (rawAnalog > 800) targetButton = 2;
  // ... การอนุมานค่าแรงดันเป็นลำดับขั้นขนาดใหญ่!
  
  actionRequired = true; // ส่งสัญญาณให้ Loop ทำงานหลัก!
}

ฮาร์ดแวร์วงจรแบบบีบอัด

  • Arduino Uno / Nano / Pro Mini
  • ปุ่มกด Tactile จำนวน 10 ปุ่ม
  • Resistors ที่มีความแม่นยำสูง 1% Tolerance จำนวนมาก (เช่น 1K โอห์ม) Resistors ทั่วไปที่มี 5% Tolerance อาจทำให้ค่าแรงดันคาบเกี่ยวกันอย่างมาก สร้างการชนกันของลอจิกที่เป็นไปไม่ได้ ซึ่งทำให้ปุ่ม 6 ดูเหมือนกับปุ่ม 7 ได้!
  • Switching Diodes (1N4148) จำนวน 10 ตัว (มีความสำคัญอย่างยิ่งในการสร้าง Master Trigger Bus โดยไม่ทำให้ค่า Resistor Ladder ลัดวงจรเข้าด้วยกัน!)

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

title: "10 Buttons Using 1 Interrupt"
description: "Extreme pin conservation matrix! Mathematically compress a massive 10-button analog resistor network into a single hardware interrupt boundary, eliminating polling lag while radically freeing up 9 digital IO pins for complex peripheral routing."
category: "Circuit Design"
difficulty: "Advanced"