Interrupt — การขัดจังหวะการทำงานของ Arduino
Interrupt เป็นกลไกที่ทำให้ Arduino หยุดการทำงานหลักชั่วคราว เพื่อไปจัดการเหตุการณ์สำคัญที่เกิดขึ้น แล้วกลับมาทำงานต่อ — โดยไม่ต้องรอ loop()
ขา Interrupt บน Arduino
| บอร์ด | ขา Interrupt (Digital Pin) |
|---|---|
| Uno / Nano | 2 (INT0), 3 (INT1) |
| Mega | 2, 3, 18, 19, 20, 21 |
| ESP32 | GPIO ทุกขา (กำหนด 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 — ข้อมูลทางเทคนิคควรตรวจสอบก่อนนำไปใช้งานจริง