SSブログ

M5Stackで2つの温度センサー(SHT31 HIH6130)で温度・湿度測定・Ambientクラウド送信・SD保存 [Arduino&M5Stack]

今回は、温度センサーを2つ動かしました

おんなじセンサーが見あたらなかったので、2種類の温度センサーを使いました。

SHT31   https://akizukidenshi.com/catalog/g/gK-12125/
HIH6130  https://www.switch-science.com/catalog/1104/

センサーについては↑をご覧ください

今回の機能
・M5Stackでコンパクトに
・X分おきの温度・湿度計測
・SDに書き込み
 ・見やすいやつ
 ・データ化できる形式(","区切り)
・ネットに接続で時刻取得
・Ambientクラウドに送信

ネット機能についてはオフラインでも飛ばして使用できます。よって、オンラインでないといけないというわけではありません。

オンライン機能についての注意
ここでのWifiは、モバイルでのルーターのみ使えます。スマホなどのテザリングだと、うまくいきません(うまくいってたら教えてください)


Arduino IDEの設定

Arduino_onndo_situdosennsa-Wifi3.PNG

「ツール」タブをこのように設定してください(COMは例です 別の番号になる人もいると思います)

Ambientの設定

Ambientは、初期の設定が必要です

1.Ambientにログイン
Ambientでログインまたはアカウント作成(無料)してください
サイト  https://ambidata.io/

Ambient1.PNG
↑ログイン方法

Ambient2.PNG

チャンネルがない人はここでチャンネルを作ってください。ある人は、チャンネルの「チャンネルID」「ライトキー」をメモって下さい(画像粗くてすみません)

配線

M5Stackの横に、「5V」「GND」「SCL」「SDA」というI2c通信のピンがあるので、これをつなげます。
並列に2つのセンサーにつなげます(4種類のみでいいです)

絵は後日記載

ソースコード
#include "ClosedCube_SHT31D.h"
#include <M5Stack.h>
#include <WiFi.h>
#include <Ambient.h>
#include "time.h"

ClosedCube_SHT31D sht3xd;

const char* fname = "/temperature_Humidity_log.txt";  //Filepass 普通のデータ
const char* fname2 = "/temperature_Humidity_log_data.txt";  //Filepass2 ","区切りデータ
long timer = 300;                                     //データを取る時間(X秒おき)。timer > 10
const char* ssid = "***************";                 //Wifi SSID
const char* password = "***************";             //Wifi パスワード
WiFiClient CLIENT;
Ambient ambient;                                     //ambientオブジェクト作成
unsigned int channelid = ****;                       //ambient チャンネルID
const char* writekey = "****************";           //ambient ライトキー

#define HIH6130_ADDR 0x27

byte type = 0;


void setup()
{
  //Wire.begin();
  M5.begin();
  M5.Power.begin();
  M5.Lcd.clear(BLACK);
  Serial.begin(115200);
  sht3xd.begin(0x45); // SHT-31起動  I2C address: 0x44 or 0x45
}

