見出し画像

Arduino nodeMCU 割り込み

こんにちは。tarou5555です。
今回は、前回のnodeMCU(ESP8266)で割り込みを使った話。
インターネット先生の情報だとちょい上手くいかなかったので、色々試したメモです。

やりたかったことは、ブザーを鳴らしてBメロをループしといて、ボタンを押したらサビに繋がる。です。別にこれは重要ではない。

const int button = D4;  // ボタンを接続したピン
const int pin = D5;     // ブザーを接続したピン
volatile int i = 0;     //状態を示す変数 0:何もしていない 1:割り込み
int melo = 240;         // 音の長さを指定 bpm120くらい

//割り込むやつ
void ICACHE_RAM_ATTR toggle(){//attachInterruptより前に書く & ICACHE_RAM_ATTR を付ける
 noInterrupts();
 i=i+1;
 interrupts();
}

void setup() {
 Serial.begin( 9600 );
 pinMode(button, INPUT_PULLUP);
 attachInterrupt(digitalPinToInterrupt(button),toggle,FALLING);
}

void loop() {
 if (i==0){
   melody_a();
 }else {
   i=0;
   melody_b();
 }
 delay(10);
}

//melody
void melody_a(){
   tone(pin,294,melo*3.5) ;  // レ
   delay(melo*4) ;
   tone(pin,330,melo*4) ;  // ミ
   delay(melo*4) ;
}

void melody_b(){
   tone(pin,370,melo*3) ;  // ファ♯
   delay(melo*3) ;
}

要点は
・割り込む関数をattachInterruptより前に書く
・割り込む関数にICACHE_RAM_ATTR を付ける
・割り込む関数が扱う変数にvolatileを付けとく(付けなくても動くけど)

先生情報だと、前に書かなくても、なんチャラを付けなくても動いてるっぽいんですよねー。nodeMCU特有なのか何なのかさっぱりです。

ESP-WROOM-32の方では、ICACHE_RAM_ATTR は付けなくても動きました。
tone()が無いので、ledcWriteTone(1,294);でレを鳴らした。

こんなそっくりさんでも違いが有って辛い、、
特に書き込み時にいちいちボード設定を切り替えるのが面倒です!
コンチクショウ!

良かった本

カラーで見やすいし、noteとかメモの内容が知りたいこと多めで良かった。
あと電子パーツ屋リストが載っていたので直ぐ行った。


この記事が気に入ったらサポートをしてみませんか?