2020年12月10日木曜日

CODE03 ~ENV Ⅱ HATとMH-Z19B、2センサの統合処理~

 忙しい人のための最低限の分割したバージョンの記事Part3

~2センサの統合処理~

 まずは完成形から。
マステでごちゃごちゃ留めてありますがこれが完成形です
ちなみに8の字というか∞風に線が走ってます

 まずENV Ⅱ HATについて、これはM5StickCのHAT端子のうち必要なGND/G26/G0/3V3端子を延長して接続しました。配線はそのまま延長しただけなので公式に準じています(5V端子じゃなくて3V3端子だったのは意外だった)。

 そして、色々と試行錯誤しながらなんとか完成したコードがこちらです。Multi-Environmental-Sensor-Systemとか変な名前つけちゃってますが無視してあげてください。
 あと、上2つのぶんに加えてバッテリー電圧をちょこんとシステム名の下に表示してあります。バッテリ容量が小さすぎで電圧表示のほうが管理しやすいかなと思って、%ではなく電圧を表示してあります。まあ大体電源つないであれば問題ないんだけどね。

code:3 MultiSensingSketch
/*注意 私の理解できたところのみ説明が書かれています
 説明がないということは…そういうことです
 また、英語はガバガバ英語だったりDeepLに頼った英語だったりします。自己満です。 */

//Include Libraries ライブラリをインクルード
#include <M5StickC.h>
#include "SHT3X.h"
#include <Wire.h>
#include "Adafruit_Sensor.h"
#include <Adafruit_BMP280.h>
#include "MHZ19_uart.h"

//Define Valiable 変数を定義
SHT3X sht3x;
Adafruit_BMP280 bme;
MHZ19_uart mhz19;

//Calculate temperature, humidity and air pressure in floating point? 浮動小数点で温湿度・気圧を計算?
float tmp = 0.0;
float hum = 0.0;
float pressure = 0.0;

void setup() {
  // put your setup code here, to run once:
  M5.begin(); //Initialize M5StickC M5StickCを初期化
  delay(50); //Wait 50msecs 50ミリ秒待機

  mhz19.begin(32,33); //Initialize I2C of MHZ19 MHZ19のI2Cを初期化
  mhz19.setAutoCalibration(false); //AutoCalibration turn off 自動校正をしない
  delay(3000); //Wait 3000msecs 3000ミリ秒待機
  
  Wire.begin(0,26); //Initialize I2C of ENVHAT2 ENVHAT2のI2Cを初期化
  M5.Axp.ScreenBreath(10); //Decrease Lcd's Brightness 画面の輝度を下げる
  setCpuFrequencyMhz(80); //Set Cpu Frequency to 160MHz CPUの動作周波数を80MHzに
  M5.Lcd.fillScreen(BLACK); //Fill Screen Black 背景色を黒に
  M5.Lcd.setRotation(3); //Set Lcd's Direction 画面を横向き(左上)に
  M5.Lcd.setCursor(0, 2, 1); //Set Cursor to (0,2) and Assign Fonts 1 カーソルを(0,2)へ、フォントは1を指定
  M5.Lcd.println("Multi-Environmental-Sensor-System"); //Show sentences in "" on the screen 画面に””内の文章を表示
  
  if (!bme.begin(0x76)){  
      Serial.println("Could not find a valid BMP280 sensor, check wiring!");
      while (1); //Error message if the BMP280 sensor was not detected? BMP280センサが検出されなかった場合のエラー表示?
  }

}

uint8_t setup_flag = 1;

void loop() {
  // put your main code here, to run repeatedly:
  if(sht3x.get()==0){
    tmp = sht3x.cTemp;
    hum = sht3x.humidity; //Acquisition of temperature and humidity data from sht3x? sht3xからの温湿度データの取得?
  }

  M5.Lcd.setCursor(0, 22, 2); //Set Cursor to (0,22) and Assign Fonts 2 カーソルを(0,22)へ、フォントは2を指定
  M5.Lcd.printf("Temp: %2.1fC Humi: %2.1f%%", tmp, hum); //Display of degrees Celsius and humidity in one decimal place 摂氏度および湿度を小数点以下1桁で表示
  
  float pressure = bme.readPressure(); //Calculating atmospheric pressure in floating point? 浮動小数点で大気圧を計算?
  M5.Lcd.setCursor(0, 42, 2); //Set Cursor to (0,42) and Assign Fonts 2 カーソルを(0,42)へ、フォントは2を指定
  M5.Lcd.printf("pressure: %4.2fhPa", pressure / 100); //Atmospheric pressure in units of hPa to three decimal places 大気圧をhPaの単位で小数点以下3桁まで表示 
  delay(100); //Wait 100msecs 100ミリ秒待機

  if (!bme.begin(0x76)){  
      Serial.println("Could not find a valid BMP280 sensor, check wiring!");
      while (1); //Error message if the BMP280 sensor was not detected? BMP280センサが検出されなかった場合のエラー表示?
  }

  int co2,temp; //Calculate CO2 concentration by integer? 整数でCO2濃度を計算?
  int i;
  unsigned int t;
  co2 = mhz19.getPPM(); //Datas read from MH-Z19MH-Z19からのデータ呼び出し?
  temp = mhz19.getTemperature();
  Serial.printf("CO2=%d ppm / Temp=%d C\n",co2,temp);
  M5.Lcd.setCursor(0,62,2); //Set Cursor to (0,62) and Assign Fonts 2 カーソルを(0,62)へ、フォントは2を指定
  M5.Lcd.printf("CO2: %4dppm",co2); //CO2 concentration in integers in ppm CO2濃度をppmの単位で整数で表示
  delay(100); //Wait 100msecs 100ミリ秒待機

  float vbat = M5.Axp.GetBatVoltage(); //Get the battery voltage of the M5StickC? M5StickCのバッテリー電圧を取得
  M5.Lcd.setCursor(62,10,1); //Set Cursor to (62,10) and Assign Fonts 1 カーソルを(62,10)へ、フォントは1を指定
  M5.Lcd.printf("vbat: %4.2fV",vbat); //Battery voltage displayed in 2 decimal places バッテリー電圧を小数点以下2桁で表示

}

 一応これらのコードは私の環境上で動作したものとなります。なんならこの記事を書くまでに1ヶ月以上寝かせてしまったので3つ目のコードに至っては約1ヶ月間の稼働実績もあります。まだクラウドに接続してないからログは取れないけどね…

0 件のコメント:

コメントを投稿