Raspberry Piを用いたセンサーデータ送信サンプル
ここで行うこと
- サンプルとして、温度・湿度センサーを用いてデータを送信し、グラフを作成するサンプルを作成します。 簡易的に温度・湿度APIを用いたサンプルコードはこちらを参照してください。
必要なもの
- Raspberry Pi
- 電源(ACアダプターなど)
- 温度・湿度センサー(DHT11など)
手順
- Raspberry PiへOSをインストール、起動確認
- 温度・湿度センサーを接続/取得
- データ送信サンプルを実行
- データ送信確認・グラフ作成
- (おまけ)systemdサービスとして永続化
1. Raspberry PiへOSをインストール、起動確認
Raspberry Pi Imagerを使用してRaspberry Pi OSをインストールします。
- Raspberry Pi Imagerをダウンロード・インストール
- SDカードを挿入し、Raspberry Pi Imagerを起動
- OSを選択(Raspberry Pi OS (64-bit)推奨)
- 設定(歯車アイコン)から以下を設定:
- SSHを有効化
- ユーザー名・パスワードを設定
- Wi-Fi設定(有線接続の場合は不要)
- 書き込みを実行
- SDカードをRaspberry Piに挿入し、電源を接続して起動
- SSHで接続して起動確認
ssh pi@raspberrypi.local
# または
ssh pi@<Raspberry PiのIPアドレス>
2. 温度・湿度センサーを接続/取得
センサーの接続
DHT11などの温度・湿度センサーを接続します。
DHT11の接続例:
- VCC → 3.3V (Pin 1)
- GND → GND (Pin 6)
- DATA → GPIO 4 (Pin 7)
必要なライブラリのインストール
sudo apt update
sudo apt install -y python3-pip python3-dev
pip3 install Adafruit_DHT requests
センサー値取得のテスト
以下のPythonスクリプトでセンサー値が取得できるか確認します。
import Adafruit_DHT
sensor = Adafruit_DHT.DHT11
pin = 4
humidity, temperature = Adafruit_DHT.read_retry(sensor, pin)
if humidity is not None and temperature is not None:
print(f'温度: {temperature:.1f}°C')
print(f'湿度: {humidity:.1f}%')
else:
print('センサーからの読み取りに失敗しました')
3. データ送信サンプルを実行
Miniviz APIにデータを送信するPythonスクリプトを作成します。
スクリプトの作成
nano miniviz_sender.py
以下の内容を記述します(PROJECT_IDとTOKENは実際の値に置き換えてください):
詳細はクイックスタートの「3. (デバイス側)データ送信」を参照してください。
import os
import time
from datetime import datetime, timezone
import Adafruit_DHT
import requests
PROJECT_ID = "MINIVIZ_PROJECT_ID"
TOKEN = "MINIVIZ_API_TOKEN"
API_URL = "https://api.miniviz.net"
LABEL_KEY = "raspberry_pi_home"
SEND_INTERVAL = 90 # seconds
# DHT11センサーの設定
DHT_SENSOR = Adafruit_DHT.DHT11
DHT_PIN = 4
def read_sensor():
"""センサーから温度・湿度を読み取る"""
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
return temperature, humidity
def send_data():
"""Miniviz APIにデータを送信"""
url = f"{API_URL}/api/project/{PROJECT_ID}?token={TOKEN}"
timestamp_ms = int(datetime.now(timezone.utc).timestamp() * 1000)
temperature, humidity = read_sensor()
if temperature is None or humidity is None:
print("センサーからの読み取りに失敗しました")
return
payload = {
"timestamp": timestamp_ms,
"label_key": LABEL_KEY,
"payload": {
"temperature": round(temperature, 1),
"humidity": round(humidity, 1)
}
}
try:
response = requests.post(url, json=payload)
if response.ok:
data = response.json()
print(f"送信成功 (id={data.get('id')}) - 温度: {temperature:.1f}°C, 湿度: {humidity:.1f}%")
else:
print(f"送信失敗: {response.status_code} {response.text}")
except Exception as e:
print(f"エラー: {e}")
if __name__ == "__main__":
print("Minivizデータ送信を開始します (Ctrl+Cで停止)")
while True:
send_data()
time.sleep(SEND_INTERVAL)
スクリプトの実行
python3 miniviz_sender.py
正常に動作している場合、90秒ごとにデータが送信され、コンソールに送信結果が表示されます。
4. データ送信確認・グラフ作成
データ送信の確認
- MinivizのWebインターフェースにログイン
- Databaseメニューから送信されたデータを確認
- 温度・湿度のデータが表示されていることを確認
グラフの作成
- Visualizeメニューからグラフを作成
- グラフタイプを選択(ラインチャート推奨)
- データソースとして温度・湿度を選択
- グラフが正常に表示されることを確認
詳細はクイックスタートの「5. グラフ作成」を参照してください。
5. (おまけ)systemdサービスとして永続化
Raspberry Pi起動時に自動的にデータ送信を開始するように、systemdサービスとして設定します。
サービスファイルの作成
sudo nano /etc/systemd/system/miniviz-sender.service
以下の内容を記述します(/home/pi/miniviz_sender.pyは実際のスクリプトのパスに置き換えてください):
[Unit]
Description=Miniviz Data Sender
After=network.target
[Service]
Type=simple
User=pi
WorkingDirectory=/home/pi
ExecStart=/usr/bin/python3 /home/pi/miniviz_sender.py
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
サービスの有効化と起動
sudo systemctl daemon-reload
sudo systemctl enable miniviz-sender.service
sudo systemctl start miniviz-sender.service
サービスの状態確認
sudo systemctl status miniviz-sender.service
ログの確認
sudo journalctl -u miniviz-sender.service -f
これで、Raspberry Piを再起動しても自動的にデータ送信が開始されます。