IOT再びーESP32編(14)ーーープログラムの修正(A0221AT)防水超音波センサー

テストを繰り返していますが,なかなか安定した測定結果がえられませんでした。データの変動の幅がおおき
かったり値が変化しなかったりとしたため,あれこれとやりました。夜茶の間いろいろやっていると,比較的
安定した結果になるようでしたが,その原因が分かりました。測定結果が安定してないので,センサー部分を
見ると,水滴がかぶっていました。元々防水なので,水滴は大丈夫なはずですが,水滴が付いているため,測
定に影響があるような気がします。もともと超音波センサーは,超音波を発して,その反射が帰ってくるまで
の時間を計測して,距離を算出してますので,水滴がついていると,超音波の発信,受信に影響があるのかも
しれません。
センサー部分の水滴を拭き取ってみると,ほぼ正確な反応が返るようになりました。あれこれスケッチをいじ
ましたが,平均をとらなくても大丈夫なようですので,平均はとらずに運用してみようと思います。
ただ,英語のマニュアルをみてみると,レスポンスが帰るまで,100~300msとあるので,書き込みをし
てから,300msの休止(delay(300);)をいれました。

 float measureDistance_2() {
  char m[50];
  int Sw;
  Serial2.write("S");
  delay(300); 
  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;//距離計算
          new_distance=distance/10;
          dtostrf(new_distance, 6, 1, m);//
          Serial.print(m);
          Serial.println(" cm");
          if(digitalRead(OLED)==HIGH){//OLED表示ONの時
            display.clearDisplay();
            display.setCursor(0, 0);
            display.println("rest= ");
            display.print(m);
            display.println(" cm");
            display.display();
          }       
      }
    }
  }
  delay(100); 
  return distance/10;//cmを返す
 
}

超音波センサーなので,明るさは関係ないと思うのですが,検証をするのは,蛍光灯の下が大いのですが,そ
の影響もあるのでしょかね。
茶の間で検証の様子です。水が噴霧機に入ってるので,おっちょこちょいの私は,こぼさないかヒヤヒヤして
ます。

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というデータが得られるようです。

IOT再びーESP32編(12)ーーープログラムの修正

大きな不具合のなかった配線ですが,赤のLEDが点灯しなかったので,いろいろ調べてみると,LEDの足が断
線してました。また,組み込んでテストしてみると,大きな不都合はなかったものの,原因は分かりません
が,測定値が変動するようなので,その対策で,スケッチを修正することにしました。
オリジナルのスケッチでは,超音波の測定による距離をそのままWEBに渡していましたが,この部分を多少
変更します。
噴霧機満タンの状態での測定値を記憶して,それに基づいて,減り具合を加算するようにしたいと思いま
す。満タンの状態は,何度か測定して,平均をだして,初期値とするにあたって,誤差を抑えるために何回
か測定し,最大値と最小値を除いて,平均をとりたいと思います。
どうしたもんかとネット見ていると,下記のようなプログラムが見つかりました。C のものですが,これを
参考に修正しようと思います。

#include <stdio.h>
#define NumValue 5

int main(){
  int Value[NumValue];
  int Ct;
  int Max;
  int Min;
  int Sum;

  for(Ct = 0; Ct < NumValue; Ct ++) {    
   printf("Enter #%d → ", Ct + 1); 
   scanf("%d", &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];
     }
    }
 }

 
 printf("========\n");
 Sum = 0;

 for(Ct = 0; Ct < NumValue; Ct ++) {
  if(Value[Ct] != Max && Value[Ct] != Min) {
    Sum += Value[Ct];
  }
 }
 printf("%d\n", Sum);
}

IOT再びーESP32編(11)ーーーテストーー超音波センサー

やっと配線が終わり,本日,組み込み機での,テストを行いました。

誤配線等あって,動かないかなと思いましたが,すんなり動きました。
噴霧機にセットし,動かしてみると,底までの距離が229mmとほぼ正確に表示されました。あすは,実際
に水を入れてへりぐあいと数値の変化をテストしてみます。

実際の運用にあたっては,追加のスライドスイッチを,OLEDのON,OFF用にいれたので,多少プログラムを
変更する予定です。

芝刈りーー今年第10回目

今年10回目の芝刈りです。一週間で,約5cmほど伸びるようです。今年は,例年になく,状態はいいよう
に思いますがサッチが取り切れてないところがやや茶色く見えます。

芝刈り前


芝刈り後

