Interrupt (ISR) บน Arduino — การตอบสนองทันทีต่อเหตุการณ์

Interrupt — การขัดจังหวะการทำงานของ Arduino

Interrupt เป็นกลไกที่ทำให้ Arduino หยุดการทำงานหลักชั่วคราว เพื่อไปจัดการเหตุการณ์สำคัญที่เกิดขึ้น แล้วกลับมาทำงานต่อ — โดยไม่ต้องรอ loop()

ขา Interrupt บน Arduino

บอร์ดขา Interrupt (Digital Pin)
Uno / Nano2 (INT0), 3 (INT1)
Mega2, 3, 18, 19, 20, 21
ESP32GPIO ทุกขา (กำหนด Software)

Source Code — Interrupt สำหรับ Water Flow Sensor

volatile unsigned long pulseCount = 0;

void pulseCounter() {
  pulseCount++; // ISR — ควรสั้นที่สุด
}

void setup() {
  pinMode(2, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(2), pulseCounter, RISING);
  Serial.begin(9600);
}

void loop() {
  // ทำงานหลักต่อไปได้ ไม่ต้องคอยตรวจSensor
  checkMoisture();
  checkLight();
  checkRTC();

  // อ่านค่า Flow ทุก 10 วินาที
  static unsigned long lastFlow = 0;
  if (millis() - lastFlow > 10000) {
    noInterrupts();
    unsigned long count = pulseCount;
    pulseCount = 0;
    interrupts();

    float flow = (count / 450.0) * 6.0; // L/min
    Serial.print("Flow: "); Serial.println(flow);
    lastFlow = millis();
  }
}

ข้อควรระวังในการใช้ Interrupt (ISR Best Practices)

  • ISR ควรสั้นที่สุด — ไม่ใช้ delay(), Serial.print(), หรือ I2C ใน ISR
  • ประกาศตัวแปรที่ใช้ใน ISR เป็น volatile — เพื่อป้องกัน Compiler Optimize ผิด
  • ใช้ noInterrupts() / interrupts() — ป้องกัน Data Corrupted เมื่ออ่านค่าตัวแปรที่แชร์กับ ISR
  • ไม่เกิน 1ms ใน ISR — ทำให้ระบบหลักทำงานช้า

ตัวอย่าง — Button Debounce ด้วย Interrupt

volatile bool buttonPressed = false;
unsigned long lastDebounceTime = 0;
const int DEBOUNCE_DELAY = 50;

void buttonISR() {
  unsigned long now = millis();
  if (now - lastDebounceTime > DEBOUNCE_DELAY) {
    buttonPressed = true;
    lastDebounceTime = now;
  }
}

void setup() {
  pinMode(3, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(3), buttonISR, FALLING);
}

void loop() {
  if (buttonPressed) {
    buttonPressed = false;
    toggleWatering(); // เปิด/ปิดระบบรดน้ำ
  }
}
Tip: ใช้ Interrupt สำหรับ Event ที่ต้องการตอบสนองทันที เช่น ปุ่มฉุกเฉิน (Emergency Stop) หรือ Flow Sensor แต่สำหรับ Sensor ทั่วไป (Soil Moisture, LDR) ใช้ polling ใน loop() ก็เพียงพอ

💰 ราคาประมาณการ

อุปกรณ์ราคา
Arduino Uno R3 (แท้)~300-450 บาท
Arduino Uno R3 (เทียบ)~120-180 บาท
Arduino Nano (เทียบ)~60-100 บาท
ESP8266 NodeMCU~80-150 บาท
ESP32~150-280 บาท
Screw Shield~30-60 บาท
สาย Jumper 40 เส้น~25-50 บาท

🔋 ทางเลือกใช้แบตเตอรี่

Arduino สามารถใช้ Power Bank 5V (ผ่าน USB) หรือ แบต Li-ion 18650 จำนวน 3 ก้อนต่ออนุกรม (~12V) เข้าขา VIN สำหรับงานที่ต้องพกพาหรือไม่มีปลั๊กไฟ

🔋 แบต Li-ion 18650 3S: ~300-500 บาท (รวม charger module) — ใช้ได้ 8-24 ชม. ต่อการชาร์จ

🔋 Power Bank 5V 10000mAh: ~200-400 บาท — ใช้กับ Arduino Uno ผ่าน USB ได้ 10-20 ชม.

⚠️ หมายเหตุ: เนื้อหานี้ค้นคว้าและเรียบเรียงโดย Hermes AI — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง

⚠️ เนื้อหาถูกสร้างโดย AI (Hermes AI) — ข้อมูลทางเทคนิคอาจต้องตรวจสอบก่อนนำไปใช้งานจริง