#include <M5StickCPlus.h> #include <Adafruit_BMP280.h> #include <Adafruit_SHT31.h> #include <Wire.h> #include <ArduinoJson.h> #include <WiFi.h> #include <HTTPClient.h> Adafruit_SHT31 sht3x = Adafruit_SHT31(&Wire); Adafruit_BMP280 bme = Adafruit_BMP280(&Wire); const char* ssid = "TP-Link_9320"; // ご自身のWi-Fi情報に置き換えてください const char* password = "31037433"; // ご自身のWi-Fi情報に置き換えてください const char* apiKey = "32ba3c602e6cf9a4a7ab63dd691bbe0f"; // ご自身のOpenWeatherMap APIキーに置き換えてください const char* cityID = "1850147"; // 取得したい都市のIDに置き換えてください float sensorTemp = 0.0; float sensorHum = 0.0; float outsideTemp = 0.0; float outsideHum = 0.0; void setup() { M5.begin(); Wire.begin(32,33); M5.Lcd.setRotation(3); M5.Lcd.setTextSize(3); Serial.begin(115200); // Wi-Fi接続 WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi.."); } Serial.println("Connected to WiFi"); // センサー初期化 Serial.println(F("Initializing sensors...")); while (!bme.begin(0x76)) { Serial.println("Could not find a valid BMP280 sensor, check wiring!"); M5.Lcd.println("Could not find a valid BMP280 sensor, check wiring!"); } while (!sht3x.begin(0x44)) { Serial.println("Could not find a valid SHT3X sensor, check wiring!"); M5.Lcd.println("Could not find a valid SHT3X sensor, check wiring!"); } // ディスプレイ初期化 M5.Lcd.fillScreen(TFT_BLACK); } void loop() { // センサーから温度と湿度を取得 sensorTemp = sht3x.readTemperature(); sensorHum = sht3x.readHumidity(); // 外部APIから温度と湿度を取得 outsideTemp = getOutsideTemperature(); outsideHum = getOutsideHumidity(); // 温度と湿度の表示 M5.Lcd.fillScreen(TFT_BLACK); M5.Lcd.setCursor(0, 0); M5.Lcd.setTextColor(TFT_WHITE); M5.Lcd.setTextSize(2); M5.Lcd.printf("SensTemp: %.2f C\n", sensorTemp); M5.Lcd.printf("SensHumidity: %.2f%%\n", sensorHum); M5.Lcd.printf("OutTemp: %.2f C\n", outsideTemp); M5.Lcd.printf("OutHumidity: %.2f%%\n", outsideHum); M5.Lcd.println(); // 誤差の表示 float tempError = sensorTemp - outsideTemp; float humError = sensorHum - outsideHum; M5.Lcd.printf("TemError: %.2f C\n", tempError); M5.Lcd.printf("HumidityError: %.2f%%\n", humError); delay(5000); // 5秒ごとに更新 } float getOutsideTemperature() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; String url = "http://api.openweathermap.org/data/2.5/weather?id=" + String(cityID) + "&appid=" + String(apiKey) + "&units=metric"; Serial.println("Weather API URL: " + url); http.begin(url); int httpCode = http.GET(); if (httpCode > 0) { String payload = http.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); float temp = doc["main"]["temp"]; http.end(); return temp; } else { Serial.println("Error getting weather data"); return -273.15; // エラー時は絶対零度を返す } } else { Serial.println("WiFi Disconnected"); return -273.15; // エラー時は絶対零度を返す } } float getOutsideHumidity() { if (WiFi.status() == WL_CONNECTED) { HTTPClient http; String url = "http://api.openweathermap.org/data/2.5/weather?id=" + String(cityID) + "&appid=" + String(apiKey) + "&units=metric"; Serial.println("Weather API URL: " + url); http.begin(url); int httpCode = http.GET(); if (httpCode > 0) { String payload = http.getString(); DynamicJsonDocument doc(1024); deserializeJson(doc, payload); float humidity = doc["main"]["humidity"]; http.end(); return humidity; } else { Serial.println("Error getting weather data"); return -1; // エラー時は-1を返す } } else { Serial.println("WiFi Disconnected"); return -1; // エラー時は-1を返す } }