Arduino ESP-01 及び ESP-01S で OpenWhetherMap の理解と使い方

#Compilation error: call to 'HTTPClient::begin' declared with attribute error: obsolete API, use ::begin(WiFiClient, url) と Compilation error: DynamicJsonBuffer is a class from ArduinoJson 5. Please see https://arduinojson.org/v7/upgrade-from-v5/ to learn how to upgrade to ArduinoJson 7 のエラーを治しました
> 理由

- Arduinoライブラリ「Dusk2Dawn」で日の出や日の入り時刻を利用できますね
- そして OpenWhetherMap を発見して知識を深めたい
- しかし http.begin(url); で躓いたっ
- また ArduinoJson 7から DynamicJsonBuffer jsonBuffer; でも躓いた
- 悔しいから諦めないで治しました


> 目的

- OpenWhetherMapの理解と使い方
- http.begin(url);のコードのエラーを治したい
- DynamicJsonBuffer jsonBuffer;のコードのエラーを治したい

> コードを見て自宅のWiFi設定と現在位置の東経と西経と個人のKeyを入力してください

> 実行結果は個人情報が表示されるので発表しません
自宅のWiFi設定をして自宅の東経と西経とOpenWhetherMapのAIPKeyを入力すれば動きます
setup()で自宅のWiFiに接続とESP-01Sのled_builtin_Pinを設定して
Connecting to 自宅のWiFiとかの表示をします
void loop()で自宅のWiFiに接続完了ならばled_builtin_Pinの点滅や
天気を表示 気温を表示 湿度を表示 気圧を表示 日の出時間を表示 日の入り時間を表示 他を
表示します



# 必要な条件

- Arduino IDE バージョン 2.3.0
- ESP-01 及び ESP-01S
- ArduinoJson 7

# sketch__ESP-01S_OpenWhetherMap.ino

