スイッチ(2)_割込み処理
前回
ではループぶん回しの中でIF文使ってモールス練習機(?)もどきみたいなものを作りましたが、自分としてはぶん回しはカッコ悪い気がしました。割り込み処理を使ってみます。
Arduinoリファレンス の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番のピンに「CHANGE」があるとblinkが呼ばれてstateが反転する。stateをloopでLED出力している。
うーむ、これでもdigitalWriteをloopでぶん回しているわけですよね。あれかな。割り込みで呼ぶ関数では重い処理をしちゃいけないとかでこうなっているのかな?
以下は素人考えの悪い例かもしれませんが、loopのぶん回しを使わない方向で試してみました。(前回はボタンスイッチの出力をデジタル6番に入れていたのを、今回は割り込みを使うためデジタル2番に変更しています。配線の変更はそこだけです。)
loop関数の中身がないこのコードで、一応、「モールス練習機」としては問題なく動きました。
#define I_PIN 2
#define O_PIN 8
void setup() {
pinMode(I_PIN, INPUT_PULLUP);
pinMode(O_PIN, OUTPUT);
attachInterrupt(digitalPinToInterrupt(I_PIN), myfunction, CHANGE);
}
void loop() {
}
void myfunction(){
if(digitalRead(I_PIN) == HIGH){
digitalWrite(O_PIN, LOW);
}else{
digitalWrite(O_PIN, HIGH);
}
}