void loop() {
  M5.Lcd.setTextSize(2.5), M5.Lcd.setTextColor(WHITE);
  if (type == 0) {
    M5.Lcd.setCursor(0, 220), M5.Lcd.println("deep sleep >>> ON");
  } else {
    M5.Lcd.setCursor(0, 220), M5.Lcd.println("deep sleep >>> OFF");
  }
  delay(5000);
  M5.update();
  if (M5.BtnA.isPressed()) {
    M5.Lcd.clear(BLACK);
    if (type == 0) {
      type = 1;
      M5.Lcd.setCursor(0, 220), M5.Lcd.println("deep sleep >>> OFF");
    } else {
      type = 0;
      M5.Lcd.setCursor(0, 220), M5.Lcd.println("deep sleep >>> ON");
    }
  }
  
  unsigned int dac[4];
  int i, t, h;
  float temp, humi;

  Wire.beginTransmission(HIH6130_ADDR);
  Wire.endTransmission();
  delay(100);

  Wire.requestFrom(HIH6130_ADDR, 4);
  for (i = 0 ; i < 4; i++ ) {
    dac[i] = Wire.read();
  }
  Wire.endTransmission();

  h = ((dac[0] & 0x3f) << 8) | dac[1];
  humi = (float)(h) / 16383 * 100;

  t = (dac[2] << 6) | (dac[3] >> 2);
  temp = (float)(t) / 16383 * 165 - 40;
  
  printResult(sht3xd.readTempAndHumidity(SHT3XD_REPEATABILITY_LOW, SHT3XD_MODE_CLOCK_STRETCH, 50), temp, humi);
  delay(5000);
  if (type == 0) {
    M5.Power.deepSleep(SLEEP_SEC(timer - 10));
  } else {
    delay((timer - 10) * 1000);
    M5.Lcd.clear(BLACK);
  }

  //    delay(250);
  //    printResult("Pooling Mode", sht3xd.readTempAndHumidity(SHT3XD_REPEATABILITY_HIGH, SHT3XD_MODE_POLLING, 50));
  //    delay(250);
}

