- //暑さ指数計 クラウド版 Copyright (c) 2022- @logic_star
- //#define CORE2 //CORE2を使用する場合は有効化要
- #ifdef CORE2
- #include <M5Core2.h>
- #else
- #include <M5Stack.h>
- #endif
- #include "image.h"
- #include "UNIT_ENV.h" //ENV IIIライブラリ
- SHT3X sht30; //温湿度センサ
- QMP6988 qmp6988; //気圧センサ
- float tmp = 0.0; //温度
- float hum = 0.0; //湿度
- float pressure = 0.0; //気圧
- float WBGT = 0.0; //暑さ指数
- float THI = 0.0; //不快指数
- // Wi-Fi関連設定
- #include <WiFi.h>
- const char* ssid = "SSID"; //Wi-Fi APのSSIDをセットする
- const char* password = "PASSWORD"; //Wi-Fi APのパスワードをセットする
- // NTP関連設定
- #include <time.h>
- struct tm timeinfo;
- uint8_t secLastReport = 0;
- const char* ntpServer = "ntp.nict.jp"; //NTP Server
- const long gmtOffset_sec = 9 * 3600;
- const int daylightOffset_sec = 0;
- const char* week[7] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
- int ntp() {
- uint16_t wifi_retry_cnt;
- //connect to WiFi
- M5.Lcd.setTextFont(4);
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(0, 0);
- M5.Lcd.printf("Connecting to WiFi AP\n");
- WiFi.begin(ssid, password); //Wi-Fiに接続する
- wifi_retry_cnt = 15;
- while (WiFi.status() != WL_CONNECTED) { //接続待ち 0.5秒×15回でタイムアウト
- delay(500);
- M5.Lcd.printf(".");
- if(--wifi_retry_cnt == 0) {
- WiFi.disconnect(true);
- WiFi.mode(WIFI_OFF);
- M5.Lcd.printf("\nConnection error.");
- return(false);
- }
- }
- M5.Lcd.printf("\nCONNECTED\n"); //接続完了
- configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); //NTPによる時刻取得
- if (!getLocalTime(&timeinfo)) {
- M5.Lcd.printf("\nFailed to obtain time"); //取得失敗した場合のメッセージ
- return (false);
- }
- WiFi.disconnect(true); //時刻取得に成功したらWi-Fi切断
- WiFi.mode(WIFI_OFF);
- return (true);
- }
- // Ambient関連設定
- #include <Ambient.h>
- Ambient ambient;
- WiFiClient client;
- uint16_t channelId = 99999; //チャネルIDを設定
- const char* writeKey = "XXXXXXXXXXXXXXXX"; //ライトキーを設定
- int SendToCloud() { //Ambientサービスにデータ送信
- uint16_t wifi_retry_cnt;
- //connect to WiFi
- Serial.printf("Connecting to %s ", ssid);
- wifi_retry_cnt = 15;
- WiFi.begin(ssid, password); //Wi-Fiに接続する
- while (WiFi.status() != WL_CONNECTED) { //接続待ち 0.5秒×15回でタイムアウト
- delay(500);
- Serial.print(".");
- if(--wifi_retry_cnt == 0) {
- WiFi.disconnect(true);
- WiFi.mode(WIFI_OFF);
- return(false);
- }
- }
- Serial.println("CONNECTED"); //接続完了
- ambient.begin(channelId, writeKey, &client); //Ambientサービスに接続
- ambient.set(1, tmp); //温度データセット
- ambient.set(2, hum); //湿度データセット
- ambient.set(3, WBGT); //暑さ指数データセット
- ambient.set(4, THI); //不快指数データセット
- ambient.set(5, pressure); //気圧データセット
- ambient.send(); //データ一括送信
- delay(500); //送信完了待ちディレイ
- WiFi.disconnect(true); //送信完了したらWi-Fi切断
- WiFi.mode(WIFI_OFF);
- return (true);
- }
- void setup() {
- M5.begin(true, false, true, true);
- qmp6988.init(); //気圧センサ初期化
- M5.Lcd.fillScreen(TFT_WHITE); //M5Stackの画面初期化
- M5.Lcd.setTextColor(TFT_BLACK, TFT_WHITE);
- M5.Lcd.setTextDatum(TL_DATUM);
- if(ntp() == false) while(1); //Wi?Fi接続、時刻取得に失敗したら処理停止
- M5.Lcd.fillScreen(TFT_WHITE); //M5Stackの画面初期化
- M5.Lcd.drawJpg(image_bg, sizeof image_bg, 0, 30); //背景の表示
- }
- void loop() {
- getLocalTime(&timeinfo); //現在時刻取得
- if (secLastReport != timeinfo.tm_sec) { //秒が更新されていたら以下処理を実行
- secLastReport = timeinfo.tm_sec;
- M5.Lcd.setCursor(0, 0); //現在時刻表示
- M5.Lcd.printf("%02d/%02d/%02d(%s) %02d:%02d:%02d",
- timeinfo.tm_year + 1900, timeinfo.tm_mon + 1, timeinfo.tm_mday, week[timeinfo.tm_wday],
- timeinfo.tm_hour, timeinfo.tm_min, timeinfo.tm_sec);
- delay(10);
- pressure = qmp6988.calcPressure() / 100; //気圧を測定
- if(sht30.get()==0){ //Obtain the data of shT30. //温湿度を測定
- tmp = sht30.cTemp; //Store the temperature obtained from shT30.
- hum = sht30.humidity; //Store the humidity obtained from the SHT30.
- }
- WBGT = (tmp*0.003289+0.01844)*hum+(0.6868*tmp-2.022); //暑さ指数の計算
- THI = (tmp*0.81+hum*0.01*(tmp*0.99-14.3)+46.3); //不快指数の計算
- if (((timeinfo.tm_min % 5) == 0) && (timeinfo.tm_sec == 0)) SendToCloud(); //5分毎にAmbientへデータ送信
- if (WBGT >= 31) M5.Lcd.drawJpg(image4, sizeof image4, 180, 80); //暑さ指数に応じてイラスト表示
- else if (WBGT >= 28) M5.Lcd.drawJpg(image3, sizeof image3, 180, 80);
- else if (WBGT >= 25) M5.Lcd.drawJpg(image2, sizeof image2, 180, 80);
- else if (WBGT >= 21) M5.Lcd.drawJpg(image1, sizeof image1, 180, 80);
- else M5.Lcd.drawJpg(image0, sizeof image0, 180, 80);
- if (WBGT >= 25){ //暑さ指数25℃以上のときにビープ音を鳴らす。CORE2を除く。
- #ifndef CORE2
- M5.Speaker.beep();
- delay(100);
- M5.Speaker.mute();
- #endif
- }
- M5.Lcd.setTextFont(6); //暑さ指数の表示
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(128, 44);
- M5.Lcd.printf("%2.1f", WBGT);
- M5.Lcd.setCursor(128, 100); //不快指数の表示
- M5.Lcd.printf("%2.0f", THI);
- M5.Lcd.setTextFont(4); //温度の表示
- M5.Lcd.setTextSize(1);
- M5.Lcd.setCursor(60, 153);
- M5.Lcd.printf("%2.1f 'C", tmp);
- M5.Lcd.setCursor(60, 183); //湿度の表示
- M5.Lcd.printf("%2.1f %%", hum);
- M5.Lcd.setCursor(60, 213); //気圧の表示
- M5.Lcd.printf("%4.1fhPa", pressure);
- }
- delay(100); //100mSウェイト
- }
|