Raspberry上でPythonでBlynkと同時に他の処理をさせてみた(threadingを使って実現)

背景

Raspberry上でIOTのツールを作成しているが、Blynkと同時に他の処理(ディスプレイの表示とか、時計を使った処理とか、タイマーを使った処理とか)を行おうとすると、なかなかうまくいかない。

ArduinoでCを使って Blynkを使う時には、

のような記述で、Blynk.run()を走らせながら、他の処理もLoopとして回すことが簡単にできるのに対し、PythonでBlynkを使う時に、Blynk.run()を実行すると、この関数からは永遠に戻ってこないため、ループが作れない。

これは仕様っぽくて、確かにBlynkを使ったPythonの参考例(githubのここ)を見ても、”# Start Blynk (this call should never return)”というコメントが記載されている。要するに、行ったきりなので、何か他の事をループとしてやらせようとすると、Threadを使って、別プロセスとして起動することが必要っぽい。

Google検索で、調べてみても、海外の投稿の中に、色々やってみたけど、PythonのBlynkは、ArduinoのBlynkに比べて、そういうのが未成熟という記述があり、「代わりに、MQTTを使ったらうまくいくよ」という内容の結論で終わっていた。

追記:

別の記事を見ていたら、このサイトに、Threadを使って、BlynkをPythonから使う例が掲載されていた。今晩試してみることにする。タイマーでの1秒毎の処理と、BlynkのVirtual Writeをthreadで走らせる形。

うまく出来た。

このサイトのやり方を真似て、threadingを使ったら、すぐにうまく出来た。なぁーんだ。

t2のThreadがユーザープログラムなので、ここで好きなプログラムを書けば、Blynk.run()が動いている状態で、問題なく動作させることができる。sleep()で待とうが、グリグリとloopを回そうが、自由にthreadで動かせる。

ここでは、一秒毎に、GPIOをトグルして、かつVirtual Pinに ms() //1000の値を送ることが出来ている。当然、スマホのBlynkアプリからのVirtual Writeに対しても問題なく反応している。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする