반응형

아두이노에서 인터럽트를 사용하기 위해서는 아래와 같은 코드를 활용한다!

(레퍼런스) https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/

const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

아두이노 우노는 디지털 2,3번핀이 인터럽트 핀이다!

ESP8266보드는 특별히 인터럽트핀이 지정되어 있지는 않은 것 같다! 예를들어 D3핀을 인터럽트 핀으로 쓰고자 할때 아래와 같이 사용하려 할 것이다!

const byte ledPin = LED_BUILTIN;
const byte interruptPin = D3;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

void blink() {
  state = !state;
}

그런데 이렇게 하면 ESP8266의 인터럽트가 작동되지 않는다!

ESP8266에서는 인터럽트가 호출하는 함수에 아래와 같은 키워드를 붙혀줘야 사용가능하다(고 한다)

const byte ledPin = LED_BUILTIN;
const byte interruptPin = D3;
volatile byte state = LOW;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), blink, CHANGE);
}

void loop() {
  digitalWrite(ledPin, state);
}

ICACHE_RAM_ATTR void blink() {
  state = !state;
}

그리고 ESP8266에서 워터펌프가 물을 펌프질할때 물의 용량을 측정하기위해 사용하는 유량센서가 인터럽트를 활용하게 되는데 녹칸다의 예제 174편에서 구현된 예제가 대표적이라고 할 수 있어서 참고링크를 걸어둔다!

https://bota.tistory.com/1412

 

[아두이노#174] esp8266wifi 워터펌프&워터플로우센서(YF-S401) 제어해보기(wemos d1r1/사물인터넷(iot)시리

esp8266wifi 워터펌프&워터플로우센서(YF-S401) 제어해보기(wemos d1r1/사물인터넷(iot)시리즈#17/녹칸다/포로리야공대가자) -이번 예제의 핵심은 사물인터넷 보드 wemos d1r1에서 인터럽트를 활용할

bota.tistory.com

 

반응형
Posted by 덕력킹
,