void printResult( SHT31D result, float HIH_6130_temp, float HIH_6130_humi) {
  if (result.error == SHT3XD_NO_ERROR) {
    float SHT31D_temp = result.t;
    float SHT31D_humi = result.rh;
    M5.update();
    Serial.println("--------------------------------------------------");
    Serial.println("SHT31D");
    Serial.print("Temperature:");
    Serial.print(SHT31D_temp);
    Serial.print("C ,Humidity:");
    Serial.print(SHT31D_humi);
    Serial.println("%");
    Serial.println("");
    Serial.println("HIH6130");
    Serial.print("Temperature:");
    Serial.print(HIH_6130_temp);
    Serial.print("C ,Humidity:");
    Serial.print(HIH_6130_humi);
    Serial.println("%");

    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setTextSize(2);
    M5.Lcd.setCursor(50, 0);
    M5.Lcd.print("Temperature | Humidity");
    M5.Lcd.setCursor(0, 100);
    M5.Lcd.print("SHT31D    ");
    M5.Lcd.setTextColor(YELLOW);
    M5.Lcd.print(SHT31D_temp);
    M5.Lcd.print("C | ");
    M5.Lcd.print(SHT31D_humi);
    M5.Lcd.print("%");

    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setCursor(0, 130);
    M5.Lcd.print("HIH6130   ");
    M5.Lcd.setTextColor(YELLOW);
    M5.Lcd.print(HIH_6130_temp);
    M5.Lcd.print("C | ");
    M5.Lcd.print(HIH_6130_humi);
    M5.Lcd.print("%");

    M5.Lcd.setTextSize(2);
    M5.Lcd.setTextColor(WHITE);
    M5.Lcd.setCursor(0, 180);
    M5.Lcd.print("wifi connect");
    WiFi.disconnect(true);
    WiFi.begin(ssid, password);
    Serial.println("wifi connect...");
    byte wifitime = 0;
    M5.Lcd.setTextSize(1.5);
    while (wifitime < 20) { //接続待ち
      delay(500);
      wifitime += 1;
      M5.Lcd.print(".");
      if (WiFi.status() == WL_CONNECTED) {
        wifitime = 20;
      }
    }
    Serial.println("FINISH");
    M5.Lcd.setTextSize(2);
    M5.Lcd.println("");

    if (WiFi.status() == WL_CONNECTED) {
      M5.Lcd.print("wifi connect success");

      ambient.begin(channelid, writekey, &CLIENT);

      ambient.set(1, double(SHT31D_temp));
      ambient.set(2, double(SHT31D_humi));
      ambient.set(3, double(HIH_6130_temp));
      ambient.set(4, double(HIH_6130_humi));
      ambient.send();

      const char* ntpServer = "ntp.nict.jp";
      const long  gmtOffset_sec = 3600 * 9;
      const int   daylightOffset_sec = 0;
      configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);

      struct tm timeinfo;
      if (!getLocalTime(&timeinfo)) {
        M5.Lcd.println("Failed to obtain time");
        return;
      }

      // テキストサイズ指定
      M5.Lcd.setTextSize(3);
      // カーソル位置を設定
      M5.Lcd.setCursor(30, 30);
      M5.Lcd.printf("%04d/%02d/%02d"
                    , timeinfo.tm_year + 1900
                    , timeinfo.tm_mon + 1
                    , timeinfo.tm_mday
                   );
      M5.Lcd.setCursor(30, 60);
      M5.Lcd.printf("%02d:%02d:%02d"
                    , timeinfo.tm_hour
                    , timeinfo.tm_min
                    , timeinfo.tm_sec
                   );


      Serial.print(String((timeinfo.tm_year + 1900)) + "/"
                   + String(timeinfo.tm_mon + 1) + "/"
                   + String(timeinfo.tm_mday) + "  "
                   + String(timeinfo.tm_hour) + ":"
                   + String(timeinfo.tm_min) + ":"
                   + String(timeinfo.tm_sec) + "  "
                  );


      File file;
      file = SD.open(fname, FILE_APPEND);
      if (file) {
        file.println("");
        file.println(String((timeinfo.tm_year + 1900)) + "/"
                     + String(timeinfo.tm_mon + 1) + "/"
                     + String(timeinfo.tm_mday) + "  "
                     + String(timeinfo.tm_hour) + ":"
                     + String(timeinfo.tm_min) + ":"
                     + String(timeinfo.tm_sec) + "  "
                    );
        file.close();
      }

      file = SD.open(fname2, FILE_APPEND);
      if (file) {
        file.print(String(SHT31D_temp) + "," + String(SHT31D_humi) + "," + String(HIH_6130_temp) + "," + String(HIH_6130_humi) + ",");
        file.println(String((timeinfo.tm_year + 1900)) + "/"
                     + String(timeinfo.tm_mon + 1) + "/"
                     + String(timeinfo.tm_mday) + "  "
                     + String(timeinfo.tm_hour) + ":"
                     + String(timeinfo.tm_min) + ":"
                     + String(timeinfo.tm_sec) + "  "
                    );
        file.close();
      }

      WiFi.disconnect(true);

    } else {
      M5.Lcd.print("wifi connect error");
      File file;
      file = SD.open(fname, FILE_APPEND);
      if (file) {
        file.println("");

        file.close();
      }

      
      file = SD.open(fname2, FILE_APPEND);
      if (file) {
        file.println(String(SHT31D_temp) + "," + String(SHT31D_humi) + "," + String(HIH_6130_temp) + "," + String(HIH_6130_humi));
        file.close();
      }
    }



    File file;
    file = SD.open(fname, FILE_APPEND);
    if (file) {
      file.println("SHT31D: " + String(SHT31D_temp) + "C  " + String(SHT31D_humi) + "%");
      file.println("HIH_6130: " + String(HIH_6130_temp) + "C  " + String(HIH_6130_humi) + "%");
      file.close();
    }


  } else {
    Serial.print(": [ERROR] Code #");
    Serial.println(result.error);
    File file;
    file = SD.open(fname, FILE_APPEND);
    if (file) {
      file.println("");
      file.close();
    }

  }
}




SDは入れておいてください


結果
起動すると、左下に「deep sleep >>> ON」と出てきます。この時に左のボタンを長押しすると、ONとOFFをトグルできます。ですが、普通はONのままです。内臓電池が持ちます。
5秒後にデータをとってLCD表示します
そして、Wifiにつなげようとします。
接続されれば、Ambient送信・時刻受信・SD記録(時刻あり)します
接続されなければ SD記録(時刻なし)します
5分間(初期値) スリープ(deep sleep >>> ONの場合・deep sleep >>> OFFならそのまま)します

2つの温湿度センサー.jpg


nice!(0)  コメント(0) 

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。