IOT再びーESP32編(13)ーーープログラムの修正(A0221ATデータフォーマット)

スケッチを書き換えました。初期値を決定するのに,10回計測して,最大値と最小値を除いたものの平均を
とる関数を作成しました。

//初期値設定用 平均
float sokutei_heikin(int m){
  float Value[10];
  float Max;
  float Min;
  float Sum;
  
    for(int Ct=0;Ct<m;Ct++){
       Value[Ct]=measureDistance_1();//距離の測定関数を呼び出す。
       Serial.print(Ct);
       Serial.print(" =");
       Serial.println(Value[Ct]);
      if(Ct == 0) {//最初の測定値を最大・最小値として保存
          Max=Value[0];
          Min=Value[0];
      }
      else {
        if(Value[Ct] > Max){//取得したデータを最大値と比較して,大きければ,新たに保存
            Max=Value[Ct];
        }
        if(Value[Ct] < Min){////取得したデータを最小値と比較して,小さければ,新たに保存
            Min=Value[Ct];
        }
      }
     Sum+=Value[Ct];/*測定値を加算*///測定値を加算していく
  }

  Sum=(Sum-(Max+Min))/(m-2);//最大値と最小値を除いて,平均をとる。
  Serial.print("AVE");
  Serial.print(" =");
  Serial.println(Sum);

  return Sum;/*最大値・最小値を除いた平均値を返す*/
}

sokutei_heikin(10)ということで,10回の測定の平均をとる(最大・最小を除くので実際は8回)
設定で,動かして見ましたが,一回目の測定値が,きちんと測定されてないようなので,測定に入る
一回ダミーの測定をいれsて,実際は,11回の測定でやってみました。大きな変動もなく結果は良好
でした。
今回,最大・最小値を除いた平均を計算するのに,ちょっとなやみました。測定値を全部保存したうえ
ソートして,最大値と最小値を除こうかとも思いましたが,測定値をその都度一時保存の最大値と最小
値と比較するやり方が,よかったようです。

下記が,超音波センサーから,距離を測定するための関数です。

float measureDistance_1() {
  char m[50];
  Serial2.write("S");//RX端子をHIGHにするのに一文字書き込む。
  if (Serial2.available()){
    hdr = (byte)Serial2.read();
    if (hdr == 255){
      data_h = (byte)Serial2.read();
      data_l = (byte)Serial2.read();
      chksum = (byte)Serial2.read();
        if (chksum == ((hdr + data_h + data_l)&0x00FF)){
            distance = data_h * 256 + data_l;//距離計算
        }
     }
    }
  delay(100); 
  return distance;
 }

distance = data_h * 256 + data_l の部分が,距離を計算する部分です。計算するといっても,HIGHの
データとLOWのデータが,1バイトずつ送られてくるので,桁数を合わせる計算をしているだけです。
マニュアルには,下記のような記述がありました。
計測が開始されるとその結果が下記のように,4バイトのデータでおくられてきます。

0XFF 0X07 0XA1 0XA7

各データは,
0XFF はヘッダーデータ
0X07 は上位データ
0XA1 は下位データ
0XA7 はチェックサム
のようになってますので,
上位のデータと下位のデータを合わせると,
 07A1
という16進数が得られますので,これを10進数に直すと,1953mmというデータが得られるようです。