GPIO制御、BMP280測定値の読み取りをしてみる。ArduinoやESP、Raspberryで遊ぼう。GPIO制御、BMP280測定値の読み取りをしてみる。printするところまでは、こちらで作成した。Blynkでのアカウント作成等は、ネットに一杯情報があるので、ここでは省く。RaspberryにBlynkの環境をインストールして、Tokenを登録する。Pythonから繋ぐためのライブラリがあった。Raspberryからのデータ送信周期について新しいTokenを一つ取得するスマホのBlynkアプリから、新しいデバイスを一つ登録する。3Bをとりあえず選ぶ。これが正しいのかどうかわからないが、まずこれでやってみる。デバイス名は、”RaspberryPiZero001”としておく。作成すると、登録したメールアドレスにTokenが届くので、コピーしておく。b738***********************2c1cRaspberryにBlynkの環境をインストールして、Tokenを登録する。Arduinoの時は、コンパイル済みのライブラリをIDEから読み込むだけで設定できたが、Raspberryの場合は、ソースからのコンパイルが必要らしい。wiringpi関連のヘッダーが無いとか・・・。Makefileの中を見てみたら、ちゃんと書いてあるでは無いか。--token=YourAuthToken#との事なので、まずは、WiringPiをインストールする。wiringpiがインストールされていないことを確認してみた。確かに入っていなかった。wiringPi./buildでビルド実行。正常に終了したっぽいので、再度Blynkのディレクトリに戻って、makeを実行。target=raspberryというのが重要。README.md$このように、blynkという実行ファイルが出来たので、Makefileに書いてあった通り、先程取得したTokenを登録する。91ms).正常っぽい。Blynkサーバーと接続できる環境が整った。sshでつないだ端末には、プロンプトが帰ってこないが、これはこのblynkプログラムを表のプロセスで起動したから。裏で起動することにする。追記:あとで考えたら、backgroundでの起動は駄目。makeされた結果のblynkというプログラムは、main.cppをコンパイルした結果だから、BLYNK_WRITEのprintfの書き出し先としてstdoutを使っており、backgroundで動かす事は前提としていない。呼べるライブラリでは無い。Piでも同様の事ができることは明確だが、ここでは、何とかして、Pythonのコードから、Blynkを使えるように、色々調べてみることが目的。スマホ側で、接続を確認する次にスマホのBlynkアプリを立ち上げて、今接続したRaspberryPiが接続されているかどうかを確認する。正しく、先程設定した名前で登録されているのが確認できる。何も送信していないので、この状態では何も出来ないのは当然。PiのGPIOピンをOn/OffするスマホのBlynk画面から新しくボタンを作成してGPIO24ピンに設定する。Lowと変化するのが確認出来た。ちなみに、TeratermのSSHで繋がっているシェルプロンプトから、GPIOを制御するためには、gpioコマンドを使う。High/Lowを変えても、Blynkのスマホ画面上のステータスが変化するわけでは無い。Piに何らかの数字を送ってみる。Blynkのアプリから「□」ボタンをクリックして接続を止め、新しくスライダーを追加してみる。(V1)に設定して、0から1024までの値を送るように設定した。....’の表示がなされる。main.cppの動作を確認しただけ。PythonでBlynkへつなぎたいPythonから繋ぐためのライブラリがあった。ネットでBlynkとRaspberryPi関連の情報を探したが、殆どが、C言語でコードを書くもので、また、シェルプログラムで処理する例もあったが、Pythonで制御するものは余り見つからなかった。無理かな?と思っていたら、次のページを見つけた。このリンクに、Python2あるいは3からBlynkへ接続するためのライブラリが登録されていた。pip3でインストールしてみた。バージョンがインストールできた。(0.1.3)</strong>以下略・・・・$Pythonでのコーディングサンプルは、ここにある。blynk,pyというファイルで保存した。起動すると、とりあえず、動作した。24で設定した実ピンに対しての出力は、上記のように、Warningが出て、動作しなかった。Pythonライブラリは、実ピンに対する処理はサポートされていないようだ。Pinで値を受けてから、Pythonのプログラムの中で、物理GPIOピンへの出力処理をしてあげる必要があるようだ。Pin設定した値を、Raspberryに送り、Pythonのプログラムによって処理できることは確認出来た。RaspberryのPythonプログラムからBlynkへデータを送るRaspberryから、スマホのBlynkアプリへデータを送るには、VIRTUAL_READを使う必要がある。(V2)をアサインする。“の値が5秒毎に送られ、表示させるのが確認できる。(ちなみに、//の演算子は「切り捨て除算」)Pythonを使ってBMP280から読んで補正した温度・湿度・気圧データを、Blynkへ送る次は、Raspberryに接続されたBMP280をPythonで制御し、得られた測定データ(温度、湿度、気圧)をBlynk経由でスマホへ送って表示&記録する。Readを使うと、スマホ側の読み出しトリガを基準に一つのチャンネルの読み出しトリガが発生して、一つのデータを送る・・・という事は問題なくできる。Pinに対して送る事が、今までのようなイベント型のトリガ方式で可能なのか疑問。一定のタイマーをRaspberry側で測定して、その間隔毎に、Blynkにデータを送り続ける形にするのが望ましいと思う。my_read_handler():....のやり方では駄目と思われる。@マークのデコレーターについて上記の例に於ける、@blynk.VIRTUAL_READ()は、Pythonのデコレーターと呼ばれるもので、「ある関数を修飾するための関数」とその仕組みを指す。この仕組によって、既存関数の処理の前後に自分自身の処理を付け加えることができる。これにより、ライブラリとして提供されている関数を呼んだ時に、自動的に実行される処理を追加できるという事。関数にコードを足すこと無く、機能を追加することができる。VIRTUAL_WRITE()そのものには手を付けないで、そのWrapperのような形で、それらの関数を利用しているという事になるのかと思う。便利だけど、何となくピンと来ない。Readの周期が決まる場合、このアプリを起動していない場合は、データがBlynkに送られないのでは、と思われる(要調査)。PiのPythonプログラムの中で、タイマーを設けて、そのタイマーが一定時間を経過する毎に、Virtual_Readを実行すれば、Blynkのサーバーに送られるように作りたい。(以前、ESPの時はそのように実施した。‘sendUptime’関数が呼ばれるようにした。Pythonに用意されている、threadingを使うと良さそう。threadを作り、それを実行するという処理で実現できる。関数内で定義したthreadは実行が終わると消滅するので、毎回作らなくてはいけない。threadの定義は、最初に一回目を実行するために必要。何となく、スッキリしないが、このページで少し説明されているので参考になる。(さらにこのページ)試行錯誤して、こんな感じで、5秒毎に温度、気圧、湿度をBMP280で測定して、Blynkへ送るPythonプログラムが、とりあえず出来て、所望の動作をしている。Python3で実現する」という、当初の目的は達成出来た。WH)からリモコンを出力してみる。:Threadingのやり方で、当面のマルチタスクは実現できたので、MQTTをあえて試してみる必然性は当面消えた。PiにLircをインストールして、シェルからの赤外線送信、受信が正常にできるように設定する。WiFi経由、ヘッドレス(HDMIモニター接続無し)で接続する。使い、Python3のプログラムから、下記それぞれの制御は出来るようになってきた。GPIOを、Python3で制御してLED点滅してみた。いう日の出や日の入りの時刻を計算する便利なライブラリが存在する。raspbe...記事を読むPython3から、I2Cで、BMP280を制御する。)あちこちのサイトを参考にして、一応、Pythonスクリプトが動いたので掲載する。WH)からリモコンを出力してみる。コメントをキャンセルメールアドレスが公開されることはありません。コメントデータの処理方法の詳細はこちらをご覧ください。30最近の投稿ESP8266でシリアルからWiFiとBlynk設定をしてEEPROMに保存し、割り込みでパルスを数えてBlynkで送信してみた。ArduinoやESP、Raspberryで遊ぼう。