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とかメモの内容が知りたいこと多めで良かった。
あと電子パーツ屋リストが載っていたので直ぐ行った。