ラズパイでpygameとurllibを使ってみる(python部分)

raspberry pi 3b+ に標準で載っているpython3を使って、簡単なシステムを作ってみます。

先日の記事で、ラズパイの環境構築までを完了させました。

環境構築の記事→https://harusamelab.com/2019/03/24/abox-raspberry-pi-3-model-b-%E3%81%AE%E7%92%B0%E5%A2%83%E6%A7%8B%E7%AF%89/

 

今回はpython3のpygameとurllibのライブラリを使って簡単なシステムを作ってみます。

raspbeanにはPythonをコーディングするためのIDEが標準搭載されていたので、それを使って作りました。

(スクショした画面)

研究室にあるポットとコーヒーの水入れ替えの時間を管理するシステム』で、下のRESETボタンを押すと時刻がリセットされるというものです。コード自体に難しいところはないと思います。

長いけどとりあえず下まで読んで!

 

長っ!!

と思われるかもしれません。ちょっとずつ説明していきます。

全体の関数の流れはこんな感じです。

プログラムの説明

まずはライブラリをインポートします。(redisが入ってますが、これは番外編で使います。)

実行前にはターミナルで、$ pip3 install (パッケージ名) でインストールしておきましょう。

 

プログラムをターミナルから実行すると、一番下の

に飛びます。

 

main()

main() は、”Escキー”または”閉じるボタン”を押すまで、ボタンの描画などの処理を無限ループで実行します。

 

まず様々な最初の設定(初期化)を行う init() を呼び出します。

その後、変わることがないUI部の描画drawUI() で行います。

そして、最後に水を変えた時間から何分経ったのかを計算するために、calcTime() を実行します。

計算後、計算された値を画面に表示します。( drawElements() 部)

次にマウスクリックやキーボード入力などのイベントがあれば、それに応じた処理をします。

バツボタン(閉じるボタン?右上のXです)を押した時、Escキーを押したときにシステムを終了。

画面内をクリックしたときは、tapAction()へ行きます。

は”Escキー”または”閉じるボタン”を押すまで、ボタンの描画などの処理を無限ループで実行します。

 

calcTime()

calcTime() では、現在時刻との差分を計算しています。

datetime 同士の引き算は、timedelta型 の返り値を持つため、特殊な実装方法です。

一度、差を秒に変換してから、日数、時分秒に変えています。もっと賢くコーディングしたい。

 

drawElements()

drawElements() では、時刻テキストの表示、リセットボタンの表示を行っています。

font.render と文字列を一度画像にレンダリングしているのは、画像でないと読み込めないというpygameの仕様みたいです。このせいでかなりコードが膨らみますね。

 

init()

init() では、初期化を行います。

まず、ディスプレイの設定を行います。本番環境はFULLSCREENなのですが、開発環境はそうだと面倒なのでコメントアウトしています。

次に、マウスポインターの設定をしています。今回はマウスポインターを非表示(透明)にするためにこのような処理を行っています。マウスポインターを非表示にする組み込み関数はあったのですが、マウスクリックが出来ない状態になってしまったので、このような実装方法を取りました。

その後は、アプリ名の指定、フォントの指定を行います。

try文からは、DBに最新のRESETボタン押下時刻を取りに行っています。接続できなかった場合はエラーコードが画面に出るので、アプリを閉じて再起動してもらうことになります。

最後の redisComponent は今は必要ないです。後の記事で必要になります。

 

drawUI()

画面上部のPOT と COFFEE を描画しています。

 

tapAction(), checkInnerTap()

tapAction()では、ボタンが押された位置によって処理を分岐させます。

ifの条件内の checkInnerTap(x, y, ‘POT’) では、グローバル変数CONST の中の POT のx座標とy座標を参照して、タップ位置が内側か否か(True or False) を返します。

もし内側であれば、次にDBに現在時刻などの情報を送ります。この処理が問題なく完了すれば、pythonを動かしている端末上の時刻の値を書き換えます。

 

postLog()

postLog()、指定したURLにボタンをクリックしたときの時刻を送信します。

まず、この関数に入ってくると、画面左上に IMG_WIFI という画像を出力します。通信中という表示です。

これ

それからPOSTデータをエンコードして、リクエストを投げます。レスポンスでエラーがなければTrueを返します。(redisComponentと書かれているところは無視してください)

 

プログラムの処理は以上になります。

Pythonのコードは以上になりますが、DB処理を行う際のPHPファイルがないのでまだ完成ではありません。

ただ少し長くなってしまったのでPHPファイルに関する説明は別記事に行います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です