IOT再びーESP32編(10)ーーー組み込みーー超音波センサー

間が開きましたが,防水超音波センサーを目的のものに組み込みました。目的のものは,電動(AC)噴霧機
です。当初の予定とはちがってきましたが,この噴霧機は,加圧式のものではなかったので,組み込みも比
較的容易でした。センサーの出口は,航空コネクターにしました。

防水超音波センサーも,うまい具合に組み込めました。

ただ,まだ実証は未実施ですが,うまく組み込めましたが,吸い込みのチューブが,干渉しないか多少不安が
残ります。
ESP32の方も,透明のケースに組み込むようにします。まだ,配線等はしていませんが,近日中に完成する
予定です。

ハイガー======刈払機

2019年4月ですから,もう5年ほど前になりますが,安い,刈り払い機を購入しました。当時,
11,852円と格安でした。さすがに今は5000円ほど値上がっていますが,それでも,格安の
ものだと思います。
ただ,格安なのはいいのですが,やはり,値段相応のことはあるようで,今までに,いくつかの不具合が
ありました。最初の不具合は,使い始めて2ヶ月ぐらいで,何カ所か,ネジがなくなりました。

きっと,振動が大きいか,締め付けがあまかったのか,緩み止めの対策がなされていなかったのか,
原因はわかりません。メーカーにも連絡しましたが,けっきょっく面倒で,自分で直しました。それと,
詳しい時期は記憶にないのですが,ハンドルが折れるということが起きました。きっと使われているア
ルミの材質に問題があるのでしょうね。それから,ハンドルは,修理してつかってましたが,つい最近,そ
のハンドルも再び破損してしまいました。

このときは,エンジンがだめになっていたタナカのTBC256Hのハンドルを片方,切り取って,急遽使えるよう
にしました。TBC256Hは,かなり気に入ってたのですが,エンジンがだめになり,結局部品取りになりまし
た。(まあ,TBC256Hは,部品があれば修理できるので,オークションで出品待ちなのですが。)

こうして,修理しながら使ってたハイガーの刈り払い機が,また,調子が悪くなりました。良くみてみると,
燃料タンクからのチューブが劣化して,ちょうど,ゴムブッシュのところで,切れてしまったようです。
これも,きっと,チューブの材質問題でしょうかね。タナカのものにはなかったことです。まあ,修理という
ことで,〇mazonから,購入。

付属のゴムブッシュがあうかどうか分かりませんでしたが,ゴムブッシュもぴったりでした。
ついでに,このところエンジンがかかりにくかったのでキャブレター調整。プラグを外してみると
かぶりぎみだったので,燃料をちょっと絞りました。それでもかかりにくかったので,手元にあった
別のプラグに交換。一発でかかるようになりました。

ハイガーの刈り払い機は,コスパ的には,最高なのですが,修理をメーカー任せの方には,ちょっと
ハードルが高いような気がします。DIYが趣味で,修理しながら,使う,というのであれば,うって
つけの物だと思います。

芝刈りーー今年第9回目

日曜日,雨がちらついていたので,今日に延期かなと思ってましたが,午後から,付かぬ間の曇りの天気で急
遽9回目の芝かりを行ってしまいました。結果的に,長めにならずに芝刈りができてよかったです。大分成長
が早くなってきたので,軸刈り近くなるおそれを回避できました。大分密度もこくなってきましたが,部分
部分,サッチが目立つところがありますので,晴れの日をみて,熊手で,サッチ取りをするようですね。

IOT再びーESP32編(9)ーーー番外編

あれこれとネットサーフィンをしていて,WEBページとサーバーとのやりとりについて,おそまきながらわ
かってきました。この役割をになってるのが,ハンドラーと呼ばれる部分でした。その書き方や意味が少
しわかりました。

特に
   サーバー→→→WEB

の方法がいまいちでしたが,この役割のになってるのが,esp32 の processor関数 だとい言うことが
分かりました。
このやりとりをする前段階として,

AsyncWebServerRequest *request; #requestというオブジェクトを作成
request->send(SPIFFS,"/hogehoge.hoge",String(),false,processor);

記述をするようで,記述で,hogehoge.hoge(html記載されたページ)の%で囲まれた文字列がprocessor関
数で置きかえられるとのことでした。
実際には,

  WEBからサーバーへホームページ表示のrequest

が出されるなかで,いろいろ解釈されて,%で囲まれた文字列が,processor関数で置き換えられるとのこと
のようでした。これで,ちょっとだけ進歩かなと思います。