0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイ入門まとめ:SQLite センサーロガー & Flask センサーAPI

0
Posted at

ラズパイ入門まとめ:SQLite センサーロガー & Flask センサーAPI

Raspberry Pi の定番テーマを、実際にコードを動かしながらまとめて解説します。この記事では SQLite センサーロガー/Flask センサーAPI の2テーマを扱います。

各テーマは ブラウザ上の仮想Raspberry Piシミュレーターで、コードを編集しながら自分で動かせます。

1. SQLite センサーロガー

概要

温度を実時間でSQLiteに記録。テーブルが増えていき、集計も更新される。ブラウザ上の仮想Raspberry Piで、実際にコードを動かしながら挙動を確認できます。

プログラムの内容(ざっくり)

温度を1秒ごとにSQLiteのreadingsテーブルへINSERTし、件数と平均を集計しながらロギングします。

# === SQLite センサーロガー ===
# 温度を1秒ごとにDBへINSERTし、件数と平均を集計する。
# db は接続済み。db.insert(sensor, value) / db.aggregate(sensor)

import time

while True:
    t = sensor.temperature
    db.insert("temp", t)
    agg = db.aggregate("temp")
    print(f"記録 温度={t}C  件数={agg['n']}  平均={agg['avg']}C")
    time.sleep(1)

配線

構成(Piローカル SQLite)

I2C BME280 (0x76) ── 温度センサ
SQLite ファイル sensor.db(Pi ローカル)
テーブル readings(id, t_ms, sensor, value)

シェルの出力

実行すると、Pi側と相手デバイス側に次のような出力がリアルタイムで流れます。

🍓 Raspberry Pi シェル

pi@raspberrypi:~ $ python app.py
記録 温度=25.42C  件数=1  平均=25.42C
記録 温度=25.84C  件数=2  平均=25.63C
記録 温度=26.11C  件数=3  平均=25.79C
記録 温度=25.76C  件数=4  平均=25.782C
記録 温度=25.43C  件数=5  平均=25.712C
記録 温度=25.57C  件数=6  平均=25.688C
記録 温度=25.59C  件数=7  平均=25.674C

計測値(温度(℃))の推移:

chart

コードを編集したらどうなるか

記録間隔や集計内容(最小・最大・移動平均)を変えられます。センサー名を増やせば複数センサーの記録もできます。

まとめ

Piをデータロガーとして使う基本です。蓄積したデータは後からグラフ化・分析できます。


Raspi 仮想シミュレーターのライブ実行結果から生成。ブラウザ上で自分でコードを編集して試せます。


2. Flask センサーAPI

概要

Pi上のFlaskがセンサーAPIを配信。クライアントが実時間でアクセスしログが流れる。ブラウザ上の仮想Raspberry Piで、実際にコードを動かしながら挙動を確認できます。

プログラムの内容(ざっくり)

Pi上のFlaskがセンサーAPI(/api/sensor 等)を配信します。クライアントが実時間でアクセスし、リクエストを処理して200応答を返します。

# === Pi の Flask センサーAPI ===
# クライアントが /api/sensor などにアクセスしてくる。ルートを定義して応答する。
# app は簡易Flask。jsonify でJSON応答。

from flask import Flask, jsonify

app = Flask(__name__)

@app.route("/")
def index():
    return "<h1>Raspberry Pi Sensor Dashboard</h1>"

@app.route("/api/sensor")
def api_sensor():
    return jsonify({"temp": sensor.temperature, "hum": sensor.humidity})

@app.route("/health")
def health():
    return jsonify({"status": "ok"})

app.run(host="0.0.0.0", port=5000)

配線

構成(Flask Web サーバー)

Pi eth0 :5000 ── LAN ── クライアント
GET /            ダッシュボードHTML
GET /api/sensor  センサJSON(BME280)

シェルの出力

実行すると、Pi側と相手デバイス側に次のような出力がリアルタイムで流れます。

🍓 Raspberry Pi シェル

pi@raspberrypi:~ $ python app.py
 * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
"GET /api/sensor" 200 -
"GET /" 200 -
"GET /health" 200 -
"GET /api/sensor" 200 -
"GET /api/sensor" 200 -
"GET /api/sensor" 200 -
"GET /" 200 -
"GET /health" 200 -
"GET /api/sensor" 200 -

🌐 HTTPクライアント

GET /api/sensor
GET /
GET /health
GET /api/sensor
GET /api/sensor
GET /api/sensor
GET /
GET /health
GET /api/sensor

計測値(配信温度(℃))の推移:

chart

コードを編集したらどうなるか

@app.routeで新しいエンドポイントを追加したり、返すJSONの内容を変えられます。ポートやHTMLも編集できます。

まとめ

PiをIoTゲートウェイやWebサーバーにする基本です。センサー値をネットワーク越しに配信できます。


Raspi 仮想シミュレーターのライブ実行結果から生成。ブラウザ上で自分でコードを編集して試せます。


おわりに

どちらもラズパイの基礎として役立つテーマです。気に入ったらLGTM・ストックしていただけると励みになります。他のテーマも順次まとめていきます。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?