アメグラ2号のブログ

1980年代後半の古き良きビデオゲームのほか、オッサンの個人的備忘録

ラズパイ 撮影画像、温度測定データをブラウザに表示

f:id:game-allergy:20210417234310j:plain

ラズパイゼロで、温度測定をしてDBに格納できた。となると、もう少し分かりやすく表示したいものだ。

そうだ、ラズパイ4に入れたnginxとphpのようにデータを表示できないだろか?そうだ、やってみよう。

ゼロにさせたいお仕事は、定時にカメラ撮影、温度湿度測定、ブラウザ表示だ。ラズパイなら常時電源オンにしておけるから連続測定と情報の表示が可能になる。こりゃ面白そうだ。

ラズパイゼロって処理能力の面からそんなにたいしたことはできないって言うが…どこまでできるのか?

で、今回ラズパイゼロに入れたのは、

nginx, php7.3-fpmと、以前にやったことと同じ。ただ、ゼロで動くのか?は分からん。ま、やってみよう。


で、動いたね。

◆ブラウザで撮影画像を表示

f:id:game-allergy:20210417230044j:plain f:id:game-allergy:20210417231359j:plain


◆ブラウザで温度・湿度のデータを表示

f:id:game-allergy:20210417221928j:plain

phpでDBにアクセスしてデータを取り出すのはやったことがなかった。直近はpythonをいじっていたのでphpとかすっかり忘れてた…。phpってちょっと独特だな~と改めて実感。

DBから取り出したデータをfetchall()でそのままprintしたら↓になった…これはダメだろ。

f:id:game-allergy:20210417221854j:plain


phpsqliteでハマった

最初はcould not find driverと出た。あれぇ、なんで?ググったら結構な人がこれでハマってたみたいで。
で、以下のように入れなおして解決した。(php7.3使っているので)

$ sudo apt-get install php7.3-sqlite3

◆とりあえずできたこと

・気温と湿度を取得し、DBへ格納する

・カメラで静止画を撮影する

・静止画をフォルダに保存

PHPでフォルダ内をなめて、ブラウザにリスト表示する(画像リンク入り)

・気温と湿度のデータをDBから取得し、PHPでブラウザに表示


だいたい出そろってきた。とりあえずやりたいのが、カメラによる定点観測、同時に温度・湿度測定、情報は自宅内のwi-fiでブラウザにアクセスして見たい(観測する部屋と寝る部屋が違う→プチ遠隔操作)あ、あと夜間は暗いからLEDを点灯して撮影したい…あ~~~、行き当たりばったりは仕方ないねぇ。


それにしても外はすごい雨だな~~洪水警報???

ヤガ?幼虫

ヤガ?の幼虫を外に放してきた。

シャクトリムシってタイプで、数日間自宅で桜の葉っぱとかを与えていたがイマイチ食べがよくない。

やはり外の方がいいのかな?

 

◆元気になった

f:id:game-allergy:20210417170836j:image

桜の木の葉っぱに放したら元気いっぱいに動き始めた。やはり外がいいんだよね。

コイツは自宅の前に転がっていたのを保護。変な灰色をしていたが数日前に脱皮したら薄い黄色?白?っぽい色になった。

いいのかこんなに目立つ色になって?

 

f:id:game-allergy:20210417170843j:image

f:id:game-allergy:20210417170850j:image

↑コイツも元気に葉っぱを食べ始めた。

コイツは拾ってきたときは緑色のイモムシだったが、数日前に脱皮したら茶色になった。

 

どちらもガだと思うけど、どんな成虫になるのか見れなかったのが残念。

 

いまはアゲハチョウの飼育だけでも忙しいから仕方ないところ。

 

元気にそだっておくれ。

メダカ 稚魚

4月半ばになり、

メダカの赤ちゃんが続々と生まれてる。

f:id:game-allergy:20210417164503j:image

f:id:game-allergy:20210417164510j:image

f:id:game-allergy:20210417164517j:image

↑ すごい小さい。老眼にはつらい。。。

 

メダカの稚魚はそのままだとすぐに死んでしまうらしい。常に腹一杯にさせないといけないので餌をあげるタイミングが難しい。

そのため、プランクトンが常に水槽にいる状態にするのが良い…ってことで、嫁さんはゾウリムシを培養して稚魚がいる水槽に適宜与えている。

 

