概要
Raspberry Piで取得した画像、温度、湿度をプリザンターに登録するPyhtonのスクリプトを作成しました。植物の生長などを定期的に記録するシステムなどに応用できるかもしれません。
システム構成
- Raspberry Pi 4 Kit/ラズベリーパイ4B
- RasTech Raspberry Pi カメラモジュール Raspberry Pi カメラ 500万画素
- SHILLEHTEK DHT22 デジタル温度および湿度センサーモジュール
- プリザンターのデモ環境
Raspberry Pi完成写真
Raspberry Piにカメラモジュールと温湿度センサーを装着した状態
Raspberry Piで動作するPyhtonのスクリプト
Thonnyに下記のスクリプトを張り付けて実行するとカメラの画像とセンサーのデータを取得します。そのデータをプリザンターにAPIで登録します。
from picamera2 import Picamera2, Preview
import time
import base64
import requests
import json
import board
import adafruit_dht
# カメラを起動して写真を撮ってJPEG画像を保存した後、Base64エンコードしたデータを返す関数
picam2 = Picamera2()
def getImage():
picam2.start_and_capture_file(
name="test.jpg",
delay=2
)
with open("test.jpg", "rb") as f:
image = f.read()
return base64.b64encode(image).decode('ascii')
# 温湿度センサーから温度データと湿度データを取得して返す関数
dhtDevice = adafruit_dht.DHT22(board.D4, use_pulseio=False)
def getTemp():
while True:
try:
# Print the values to the serial port
temperature_c = dhtDevice.temperature
temperature_f = temperature_c * (9 / 5) + 32
humidity = dhtDevice.humidity
print(
"Temp: {:.1f} F / {:.1f} C Humidity: {}% ".format(
temperature_f, temperature_c, humidity
)
)
return {
"NumA": temperature_c,
"NumB": humidity
}
except RuntimeError as error:
continue
except Exception as error:
dhtDevice.exit()
raise error
# プリザンターに取得したデータ登録する
# カメラの画像は内容欄(Body)に挿入する
while True:
url = "https://demo.pleasanter.org/api/items/9499654/create"
data = json.dumps({
"ApiVersion": 1.1,
"ApiKey": "***********",
"Title": "Today Info",
"NumHash": getTemp(),
"ImageHash": {
"Body": {
"HeadNewLine": False,
"EndNewLine": False,
"Position": 0,
"Alt": "imageBody",
"Extension": ".jpg",
"Base64": getImage()
}
}
})
headers={'Content-Type': 'application/json', 'charset': 'UTF-8', 'user-agent': 'vscode-restclient'}
response = requests.post(url, data=data, headers=headers)
print(response.content.decode())
プリザンターに登録されたイメージ
オフィスから目の前の道路状況を定期的に撮影、同時に温度、湿度を記録
プリザンターの一覧画面を定期的にリロードするJavaScript
定期的にデータがアップロードされてくるので画面をリロードすることで監視システムのようになる
setInterval(function() {
$p.send($('#Grid'));
}, 2000);