微気圧計プログラム開発 備忘録 2023-12-03
M5Stack編
インドネシアのマラピ火山が夕刻に噴火したというニュースが伝わり,慌てて放置してあったM5Stack版の微気圧計を動かすことになった.
従来汎用wifiに設定&長時間観測用にプログラム変更していたのを,従来の自宅のwifiをつかんで,少し速いサンプリングで観測するモードに直すことにした.
しばらくM5Stackの使用法を忘れていたので,時間がかかった.その備忘録を記す.メインソフトはArudinoIDEの安定バージョン1.8.19.これ以外は保証されない.
まずメニューのツールからBoardを選択.このときにM5Stack-Core2を選択すると,コンパイルや書き込みは成功するものの,起動時に
wifiを読みに行く00とかが表示されたあと,すぐにCard
Failedのエラーとなり起動できない.SDカードの問題かと思ったがそうではなく,Board選択が違っていた.ここは
M5Stack-Core2ではなく
M5Stack-Core-ESP32 を選択すること!!
あとは念のため,uploadを少し遅くしたり,USBポートが正しく選ばれているかをチェックする以外はデフォルトでOK.写真のように表示されればめでたし.
微気圧計プログラム開発 備忘録 2022-07-17
※まだ間違いは多数あるだろうが,とりあえず動いている段階でのプログラム作成備忘録.
※これはArduino Uno R3 + Raspberry Pi + LCD での運用時のメモ
現在はM5Stack,あるいはESP32系を使用しているのでArduinoIDEのみを使った運用に変更されていることに注意.2023-04-19
ArduinoIDE
ツールの中のライブラリの管理からInfenion社提供のDPS310用ライブラリをインストール
次にその中のi2ccommand.inoより必要部分のみを抽出
#include <Dps310.h>
Dps310 Dps310PressureSensor = Dps310();
void setup()
{
Serial.begin(9600);
while (!Serial);
Dps310PressureSensor.begin(Wire);
Serial.println("Init complete!");
}
void loop()
{
float temperature;
float pressure;
uint8_t oversampling = 7;
int16_t ret;
// Serial.println();
// if ( Serial.available() > 0 ) {
ret = Dps310PressureSensor.measurePressureOnce(pressure, oversampling);
if (ret != 0)
{
Serial.print("FAIL! ret = ");
Serial.println(ret);
}
else
{
// Serial.print("Pressure: ");
Serial.println(pressure);
// Serial.println(" Pascal");
}
// }
// delay(100);
}
上記紫の行のコメント化は,シリアルモニタで数字をモニタするためのもので,Processingとつなぐときはこれを有効化する.しかし無効化したままでも,結果に特に大差がなかったのは不思議.
Arduinoは常にランニングしていて,Processing側でサンプリングレートの応じて流れるデータからデータをピックアップしているイメージなのか.
これは1chつまり,気圧のみの取得用なので,これを気温も取得できる2chデータ用に改良.これをDPS310.inoとする.
#include <Dps310.h>
Dps310 Dps310PressureSensor = Dps310();
void setup()
{
Serial.begin(9600);
while (!Serial);
Dps310PressureSensor.begin(Wire);
Serial.println("Init complete!");
}
void loop()
{
float temperature;
float pressure;
uint8_t oversampling = 7;
int16_t ret;
// Serial.println();
if ( Serial.available() > 0 ) {
ret = Dps310PressureSensor.measureTempOnce(temperature, oversampling);
ret = Dps310PressureSensor.measurePressureOnce(pressure, oversampling);
if (ret != 0)
{
Serial.print("FAIL! ret = ");
Serial.println(ret);
}
else
{
Serial.print(temperature);
Serial.print(" ");
Serial.println(pressure);
}
}
// delay(100);
}
紫が変更点.
あと,下記で記すが,データは並列にスペース区切りで出力するようにした.
これ最初カンマ区切りにしていて,Processing側で,この切り取りに難儀することになる.
Arduino側はこれでOK!
Processing code
次にProcessing側は結局2日間費やすほど,結構往生した.
難しかった点
1)Arduinoのシリアルポート番号の問題
Linuxメインマシン上での作業で,Arduinoのシリアルポートが変更になったのを気づかず,プログラムをいじっていて,何度もエラーで進まなかった.
これ例によって,
Port = new Serial(this, Serial.list()[0], 9600); // if no line, please check the comment window of Processing,
の指定問題だった.
2)データの区切り文字問題
取り込んだデータをどのようにProcessing側で処理するか.
最初上記のように,カンマ区切りにしていて,
if (TP != null ){
String[] list = split(TP, ",");
temperature = float(list[0]);
pressure = float(list[1])/100;
println(temperature + " " + pressure);
}
とsplitで分けようとしたが,配列処理エラーで進めず.これ結局わかったのは,最初にプログラムが走るときに,無用なデータが出力され,それがカンマ区切りでないために,エラーになるらしいと推察.
Arduino側で,スペース区切りに変更,そこで,下記のようにsplit命令を変更.さらに最初の無用データをスキップするために
if (TP != null ){
//String[] list = split(TP, ",");
String[] list = TP.split(" ",-1);
temperature = float(list[0]);
pressure = float(list[1])/100;
println(temperature + " " + pressure);
}
3)起動時の無用ゴミデータ問題
最初にInit completeほかの無用なデータが出力される.これをスキップするために
Setup()の中に
for (int i=0; i < 20; i++){
if (TP != null ){
String[] list = TP.split(" ",-1);
temperature = float(list[0]);
pressure = float(list[1])/100;
println(temperature + " " + pressure);
delay(100);
}
}
を挿入した.これで何とかデータを取得できるようになった.またデータの書き出しも
output.println(nf(temperature,2,2) + " " +
nf(pressure,4,2)); // pressure value
writing to file
と気温と気圧を平行して1行のスペース区切りで書き出すことにした.この書き出しはファイルには当初何も書かれていないので驚くが,時間が経つとバッファからの書き出しがなされるようである.
これで最終計のDPS310_v1.pdeが完成.このあと気温と気圧の書き出し順は変更した.
Copyright(c) by Y.Okamoto 2022, All rights reserved.