微気圧計プログラム開発 備忘録       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.