メダカの稚魚の飼育って、意外と難しいんだね。誰だよ、メダカ飼育が簡単だなんて言ったのは〜。

オレか?

ミートソース

f:id:game-allergy:20210417141935j:image

ミートソース。

またかい。

しかし上手くいくと作りたくなる。

そりゃそうだ、美味しいんだから。

逆に不味いと作らなくなる。

 

昨日作ったひき肉とキャベツのレンジ蒸しはちょーっと改良が必要だな…レンジで作ることができるのはお手軽だけど。

 

それでは、本日のミートソース

 

◆玉ねぎ甘味を出す

f:id:game-allergy:20210417131227j:image

◆ひき肉、ニンジンを投入

料理酒で臭みとり

f:id:game-allergy:20210417131240j:image

◆トマト缶投入〜煮込み酸味飛ばし

f:id:game-allergy:20210417131312j:image

◆味付け

f:id:game-allergy:20210417131254j:image

f:id:game-allergy:20210417131325j:image

f:id:game-allergy:20210417131336j:image

f:id:game-allergy:20210417131346j:image

f:id:game-allergy:20210417131213j:image

薄味なので、あとはスライスチーズ入れたりすれば塩っけが出てきて味がしっかりする。この辺はお好みで。というか、この時点でもかなり塩分入ってるはずだからね。。

 

◆食べる

f:id:game-allergy:20210417141916j:image

 

美味しいんだけど、調理で1時間くらいかかるのがね…まぁ美味しいものを食べるためなら仕方ない。

 

COCOA 無責任官庁

おわ、暫く耳にしてなかったな、これ。

f:id:game-allergy:20210417103928j:image

きてるね〜、これは。

Android版の不具合はやばいな。

使えると思ってインストールした人達はゴミをインストールさせられた訳だ。

 

というかCOCOAの存在すら忘れていたし。それくらいのものを税金いくら使って作って放置したのか?が問題だよな。

え?3.9億円⁇

 

f:id:game-allergy:20210417103937j:image

意外と名だたる企業が出ている。

大企業は発注者からすればそりゃ安心感ある。

 

◆え?オレが管理するの?

f:id:game-allergy:20210417104000j:image

↑笑えるよね、職員は事業者が管理するものだと認識していた…って。

発注者が理解しないでどーするんだよ。

アホか。

 

◆無理だ無理

f:id:game-allergy:20210417104015j:image

↑ 行政経験しかない職員が高度な判断をするのは無理だ…そりゃそうだ。

無理だ無理〜亀の腹筋〜♪

 

だいたいさ、マイナンバーも普及していない状態でどうやって大多数の国民にアプリをインストールさせるんだよ。任意って時点でこんな不安なアプリ入れるワケないじゃないの。

 

というか、行政始動のIT案件って不安でしかない…って国民はすでにそのように認識しているからな。

 

六法全書ばかり読んでるとこーなっちゃうんだろな…何に縛られてるんだろ、この国は。

ラズパイ 温度測定データをDBへ格納

f:id:game-allergy:20210416130714j:plain

前回はpythonのWEBスクレイピングで気象情報を取得、気温・湿度のグラフを作成するところまでやった。
そうだ、今度はラズパイの温度計測データと比較してみよう。WEBから得られる気温・湿度の情報と、自宅内の実際の気温とを比較・・・つまり、他から得た情報、自分で採取した情報、この2つに乖離がないか?(あるわけないけど)ということを調査する・・・自分で取得したデータっていうところが今回のキモだ。電子工作をするなら自分でデバイスをいじってデータを取得してみたいよね。あと、python にも慣れてきたからスクリプトを書くのが楽しいってのもあるか。

f:id:game-allergy:20210416130740j:plain

ラズパイ内のpythonに追加したモジュールは、schedule, sqlite3, datetime

◆DB/テーブル作成

# ===================================
# 特定DBのテーブル有無確認後、作成しなおす
# ===================================
import sqlite3

# DB接続、カーソル起動
connection = sqlite3.connect('TEST.db')
cur = connection.cursor()

# ===================================
def CheckTableExistence():
    cur.execute('SELECT COUNT(*) FROM sqlite_master WHERE TYPE="table" AND NAME="HIH6130"')

