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なので大した事はないですが更に下げられるので。