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を実行した場合のレスポンスも特に問題なさそうです。😙

次回はこれに、イベントドリブンの処理を追加していきます。💪

では✋



この記事が気に入ったらサポートをしてみませんか?