0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

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

Posted at

#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()//////////////////////////////////////////////////////////////////////////////////////////////////////////////////

ここまで

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?