おはようございます。

今朝の町田市の天気になります。

台風14号名前「チャンスー(Chanthu)」はカンボジアが提案した名称で、花の名前からとられています。

 

さて下差しここで紹介したデジアナのNTPクロックは、時報のON/OFFとそのボリューム調整が出来る様になりました。筋肉

M5Stack Basicにある3つのボタンで左から ボリューム減、時報ON/OFFそれからボリューム増です。

===

で次に進みます。番外編のデジタル百葉箱を作りました。

M5Stackのサンプルスケッチに、BME280の計測データからAmbientにアップロードするライブラリが準備されていますので、簡単にWeather Stationが構築できます。

I2CでM5StackとBME280は、20cmほどのケーブルでI/Fしてあります。この様にすることでBME280が周囲の素子の影響を受けにくくなるので、取得するデータの精度がアップするハズです。

実は、BME280から読みだされたrawデータは、そのまま使うのでなくて補正する必要があります。

具体例:素子自体の発する熱が、時間の経過と共に素子周囲(ambient)の大気温を上げてしまうので、これでは正確な大気温の計測にはなりません。

  なので素子の発する熱量を鑑みてrawデータを補正(物理用語:compensation)する必要があります。

その補正の式は、BME280を利用する際に提供されるライブラリの関数内で定義されています。右差し素子を提供するメーカーが補正式を公開

その補正の計算が発生するので、上差しの丸め誤差が課題となります。OK

 

raw気圧データの補正例下差し

double BME280::readPressure(void) {
    unsigned long int pres_raw;
    signed long int var1, var2;
    unsigned long int P;
  
    int i = 0;
    uint32_t data[8];
    Wire.beginTransmission(BME280_ADDRESS);
    Wire.write(0xf7);
    Wire.endTransmission();
    Wire.requestFrom(BME280_ADDRESS,3);
    while(Wire.available()){
        data[i] = Wire.read();
        i++;
    }
    pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4);
  
    var1 = (((signed long int)t_fine)>>1) - (signed long int)64000;
    var2 = (((var1>>2) * (var1>>2)) >> 11) * ((signed long int)dig_P6);
    var2 = var2 + ((var1*((signed long int)dig_P5))<<1);
    var2 = (var2>>2)+(((signed long int)dig_P4)<<16);
    var1 = (((dig_P3 * (((var1>>2)*(var1>>2)) >> 13)) >>3) + ((((signed long int)dig_P2) * var1)>>1))>>18;
    var1 = ((((32768+var1))*((signed long int)dig_P1))>>15);
    if (var1 == 0) {
        return 0;
    }    
    P = (((unsigned long int)(((signed long int)1048576)-pres_raw)-(var2>>12)))*3125;
    if(P<0x80000000) {
       P = (P << 1) / ((unsigned long int) var1);   
    } else {
      P = (P / (unsigned long int)var1) * 2;    
    }
    var1 = (((signed long int)dig_P9) * ((signed long int)(((P>>3) * (P>>3))>>13)))>>12;
    var2 = (((signed long int)(P>>2)) * ((signed long int)dig_P8))>>13;
    P = (unsigned long int)((signed long int)P + ((var1 + var2 + dig_P7) >> 4));
    return P / 100.0;
}

 

下差しこれは、Ambientにアップロードされた気温、湿度、気圧のデータを折れ線グラフにしたものです。Ambientにアップロードされたデータは、csvファイルとして引き出せるので手元のエクセルでの加工が容易です。

 

【参考記事】

「.ioドメインは、イギリス領インド洋地域に割り当てられているccTLD※ですが、データの入出力を意味するI/OInput/Output)を想起させることから、テック系のスタートアップ企業をはじめ、コンピュータサイエンス分野に関するWebサイトやブログにおすすめのドメインです。

※ Country Code Top Level Domainの略称。 国や地域に割り当てられたトップレベルドメイン(TLD)です。 その文字列には、原則としてISO(国際標準化機構)のISO 3166-1において規定されている2文字の国コードが使用されています。右差し日本の場合は、jp ですね。

 

おまけ

最近気が付いた(恥ずかしい話)のですが、高校の数学(アラカンの私の場合 数I)で習った因数分解の考え方が、実はインド式掛け算を体系化したものであることです。右差しひょっとすると健やかに忘れていただけかも。。。

例:33*55 = 33*(50+5) = 33*50+33*5 = 1650 + 165 = 1650 + 50 + 115 = 1700 + 115 = 1815 

             = (30+3)*(50+5) = 30*50+30*5+3*50+3*5 = 1500+150*2+15 = 1500+300+15 = 1815

チョキ

ちょっと視点を変えると数式/計算式ゲームの様で、どのくらいのバリエーションがあるかを競っても面白いですね。