Raspberry Pi Zero計測データのUDP配信

前回作成したRaspberry Pi Zeroでの温度計を用いて、ネットワーク上で複数デバイスの計測データを集約します


システム概要

  • 各Raspberry Pi温度計で、一定時間毎に温度を計測
  • 計測したデータはUDPで受信ホストに送信
    • DS18B20のUIDにより各センサを識別
    • データはProtocol Bufferを用いてシリアライズ・デシリアライズ
  • 一つのRaspberry Piへの複数センサ接続や、複数Raspberry Piデバイスからの受信もサポート
  • 記録データはCSV形式で出力
  • 保存データのプロット及びリアルタイムデータのプロット

関連ページ


スクリプトのダウンロード

GitHubのプロジェクトページからスクリプトをホスト側、Raspberry Pi側両方にダウンロードします

% git clone https://github.com/udon-code/thermometer.git
または
% wget https://github.com/udon-code/thermometer/archive/master.zip
% unzip master.zip

Raspberry Pi側スクリプトの実行

認識デバイスの確認

ダウンロードしたフォルダにあるscripts/ds18b20_logger.pyがRaspberry Pi側で実行するスクリプトです

まずは-lオプションで実行し、デバイスが認識できていることを確認します。下記の例ではRaspberry Piに2つのセンサが接続されているため、2つのIDが検出されています

% ./scripts/ds18b20_logger.py -l
Found 2 DS18B20 devices
['28-0301a279beef', '28-0301deadcf6b']

デバイスの検出に失敗する場合は、/sys/bus/w1/devices/にデバイスが存在することを確認します

ローカルにCSVファイルとしてデータを保存する場合

Raspberry Pi側にデータを保存する場合は、-oオプションで保存するファイルを指定します(フォルダを指定した場合は、日付名でファイルが自動生成されます)。また-iで計測間隔を、-tで計測時間を指定します。-t -1はプログラムが強制終了されるまで計測を継続します

% ./scripts/ds18b20_logger.py \
  -o therm_result.csv         \ # 出力ファイル名
  -i 10                       \ # 計測インターバル
  -t -1                         # 無限に計測

UDPでデータを送信する

計測データをUDPで送信する場合は-uオプションをつけて実行します。デフォルトのあて先は<broadcast>となっており、同一サブネット内にブロードキャストされます。--udp_ipオプションおよび--udp_portオプションで宛先IPおよび、ポート番号を指定することが可能です

% ./scripts/ds18b20_logger.py \
  --udpd                      \ # UDPに送信。デフォルトはブロードキャスト
  -i 30                       \ # 計測インターバル
  -t -1                         # 無限に計測

自動起動するようサービスに登録する

ブート時に自動で起動するようにサービスとして登録します。ExecStartのオプションとWorkingDirectoryは環境に応じて設定します

% sudo vi /etc/systemd/system/thermometer_logger.service
[Unit]
Description=My service
After=network.target dbus-fi.w1.wpa_supplicant1.service

[Service]
ExecStart=/usr/bin/python3 -u ./scripts/ds18b20_logger.py -i 60 -t -1 -o log
WorkingDirectory=/home/pi/work/thermometer
StandardOutput=inherit
StandardError=inherit
Restart=always
User=pi

[Install]
WantedBy=multi-user.target

テスト

% sudo systemctl start thermometer_logger    # logフォルダにファイルが生成されていることを確認

サービスに登録

% sudo systemctl enable thermometer_logger

ホスト側スクリプトの実行

UDPで受信したデータをCSVに保存

% ./scripts/ds18b20_client.py \
  --csv therm_result.csv      \   # 出力ファイル名
  -p                              # リアルタイムにプロット
プロット例

保存したCSVデータのプロット

-iオプションで保存したCSVをプロットすることが可能です

% ./scripts/ds18b20_client.py \
  -i therm_result.csv           # CSVファイル読み込み (複数指定可)
プロット例

おすすめ