前回まで/次回以降の取り組みはこちらから。
どんどん続きを作っていきますよー。
今日はArduinoからRaspberryPiにデータを渡すことを考えていきます。
ここまでのおさらいと課題の整理
Arduinoにはセンサデータとして、
- 温度
- 湿度
- 大気圧
- 照度
- 土の水分量
- タンクに水があるか
が届いていて、
- 水分量的に水やりするかどうかの判断
- 水やり用ポンプの運転
をする必要があります。
RaspberryPiでは
- タイムラプス撮影
- データをIoTサービスにアップロードする
- 水やりする時刻かどうかをArduinoに指示する
(時計機能はRaspberryPiに持たせます) - 土の水分量の水やりするかどうかのしきい値をArduinoに指示する
(なにか動作を行うかどうかを判断する数値のことをしきい値といいます)
を行います。
Arduinoの開発について
本来はRaspberry PiにArduino IDEをインストールしてそこで書き込みまでできればよかったのですが、実際に環境を構築して動かしてみるとライブラリでエラーが多発することが分かりました。
少々効率が悪いですが、Arduinoのスケッチの変更・書き込みを行う際はArduino部分をWindows PCにつなぎ変えて行うことにしました。
Raspberry Pi上でArduinoの開発を行うのは今後の課題ですね。
Raspberry Pi側のソフトを作っていく
まずは
- 全画面表示のウインドウを作って
- 現在の時刻を表示する
所まで作りました。
…というか、ここまでの内容を、私の理解できる形でまとまっている情報に行きつけず、たったこれだけのことでかなり苦労したのでここでいったん区切りにしました。
Raspberry PiはRaspberry Pi OSをセットアップして、VNC接続をできる状態にしてある状態からスタートします。
セットアップについてはこちら⇩
Raspberry Piでpythonの起動は、
左上のラズベリーアイコンをクリック>[プログラミング]>[Thonny PythonIDE]をクリックします。
できた画面はこんな感じ。
pythonのソースコードはこんな感じ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #coding:utf-8 import tkinter as tk import datetime root = tk.Tk() root.attributes("-fullscreen", True) root.title("あさがおIoT観察アプリ") def window_refresh(): #時刻更新 now = datetime.datetime.now() label_time =tk.Label(root,text="現在時刻:"+now.strftime('%Y/%m/%d %H:%M:%S'),font=("Helvetica",18)) label_time.place(x=20,y=15) root.after(100,window_refresh) window_refresh() root.mainloop() |
ライブラリの「tkinter」がGUIを作るためのライブラリ、「datetime」が時刻を取得するためのライブラリです。
「root」というのがメインで表示する画面につけた名前です。
9行目から始まる「window_refresh」という関数の中で現在は時刻の更新だけをしていて、
15 | root.after(100,window_refresh) |
関数の最後に「100ms後に関数window_refreshを起動せよ」とつけることで100msごとに動くように設定しています。
今後、画面に何かを表示する動作はここに追加していくことになります。
…
で、ドはまりしたのが18行目にある
18 | root.mainloop() |
の仕様。
これ、この1行だけでwhile(1)のような、「画面表示を更新し続ける無限ループ」のようなイメージみたいです。
root.mainloop()で画面更新を無限ループしつつ、別の関数を一定時間置きとかで走らせて表示するデータの更新を行う、という使い方をするもの、と私は理解しました。
pythonに関する本も数冊持ってますし、ググってみたりもしたんですが、なかなかそのあたりを理解できるようにまとめられた情報に行きつけず何時間も苦労して、ここで力尽きました。。。
まだまだ続きます。
コメント