Grove IoT スターターキット for SORACOMで遊んでみるの続き。
今度はボタンでの入力とそれ契機でブザーでも鳴らしてみようかと思う。
ボタン、ブザーの各スケッチ例を見てみると、どっちもWIOLTE_D38を使うように書いてる。
これを共存したい場合にどこに刺したらいいんだ?
####〇ブザー
とりあえずブザーをD20に刺して試してみる
#define BUZZER_PIN (WIOLTE_D20)
DFUモードだとうるさいのだが、通常モードにすると鳴らない。
ログを入れてみるとloopはしている
とりあえずブザーをD38に刺してみる
DFUモードでも鳴らない。
うるさかったのはD20端子がHIGHになってるってことだったのかな。
D38を使った場合だと、ちゃんと想定通りに鳴る。
にしても、音量がうるさいな。
調べてみるとsetupで
Wio.PowerSupplyGrove(true);
を実行しないといけないらしい。
#define BUZZER_PIN (WIOLTE_D20)
void setup()
{
SerialUSB.println("setup Start");
Wio.Init();
Wio.PowerSupplyGrove(true);
pinMode(BUZZER_PIN, OUTPUT);
delay(500);
SerialUSB.println("setup OK");
}
※loopはスケッチのまま
これで実行してみたら想定通りの動きに。
####〇ボタン+ブザー
ブザーが上手くいったのでボタンも試す。
足し方としては、ボタンのスケッチ例にブザー出力処理を追加。
void change_state()
{
State = !State;
StateChanged = true;
}
void setup()
{
Wio.Init();
Wio.PowerSupplyGrove(true);
pinMode(BUTTON_PIN, INPUT);
attachInterrupt(BUTTON_PIN, change_state, RISING);
pinMode(BUZZER_PIN, OUTPUT);
}
attachInterrupt
外部割り込みが発生したときに実行する関数を指定します。すでに指定されていた関数は置き換えられます。呼び出せる関数は引数と戻り値が不要なものだけです。
これでボタン操作による状態変化を割り込ませるって感じみたい。
これについては特に難しいことはなく、あっさりと実現。
#include <WioLTEforArduino.h>
// You can use WIOLTE_(D20|A4|A6) with `Wio.PowerSupplyGrove(true);`
#define BUTTON_PIN (WIOLTE_D38)
#define BUZZER_PIN (WIOLTE_D20)
#define BUZZER_ON_TIME (100)
#define BUZZER_OFF_TIME (3000)
#define COLOR_ON 127, 127, 127
#define COLOR_OFF 0, 0, 0
WioLTE Wio;
volatile bool StateChanged = false;
volatile bool State = false;
void change_state()
{
State = !State;
StateChanged = true;
}
void setup()
{
SerialUSB.println("setup Start");
Wio.Init();
Wio.PowerSupplyGrove(true);
pinMode(BUTTON_PIN, INPUT);
attachInterrupt(BUTTON_PIN, change_state, RISING);
pinMode(BUZZER_PIN, OUTPUT);
SerialUSB.println("setup OK");
}
void loop()
{
if (StateChanged) {
SerialUSB.print(State ? '*' : '.');
if (State) {
Wio.LedSetRGB(COLOR_ON);
Buzzer_ON();
}
else {
Wio.LedSetRGB(COLOR_OFF);
}
StateChanged = false;
}
}
void Buzzer_ON()
{
SerialUSB.println("Buzzer_ON start");
digitalWrite(BUZZER_PIN, HIGH);
delay(BUZZER_ON_TIME);
digitalWrite(BUZZER_PIN, LOW);
SerialUSB.println("Buzzer_ON end");
}
##所感
・通常時は特に問題ないのだが、DFUモードだとD20に刺したブザーがずっとうるさい。
・ブザーのボリュームを変更したい。今のところHIGH/LOWしかないのでON/OFFにしかならない?
・全体的にはやはり簡単。