Newer
Older
D5_IoT_PG / mainCode / API2.ino
@mannzyuusan mannzyuusan on 25 Apr 3 KB first commet
#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を返す
  }
}