```sketch__ESP-01S_OpenWhetherMap.ino
//
//  sketch__ESP-01S_OpenWhetherMap.ino
//
//  Created by 福田敏一 on 2024/2/10.
//  Copyright © 2019 株式会社パパスサン. All rights reserved.
//
// ❇️ ℹ️ 🚨 🎀 📅 ☼ ☕︎ 👀 💼 👑 📢 🧨 💎 🎡 🏕 🏖 🚗 🖲 🎁 📌 ⛑ ✚ 😍 ♻️ 💠 🔆 🅿️ 🔰 ✅ 🌏 ☀️ 🌙 💌 1️⃣ 2️⃣ 3️⃣ 4️⃣ 5️⃣ 6️⃣ 7️⃣ 8️⃣ 9️⃣ 🔟 🧼 🆎 🅰️ 🅱️ ㊗️ ☯️ 📚 🚬 🖨 🗑 🤡 🤖 💍 🍰 🖼️

///////////////////////////////////////////////

//2024/1/16・参考サイト・
//2024/1/16・Amazonより購入・https://www.amazon.co.jp/Beizuu-ESP-01S-ESP8266シリアルWIFIモデル（ESP-01更新バージョン）信頼性保証モノのインターネット/dp/B09F3V1M66/ref=sr_1_2?__mk_ja_JP=カタカナ&crid=37SWMIZT6V0V9&keywords=ESP-01S&qid=1707516830&sprefix=esp-01s%2Caps%2C191&sr=8-2
//2024/1/16・
//ファイル名・sketch__ESP-01S_OpenWhetherMap
//ボード・Generic ESP8266 Module
//デバイス・
//センサー・
//
//ネットワークポート : 
//2024/1/16・IP address :
//
/////////////////////////////////////////////////

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
#include <TimeLib.h>

const char* ssid     = "arduino";
const char* password = "0120881081";

//2023/12/20・ledPinから変更しました
#define led_builtin_Pin 2//LED_BUILTINは10です

void setup() {//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    Serial.begin(115200);
    delay(100);

    WiFi.begin(ssid, password);//ssidで指定したアクセスポイントに接続します
    Serial.println("");

    while (WiFi.status() != WL_CONNECTED) {//現在の接続状態を返却します。アクセスポイントに接続しているときは、WL_CONNECTEDが返ってきます
        delay(1500);
        // We start by connecting to a WiFi network
        Serial.println("");
        Serial.print("Connecting to ");
        Serial.print(ssid);
        Serial.println("");
    }
    Serial.println("");

    pinMode(led_builtin_Pin, OUTPUT);

}//ここまで setup()//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

void loop() {//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

if ((WiFi.status() == WL_CONNECTED)) {
  
    Serial.println("loop()");

  //2023/・参考サイトhttps://pointofviewpoint.linclip.com/archives/2505
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(1000);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(1000);//1000=1秒 上記の状態の消灯を継続

    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());//現在割り当てられているIPアドレスを返却します

    Serial.print("Led Builtin is ");
    Serial.println((LED_BUILTIN, DEC));

  }

if ((WiFi.status() == WL_CONNECTED)) {

  //2023/・参考サイトhttps://pointofviewpoint.linclip.com/archives/2505
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続

  Serial.println();
  }

  if ((WiFi.status() == WL_CONNECTED)) {
    String hostOpenWeatherMap = "http://api.openweathermap.org/data/2.5/weather";
    String lat = "自宅の東経を入力してください";
    String lon = "自宅の西経を入力してください";
    String apiKey = "個人のKeyを入力してください"; // Sustituye por tu API Key
    
    String url = hostOpenWeatherMap;
    url += "?lat=";
    url += lat;
    url += "&lon=";
    url += lon;
    url += "&APPID=";
    url += apiKey;
    Serial.print("Requesting_url is  ");
    Serial.println(url);
    
    Serial.print("URL.           is  ");
    Serial.println("http://api.openweathermap.org/data/2.5/weather?lat=自宅の東経を入力してください&lon=自宅の西経を入力してください&APPID=個人のKeyを入力してください");
    Serial.println();

  //2023/・参考サイトhttps://pointofviewpoint.linclip.com/archives/2505
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続
    digitalWrite(led_builtin_Pin, LOW);//点灯
      delay(100);//1000=1秒 上記の状態の点灯を継続
    digitalWrite(led_builtin_Pin, HIGH);//消灯
      delay(100);//1000=1秒 上記の状態の消灯を継続

  // Cliente web
  HTTPClient http;
  WiFiClient client;//このコードがエラー use ::begin(WiFiClient, url)のWiFiClientの部分で必要です

  //下記はエラーです Compilation error: call to 'HTTPClient::begin' declared with attribute error: obsolete API, use ::begin(WiFiClient, url)
  //http.begin(url);// 変更 --> http.begin(WiFiClient, url); --> http.begin(client, url);
  //http.begin(client, url);
  http.begin(client, "http://api.openweathermap.org/data/2.5/weather?lat=自宅の東経を入力してください&lon=自宅の西経を入力してください&APPID=個人のKeyを入力してください");
  
  int httpCode = http.GET();

    if (httpCode > 0) { //返答がある場合
      String payload = http.getString();  //返答（JSON形式）を取得
        Serial.print("httpCode is ");
        Serial.println(httpCode);
        //2024/2/9・payloadで設定地のデータをOpenWeatherMapより取得しました
        Serial.print("payload is ");
        Serial.println(payload);
        //payload is {"coord":{"lon":自宅の東経を入力してください,"lat":自宅の西経を入力してください},"weather":[{"id":804,"main":"Clouds","description":"overcast clouds","icon":"04d"}],"base":"stations","main":{"temp":283.61,"feels_like":281.68,"temp_min":282.09,"temp_max":284.86,"pressure":1017,"humidity":37,"sea_level":1017,"grnd_level":1016},"visibility":10000,"wind":{"speed":2.02,"deg":81,"gust":1.94},"clouds":{"all":95},"dt":1707456229,"sys":{"type":2,"id":2091017,"country":"JP","sunrise":1707428126,"sunset":1707466489},"timezone":32400,"id":1858729,"name":"自宅の場所","cod":200}

        //2024/2/9・・jsonオブジェクトの作成
        //下記はエラーになります Compilation error: DynamicJsonBuffer is a class from ArduinoJson 5. Please see https://arduinojson.org/v7/upgrade-from-v5/ to learn how to upgrade to ArduinoJson 7
        //DynamicJsonBuffer jsonBuffer;// 変更 --> JsonDocument jsonBuffer;
        JsonDocument weatherdata;
        String json = payload;
        //下記はエラーです Compilation error: conflicting declaration 'ArduinoJson::V703PB2::JsonObject weatherdata'
        //JsonObject weatherdata = weatherdata,.parseObject(json);// 変更 --> deserializeJson(weatherdata, json);

        // ❌ JsonObject& obj = jb.parseObject(input);
        // ⭕️ DeserializationError error = deserializeJson(doc, input);
        DeserializationError error = deserializeJson(weatherdata, json);

        //パースが成功したかどうかを確認
        //if (!obj.success()) { ❌
        if(error){ // ⭕️
          Serial.println("parseObject() failed");
        }
        //各データを抜き出し
        const char* weather = weatherdata["weather"][0]["main"].as<const char*>();
        const double temp = weatherdata["main"]["temp"].as<double>();
        const double humidity = weatherdata["main"]["humidity"].as<double>();
        const double pressure = weatherdata["main"]["pressure"].as<double>();
        const double sunrise = weatherdata["sys"]["sunrise"].as<double>();
        const double sunset = weatherdata["sys"]["sunset"].as<double>();
        const double sunrise0 = weatherdata["sys"]["sunrise"].as<double>();
        const double sunset0 = weatherdata["sys"]["sunset"].as<double>();
        const double sunrise00 = sunrise0 + (3600 * 9);
        const double sunset00 = sunset0 + (3600 * 9);

        char sunrise1[32];
        char sunset1[32];
        
        Serial.println();
        //天気を表示
        Serial.println(weather);
        //気温を表示
        Serial.println(String(temp-273.15) + "°C");
        //湿度を表示
        Serial.println(String(humidity) + " %");
        //気圧を表示
        Serial.println(String(pressure) + " hPa");
        Serial.println();
        //日の出を表示
        Serial.println("SunriseCode is " + String(sunrise00));
        //sprintf(sunrise1, "%02d.%02d.%02d %02d:%02d:%02d", year(sunrise0), month(sunrise0), day(sunrise0), hour(sunrise0), minute(sunrise0), second(sunrise0));
        //Serial.println("Sunrise is " + String(sunrise1));
        sprintf(sunrise1, "%02d.%02d.%02d", year(sunrise00), month(sunrise00), day(sunrise00), hour(sunrise00), minute(sunrise00), second(sunrise00));
        Serial.println("SunriseDate is " + String(sunrise1));
        
        sprintf(sunrise1, "%02d:%02d:%02d", hour(sunrise00), minute(sunrise00), second(sunrise00));
        Serial.println("SunriseTime is " + String(sunrise1));
        Serial.println();
        //日の入りを表示
        Serial.println("SunsetCode is " + String(sunset00));
        //sprintf(sunset1, "%02d.%02d.%02d %02d:%02d:%02d", year(sunset0), month(sunset0), day(sunset0), hour(sunset0), minute(sunset0), second(sunset0));
        //Serial.println("Sunset is " + String(sunset1));
        sprintf(sunset1, "%02d.%02d.%02d", year(sunset00), month(sunset00), day(sunset00), hour(sunset00), minute(sunset00), second(sunset00));
        Serial.println("SunsetDate is " + String(sunset1));
        sprintf(sunset1, "%02d:%02d:%02d", hour(sunset00), minute(sunset00), second(sunset00));
        Serial.println("SunsetTime is " + String(sunset1));

      } else {
              Serial.println("Error on HTTP request");
            }
            Serial.println();
            Serial.println("http.end()");
    http.end();//Free the resources
    Serial.println();
  }
  delay(30000);//30秒おきに更新

}//ここまで・loop()//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

```
# ここまで