BlynkとRaspberry piを繋ぐ(7)Lチカしよう

今回はマイコンの基本!

BlynkでLチカをやってみます。💪

なんだ、そんなの簡単だよ!って思うかもしれませんが、さてどうします?

BlynkのシステムってBlynkから指令がきて、ワンショットの処理しかできません。😅

Lチカって定期的にポートをon/offしないとできませんよね?🧐

メインにループしている箇所があるけど、ここにウェイトを入れてon/offするのはカッコ悪いし、なんといってもBlynkから指令を受けるルーチンの呼び出しにも影響あるし、ウェイトでCPUを遊ばせるのもねぇ〜😱

int main(int argc, char* argv[])
{
   parse_options(argc, argv, auth, serv, port);
   setup();
   while(true) {
       loop();
//ここに入れるのはイマイチだよね。
   }
   return 0;
}

main.cppを見ていると、定期的に呼び出されている箇所があるんです。

BlynkとRaspberry piを繋ぐ(5)表示系ガジェットを使ってみる

で紹介した、モジュールに組み込んでおけば定期的に実行されるようです。

void setup()
{
   Blynk.begin(auth, serv, port);
   tmr.setInterval(1000, [](){
     Blynk.virtualWrite(V0, BlynkMillis()/1000);
     
//ここ
      
   });
}

tmr.setInterval(1000,[])で1000は呼び出し時間になります。1000がセットされているので1秒ってことです。

LEDを点滅するモジュールを作成して、LED点滅のon/offをBlynkでコントロールするソフトを追加しましょう。

モジュール間のデータやり取りにはグローバル変数が必要になりますが、グローバル変数が増えすぎると管理が大変になるので、LEDを点滅させるクラスを作って変数をカプセル化してしまいましょう。

class GP
{
 private:
 uint16_t Pstatus=0;
 uint16_t Pvalue =0;  
   
 public:
uint16_t branking()
 {   
     char command[64]="";   
     Pvalue =(Pvalue ^1) & Pstatus;
     printf("LED->%d\n",Pvalue);
     sprintf(command,"/home/pi/blynk/GPOUT.sh 4 %d",Pvalue);
     system(command);
     return(Pvalue);
 };
uint16_t pstatus_set(uint16_t s)
{
    Pstatus = s;
    return(s);
};
};

pstatus_set(1)で点滅、pstatus_set(0)で消灯になります。

branding()モジュールは常に点滅しているのですが、

Pvalue =(Pvalue ^1) & Pstatus;

の部分でスイッチon/offので点滅をマスクしています。(if文を減らしたいので)

組み込んだプログラムがこんな感じ。

class GP
{
 private:
 uint16_t Pstatus=0;
 uint16_t Pvalue =0;  
   
 public:
uint16_t branking()
 {   
     char command[64]="";   
     Pvalue =(Pvalue ^1) & Pstatus;
     printf("LED->%d\n",Pvalue);
     sprintf(command,"/home/pi/blynk/GPOUT.sh 4 %d",Pvalue);
     system(command);
     return(Pvalue);
 };
uint16_t pstatus_set(uint16_t s)
{
    Pstatus = s;
    return(s);
};
};

GP Gp4;

BLYNK_WRITE(V4)
{

//Blynkから送られてきたSWの状態を格納
   Gp4.pstatus_set(param[0].asInt());
}
void setup()
{
   Blynk.begin(auth, serv, port);
   tmr.setInterval(1000, [](){
     Blynk.virtualWrite(V0, BlynkMillis()/1000);
     
//点滅表示
      Gp4.branking();
      
   });
}

(点滅動画を貼り付けようを思ったのですが、動画の貼り付け方法はまだ分からないので後日😅)

このようにtmr.setInterval(1000,[])に組み込んでやれば、定期的に実行することができます。✌️

これ、結構重要で、センサの値を読むときもBlynkからの指令でワンショットで読んでしまうと、ノイズなどの影響でとんでもない値が出てくることがあります。

その回避の手法としては、移動積分という計測方法を使いますので、このモジュールで定期的に呼び出し移動積分をしておきBlynkからの指令が来たら、移動積分の値を返信するといった手法が良いです。💯

この辺はまた後日解説します。

では✋


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