plasmasphere.net -プラズマスフィア ドットネット-

Diary

raspberry pi 4+ で気象/空間モニタリングする

2025/08/09(Sat) 15:08

ラズパイに温度・湿度・気圧・ガスモニタを付けて、ブラウザで見れるビューワ機能を作ってみました。

前回はラズパイ3B+と書きましたけど、GUIが重かったので結局4+を買いました。

構成

カメラ表示
AtomCam2にカスタムファームを入れて、静止画を表示しています。静止画とはいえアクセスの度に更新されます。
本当はWebRTCで表示したかったんですが、ラズパイだとマシンスペック的にちょっと難しいようです。
ffmpegでHLSに変換しても良いですが、画像が乱れる場合があったのでこれも止めました。
EventStreamでバックエンドに接続して、バックエンドから取得するようにしてます。setIntervalはフロント側の負荷的に止めました。
カレンダー表示
自作のカレンダーを使っています。https://github.com/sou1ka/koukicalendar
日をクリックするとその日のモニタをグラフ表示します。
天気表示
天気予報APIを利用させてもらっています。https://weather.tsukumijima.net/
6時間毎に更新しています。
気温・湿度・気圧・ガス検知を表示
気温・湿度・気圧はBME280、ガス検知はMQ-2でモニタリングしています。
Rustで実装して /sbin/ に設置して i2c-view というコマンドで値を返却するようにしました。ブラウザとはWebSocketでやりとりしています。
コードはこんな感じ。main.rs
use linux_embedded_hal as hal;

use linux_embedded_hal::{Delay, I2cdev};
use bme280::i2c::BME280;
//use tokio::process::Command;
use std::process::{Command, Stdio};

fn main() {
    // using Linux I2C Bus #1 in this example
    let i2c_bus = I2cdev::new("/dev/i2c-1").unwrap();
    let mut delay = Delay;/* ..delay provider */
    // initialize the BME280 using the primary I2C address 0x76
    let mut bme280 = BME280::new_primary(i2c_bus);

    // or, initialize the BME280 using the secondary I2C address 0x77
    // let mut bme280 = BME280::new_secondary(i2c_bus);

    // or, initialize the BME280 using a custom I2C address
    // let bme280_i2c_addr = 0x88;
    // let mut bme280 = BME280::new(i2c_bus, bme280_i2c_addr);

    // initialize the sensor
    bme280.init(&mut delay).unwrap();

    // measure temperature, pressure, and humidity
    let measurements = bme280.measure(&mut delay).unwrap();

    println!("Relative Humidity = {} %", measurements.humidity);
    println!("Temperature = {} C", measurements.temperature);
    println!("Pressure = {} hPa", measurements.pressure/100.0);

    let process = Command::new("gpioget")
        .args(["gpiochip0", "17"])
        .stderr(Stdio::piped())
        .stdout(Stdio::piped())
        .output()
        .unwrap();
    println!("GAS status = {}", String::from_utf8_lossy(&process.stdout));
}
グラフ表示
chart.js.4.5系で追加しました。表示軸が四つあるのでちょっとやかましい表示ですが、見れなくはない。
ログは i2c-log というサービスを Rust で作って、crontab で5分毎に sqlite に保存しています。

ほかに、カメラは一つだけでなくて増えても全部表示できるとか、設定周りはconfig.jsonでやってるとかありますが、とりあえずこんなところ。
以前書いた、AtomCam2の動画をGoogleDriveにアップロードする 処理もラズパイで動かして、サーバの機能を纏めようかと考えています。
遠方の実家用ですし、消費電力は低い方がいいですからね。今動いてるサーバも15Whなので大した事はないですが更に下げられるので。


似てるっぽいネタ


 
© 1999- plasmasphere.net All rights reserved.