ESP32でBlynk(4)タイマー割り込みで処理
いよいよ、Blynkを組み込みプログラムの骨格であるタイマー割り込み処理に組み込みたいと思います。💪
いきなりプログラムです。😉
順々に見ていきましょう。
#define BLYNK_PRINT Serial #define BLYNK_USE_DIRECT_CONNECT #include <BlynkSimpleEsp32_BLE.h> #include <BLEDevice.h> #include <BLEServer.h>
// You should get Auth Token in the Blynk App.
// Go to the Project Settings (nut icon).
char auth[] = "your auth";
//タイマー関連定義
volatile int timeCounter1;
hw_timer_t *timer1 = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
//**************************************************
void IRAM_ATTR onTimer1(){
portENTER_CRITICAL_ISR(&timerMux);
timeCounter1++;
portEXIT_CRITICAL_ISR(&timerMux);
}
//**************************************************
void setup()
{
// Debug console
Serial.begin(115200);
Serial.println("Waiting for connections...");
Blynk.setDeviceName("ESP32");
Blynk.begin(auth);
//timer
timer1 = timerBegin(0, 80, true);
timerAttachInterrupt(timer1, &onTimer1, true);
timerAlarmWrite(timer1, 2000, true);
timerAlarmEnable(timer1);
}
//*************************************************
BLYNK_WRITE(V1)
{
Serial.printf("%s\n",param[0].asStr());
}
//*************************************************
BLYNK_READ(V0)
{
}
//*************************************************
void loop()
{
while(1){
if (timeCounter1 > 0) {
portENTER_CRITICAL(&timerMux);
timeCounter1--;
portEXIT_CRITICAL(&timerMux);
Blynk.run();
}
}
}
1、タイマー割り込み変数関連
volatile int timeCounter1;
volatile int timeCounter1はタイマー割り込み処理内で更新する変数になります。
この変数に関しては、volatile定義でないと外部参照した時に値が不安定になります。volatileってなぁに?って話ですが、変数を配置するアドレスを固定するってことです。
hw_timer_t *timer1 = NULL;
portMUX_TYPE timerMux = portMUX_INITIALIZER_UNLOCKED;
この部分は、おまじないです、とりあえずこういうものだと思ってください。
今回は4つあるタイマーのうちタイマー0を使います。
2、初期設定
timer1 = timerBegin(0, 80, true);
タイマー0(0)を1μS(80)毎にカウントアップ(ture)
timerAttachInterrupt(timer1, &onTimer1, true);
タイマー割り込みの処理が使う領域(timer1)、タイマー割り込みが掛かった時に呼び出す関数のアドレス(&onTimer1)、立ち上がりエッジ(ture)
timerAlarmWrite(timer1, 2000, true);
タイマー割り込みの処理が使う領域(timer1)、タイマー割り込みをかける周期を2msに(2000)、繰り返し割り込みをかける(ture)
timerAlarmEnable(timer1);
タイマー割り込みを許可
この設定は標準的なものどのCPUも同じような設定方法になりますよ。
3、タイマー割り込み関数
//**************************************************
void IRAM_ATTR onTimer1(){
portENTER_CRITICAL_ISR(&timerMux);
timeCounter1++;
portEXIT_CRITICAL_ISR(&timerMux);
}
//**************************************************
void IRAM_ATTRは定型分でその後の関数名は自分の好きなのを付けます。
portENTER_CRITICAL_ISR(&timerMux);
変数の更新
portEXIT_CRITICAL_ISR(&timerMux);
変数を更新する場合は、port....の処理を入れるというルールのようなので入れます。(なくても動くみたい)
4、ループ処理
void loop()
{
while(1){
if (timeCounter1 > 0) {
portENTER_CRITICAL(&timerMux);
timeCounter1--;
portEXIT_CRITICAL(&timerMux);
Blynk.run();
}
}
}
タイマー割り込みが掛かったら、フラグをクリアでBlynk.run()を実行します。
実行周期は2msになります。
前回、Blynk.run()の処理時間は800μsだったの処理時間は十分間に合ってます。
2msごとにBlynkを実行した場合のレスポンスも特に問題なさそうです。😙
次回はこれに、イベントドリブンの処理を追加していきます。💪
では✋
この記事が気に入ったらサポートをしてみませんか?