Raspberry Piを用いたセンサーデータ送信サンプル

ここで行うこと

  • サンプルとして、温度・湿度センサーを用いてデータを送信し、グラフを作成するサンプルを作成します。 簡易的に温度・湿度APIを用いたサンプルコードはこちらを参照してください。

    必要なもの

  • Raspberry Pi
  • 電源(ACアダプターなど)
  • 温度・湿度センサー(DHT11など)

手順

  1. Raspberry PiへOSをインストール、起動確認
  2. 温度・湿度センサーを接続/取得
  3. データ送信サンプルを実行
  4. データ送信確認・グラフ作成
  5. (おまけ)systemdサービスとして永続化

1. Raspberry PiへOSをインストール、起動確認

Raspberry Pi Imagerを使用してRaspberry Pi OSをインストールします。

  1. Raspberry Pi Imagerをダウンロード・インストール
  2. SDカードを挿入し、Raspberry Pi Imagerを起動
  3. OSを選択(Raspberry Pi OS (64-bit)推奨)
  4. 設定(歯車アイコン)から以下を設定:
    • SSHを有効化
    • ユーザー名・パスワードを設定
    • Wi-Fi設定(有線接続の場合は不要)
  5. 書き込みを実行
  6. SDカードをRaspberry Piに挿入し、電源を接続して起動
  7. 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_IDTOKENは実際の値に置き換えてください):

詳細はクイックスタートの「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. データ送信確認・グラフ作成

データ送信の確認

  1. MinivizのWebインターフェースにログイン
  2. Databaseメニューから送信されたデータを確認
  3. 温度・湿度のデータが表示されていることを確認

グラフの作成

  1. Visualizeメニューからグラフを作成
  2. グラフタイプを選択(ラインチャート推奨)
  3. データソースとして温度・湿度を選択
  4. グラフが正常に表示されることを確認

詳細はクイックスタートの「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を再起動しても自動的にデータ送信が開始されます。