|
| Lチカ |
お馴染みのLEDを点滅させるいわゆるLチカです。![]() LED出力を22番ピンにしました。 電流制限抵抗は220Ωです。 M5StackでLチカの記事は, Aボタンが押されたら点灯 Bボタンが押されたら消灯 みたいな記事ばかりで点滅している記事が見つかりませんでした。 別に見つからなくても全然問題ないのですぐ作ってしまいました。 タイマー割込みを使ったLチカです。 Aボタンが押されたらLチカ開始。もう一度押されたらLチカ終了。点滅周期は500msです。
#include <M5Stack.h>
enum {OFF, ON};
#define LED_PIN 22
uint8_t g_ledOut = LOW;
uint8_t g_ledBlinkMode = OFF;
hw_timer_t* g_timer = NULL;
void onTimer(){
if(g_ledBlinkMode == ON){
if(g_ledOut == LOW){
g_ledOut = HIGH;
}
else{
g_ledOut = LOW;
}
}
else{
g_ledOut = LOW;
}
}
// the setup routine runs once when M5Stack starts up
void setup(){
// Initialize the M5Stack object
M5.begin();
M5.Lcd.printf("LED blink world");
pinMode(LED_PIN, OUTPUT);
// タイマの分周
g_timer = timerBegin(0, 80, true);
// タイマ割り込みコールバック関数 onTimer を登録
timerAttachInterrupt(g_timer, &onTimer, true);
// 割り込みタイミング(ms * 1000)の設定
timerAlarmWrite(g_timer, 250000, true);
// タイマ有効化
timerAlarmEnable(g_timer);
}
// the loop routine runs over and over again forever
void loop() {
// BtnAを押したらLチカモード
if (M5.BtnA.wasPressed()) {
if(g_ledBlinkMode == OFF){
g_ledBlinkMode = ON;
}
else{
g_ledBlinkMode = OFF;
}
}
digitalWrite(LED_PIN, g_ledOut);
m5.update();
}
setup()で、タイマーの分解能 80MHz/80=1MHz にしています。またタイマーの応答関数(コールバック関数)onTimerを設定します。 タイマーの分解能が1MHzなので250msは250*1000=250000をtimerAlarmWrite()にセットします。 loop()で AボタンによるLチカのモード切替をします。 また現在出力すべきLEDのON・OFFデータを出力します。 onTimer()で、 Lチカのモードにより出力するデータを決定します。 タイマー割込みが使えるようになるといろいろな設計ができます。 |