def CreateTable():
    sql = 'CREATE TABLE HIH6130(id INTEGER PRIMARY KEY AUTOINCREMENT, temp INTEGER, humid INTEGER, time STRING)'
    cur.execute(sql)

def DropTable():
    sql = 'DROP TABLE HIH6130'
    cur.execute(sql)
# ===================================
#テーブル存在確認
CheckTableExistence()

if cur.fetchone() == (0,): #存在しないとき
    print("Table is not existed then created")
    #テーブルがなかったら作成する
    CreateTable()
    
else:
    print('Table exists, then deleted old one and created new one')
    #テーブルがあったら削除する
    DropTable()
    CreateTable()

connection.commit()
connection.close()
# ===================================
print('--------------------')
print('Check table; end of line')

個人的な印象だけど、sqlite3ってすごーいラクチン。さすがアプリケーション内のモジュールだ。MariaDBみたいに別サーバだと接続がちょっとややこしい。個人で軽い検証程度ならsqliteで十分だね。

◆気温・湿度の取得、DBへ格納

#! /usr/bin/env python3

import time
import datetime
import smbus
import schedule
import sqlite3

i2c_channel = 1
i2c = smbus.SMBus( i2c_channel )

def job():
    Measure()

def Measure():
   
    # Measurement
    for i in range(0,5,1):

        i2c.write_quick(0x27)
        time.sleep(0.1)

        dac = i2c.read_i2c_block_data( 0x27, 0, 4 )

        h = ( ( dac[0] & 0x3f ) << 8 ) | dac[1]
        humi = (float)(h) / 16383 * 100

        t = ( dac[2] << 6 ) | (dac[3] >> 2)
        temp = (float)(t) /16383 * 165 - 40

        now1 = datetime.datetime.now()
        now2 = now1.strftime('%Y-%m-%d %H:%M:%S')

        # Get them into DB
        dbregist(temp,humi,now2)

        # Show the data on Display (for checking)
        print ( "Time        : %s    " % now2  )
        print ( "Temperature : %.2f C" % temp  )
        print ( "Humidity    : %.2f %%" % humi )
        print ( "---------   : ")

        time.sleep(1)

def dbregist(t,h,now2):
    dbname = 'TEST.db'
    connection = sqlite3.connect(dbname)

    cur = connection.cursor()
    sql1 = 'INSERT INTO HIH6130(temp, humid, time) VALUES(?,?,?)'
    cur.execute(sql1,(t, h, now2))

    connection.commit()
    cur.close()
    connection.close()

    print('--------------------')
    print('DB; end of line')

# Do Job for a certain period of time
schedule.every(10).seconds.do(job)

# Wait until Doing Job
while True:
    schedule.run_pending()
    time.sleep(1)

◆DB内容を読み込んでディスプレイに出力

#! /usr/bin/env python3
import sqlite3
#import pandas as pd
#import matplotlib.pyplot as plt


dbname = 'TEST.db'
connection = sqlite3.connect(dbname)
cur = connection.cursor()

sql3 = 'SELECT temp, humid, time FROM HIH6130'
c3 = cur.execute(sql3)
result3 = c3.fetchall()
print(result3)

"""
df1 = pd.DataFrame(result1,columns=["temp"])
df2 = pd.DataFrame(result2,columns=["humid"])

pd.set_option("display.max_colwidth", None)
pd.set_option("display.max_rows", None)

#print(df1)
#print(df2)
"""

cur.close()
connection.close()

print('--------------------')
print('SeeDB; end of line')

◆実行結果(データ取得、DB書き込み)

f:id:game-allergy:20210416125517j:plain

実際には1時間ごとにデータを取得して24個のデータをグラフ化する…ということをしたい。が、データ取得のテストなので10秒ごとに5回分のデータを取得するようにしている。scheduleモジュールもしっかり動いてるし問題なさそう。

◆実行結果(DB情報の読み出し)

f:id:game-allergy:20210416125607j:plain

pandasで書き出そうとしたんだけど、なんかうまくいかない。なんかmoduleの読込でおかしい。なので、今回は単にDBからデータの吐き出しまで。ほんとはここからMatplotでのグラフ書き出しをしようかと思っていたけど、pandasで詰まってしまいそこまで到達していない。


◆4/19追記。pandas解決

game-allergy.hatenablog.com