検索コード

ESP32 チュートリアル 43/55 - IoT インターネット気象観測所 | SunFounder の ESP32 IoT 学習キット

ESP32 チュートリアル 43/55 - IoT インターネット気象観測所 | SunFounder の ESP32 IoT 学習キット

このチュートリアルでは、ESP32とSunFounderのカメラ拡張ボードを使用して、インターネット接続の気象ステーションを構築します。このプロジェクトでは、ESP32が気温や湿度を含むリアルタイムの気象データを取得し、それをLCDスクリーンに表示することができます。このアプリケーションは、ESP32の機能を紹介するだけでなく、外部APIからデータを取得して解析する方法も示しています。

チュートリアルを進めるにつれて、コンポーネントを配線し、コードを構成し、すべてがシームレスに機能することを確認します。最終的な結果は、10秒ごとに読み取りを更新し、現在の気象条件を明確に表示する完全に機能する気象ステーションになります(ビデオの00:30で)。

ハードウェアの解説

このプロジェクトで使用される主なコンポーネントには、ESP32マイクロコントローラー、LCDディスプレイ、および必要な配線が含まれます。ESP32は内蔵のWi-FiとBluetoothを備えており、インターネットに接続してデータを取得することができます。LCDディスプレイは、温度と湿度を含む現在の天気情報を表示します。

私たちが使用しているLCDは16x2の文字表示で、2行の各16文字を表示できることを意味します。これで私たちの天気情報の出力には十分です。ESP32はI2Cを介してLCDと通信し、わずか2本のデータラインを使うことで配線が簡素化されます。

データシートの詳細

製造業者エスプレスシフ
部品番号ESP32-WROOM-32
論理/IO電圧3.3 V
供給電圧3.0-3.6 V
出力電流(チャネルごと)最大12 mA
ピーク電流(チャンネルあたり)40 mA
PWM周波数ガイダンス1 kHz
入力ロジック閾値0.3 V(低)、0.7 V(高)
電圧降下 / RDS(on)/ 飽和度0.5 V
熱的限界-40から85 °C
パッケージQFN48
ノート / バリアントさまざまな用途に応じた複数のバリアントが含まれています。

  • ESP32に安定した3.3Vの電源が供給されていることを確認してください。
  • すべてのコンポーネントに共通の基盤を使用して、通信の問題を回避してください。
  • I2Cスキャナーを使用してLCDのI2Cアドレスを確認してください。
  • データ取得中の接続切れを避けるために、Wi-Fi接続の状態を監視してください。
  • データ取得の堅牢性のためにJSONパースエラーを処理する。

配線指示

esp32-43-weather_station-wiring

コンポーネントを配線するには、まずLCDをESP32に接続します。LCDはI2Cインターフェースを使用するため、LCDのSDAピンをESP32のGPIO21に、SCLピンをGPIO22に接続してください。LCDの電源ピンとグラウンドピンをそれぞれESP32の5VピンとGNDピンに接続することを確認してください。

次に、付属のリチウムバッテリーまたはUSB接続を使用してESP32が正しく電源供給されていることを確認してください。バッテリーはポータビリティを提供しますが、USB接続はプログラミングやデバッグに便利です。最後に、すべての接続が確実であることを確認し、機能を妨げる可能性のある緩い配線の問題を避けてください。

コード例とウォークスルー

プログラムのセットアップフェーズでは、シリアル通信を初期化し、提供されたSSIDとパスワードを使用してWi-Fiネットワークに接続します。以下のコードスニペットはWi-Fi接続を処理します。

WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
}
Serial.println("Connected to WiFi network with IP Address: ");
Serial.println(WiFi.localIP());

このコードは、データ取得に進む前にESP32が指定されたWi-Fiネットワークに接続することを確保します。接続に失敗した場合、再接続を継続的に試みます。

次に、天気データを取得するためにHTTP GETリクエストを送信する必要があります。これは以下のコードスニペットを使用して実現されます:

String serverPath = "http://api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;
jsonBuffer = httpGETRequest(serverPath.c_str());

ここでは、都市、国コード、そして私たちのAPIキーを含むAPIリクエストのURLを構築します。httpGETRequest関数が呼び出されて、天気データを取得します。

最後に、JSONレスポンスを解析し、LCDに関連データを表示します。

lcd.clear(); 
lcd.setCursor(0, 0); 
lcd.print(time);
lcd.print(" ");        
lcd.print(myObject["weather"][0]["main"]);             
lcd.setCursor(0, 1);
lcd.print("T:");    
lcd.print(myObject["main"]["temp"]); 
lcd.print("\xDF");  // "°" char
lcd.print("C ");    
lcd.print("H:");    
lcd.print(myObject["main"]["humidity"]);  
lcd.print("%");

このコードスニペットは、LCDディスプレイを現在の時刻、天候、気温、湿度で更新します。以前の表示をクリアし、各行の適切な位置にカーソルを設定します。

デモンストレーション / 期待すること

成功に配線とプログラミングが完了すると、あなたの天気予報ステーションはWi-Fiに接続し、10秒ごとに天気データを取得し始めます。現在の温度、湿度、気象条件がLCD画面に表示されます。ESP32がWi-Fiに接続できない場合、シリアルモニターにエラーメッセージを表示します。

OpenWeatherMapサービスからブロックされないように、API呼び出し制限に注意してください。データの取得に問題がある場合は、APIキーを確認し、都市と国コードが正しく指定されているかを確認してください(動画の15:45にて)。

ビデオのタイムスタンプ

  • 00:00 開始
  • 2:00 プロジェクトの紹介
  • 5:04 OpenWeather アカウント
  • 6:11 配線
  • 8:05 Arduino コードの説明
  • 14:13 ジェイソン コード内の要素
  • 20:23 Arduino IDEでESP32ボードとCOMポートを選択中
  • 22:05 LCD1602での気象ステーションのデモンストレーション
  • 23:45 LCD2004での気象ステーションのデモンストレーション

画像

esp32-43-weather_station-main
esp32-43-weather_station-main
esp32-43-weather_station-wiring
esp32-43-weather_station-wiring
844-ESP32 Tutorial 43/55- Arduino code for IoT Internet Weather Station
言語: C++
/*
 * ルイ・サントス  
 * プロジェクトの詳細は、https://RandomNerdTutorials.com/esp32-http-get-open-weather-map-thingspeak-arduino/ でご覧いただけます。  
 * 
 * このソフトウェアおよび関連ドキュメントファイルのコピーを取得した任意の人に対して、無償で許可が付与されます。  
 * 
 * 上記の著作権表示およびこの許可通知は、すべてのコピーまたはソフトウェアの重要な部分に含めるものとします。
 */
#include <LiquidCrystal_I2C.h>
#include <WiFi.h>
#include <HTTPClient.h>
#include <Arduino_JSON.h>


 // 次の変数をあなたのSSID/パスワードの組み合わせに置き換えてください。
const char* ssid = "SSID";
const char* password = "PASSWORD";

 // あなたのドメイン名、またはパス付きのURLまたはIPアドレス
String openWeatherMapApiKey = "openWeatherMapApiKey";

 // あなたの国コードと都市に置き換えてください
 // https://openweathermap.org/find で国コードを確認してください。
String city = "CITY";
String countryCode = "COUNTRY CODE";

 // デフォルトのタイマーはテスト目的で10秒に設定されています。
 // 最終的なアプリケーションでは、ブロックや禁止を避けるために、時間ごとまたは分ごとのAPI呼び出し制限を確認してください。
unsigned long lastTime = 0;
 // タイマーは10分(600000ミリ秒)に設定されています。
 // unsigned long timerDelay = 600000;
 // タイマーを10秒(10000)に設定してください。
unsigned long timerDelay = 10000;

String jsonBuffer;

 // LCDの列数と行数を設定します。
int lcdColumns = 16;
int lcdRows = 2;

 // LCDアドレス、列数、行数を設定する
 // SDA -> GPIO21, SCL -> GPIO22
 // lcdアドレスは0x27です。I2Cスキャナースケッチを実行してください。
LiquidCrystal_I2C lcd(0x27, lcdColumns, lcdRows);

 // NTPサーバーの時間
const char* ntpServer = "pool.ntp.org";
long  gmtOffset_sec = 0;
int   daylightOffset_sec = 0; // 3600;

void setup() {
  Serial.begin(115200);

 // WiFi
  WiFi.begin(ssid, password);
  Serial.println("Connecting");
  while(WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.print("Connected to WiFi network with IP Address: ");
  Serial.println(WiFi.localIP());
  Serial.println("Timer set to 10 seconds (timerDelay variable), it will take 10 seconds before publishing the first reading.");

 // LCDを初期化する
  lcd.init();
 // LCDバックライトをオンにする
  lcd.backlight();

}

void loop() {
 // HTTP GET リクエストを送信します
  if ((millis() - lastTime) > timerDelay) {
 // WiFi接続状況を確認する
    if(WiFi.status()== WL_CONNECTED){
      String serverPath = "http: // api.openweathermap.org/data/2.5/weather?q=" + city + "," + countryCode + "&units=metric" + "&APPID=" + openWeatherMapApiKey;

      jsonBuffer = httpGETRequest(serverPath.c_str());
      Serial.println(jsonBuffer);
      JSONVar myObject = JSON.parse(jsonBuffer);

 // JSON.typeof(jsonVar)を使用して、変数のタイプを取得できます。
      if (JSON.typeof(myObject) == "undefined") {
        Serial.println("Parsing input failed!");
        return;
      }

 // JSONオブジェクト = 
 // 空の文字列
 // シリアル.print("温度: ");
 // 空の文字列
 // 圧力を表示します;
 // シリアル.println(myObject["main"]["pressure"]);
 // 湿度: 
 // Serial.println(myObject["main"]["湿度"]);
 // 風速を表示します: 
 // Serial.println(myObject["wind"]["speed"]);

 // 時間を取得する
      gmtOffset_sec =  myObject["timezone"];
      configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
 // 時間 =
      String time = printLocalTime();

 // LCDプリント
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.print(time);
      lcd.print(" ");
      lcd.print(myObject["weather"][0]["main"]);
      lcd.setCursor(0, 1);
      lcd.print("T:");
      lcd.print(myObject["main"]["temp"]);
      lcd.print("\xDF"); // "°" 文字
      lcd.print("C ");
      lcd.print("H:");
      lcd.print(myObject["main"]["humidity"]);
      lcd.print("%");

    }
    else {
      Serial.println("WiFi Disconnected");
    }
    lastTime = millis();
  }
}

String printLocalTime(){
  struct tm timeinfo;
  if(!getLocalTime(&timeinfo)){
    Serial.println("Failed to obtain time");
    return "null";
  }
 // Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S");

 // HH:MMの時間形式を取得
  char timeHour[3];
  strftime(timeHour,3, "%H", &timeinfo);
  char timeMinute[3];
  strftime(timeMinute,3, "%M", &timeinfo);
  String time = String(timeHour) + ":" + String(timeMinute);
  Serial.println(time)
;  return time;
}


String httpGETRequest(const char* serverName) {
  WiFiClient client;
  HTTPClient http;

 // あなたのドメイン名、またはパス付きのURLまたはIPアドレス
  http.begin(client, serverName);

 // HTTP POSTリクエストを送信する
  int httpResponseCode = http.GET();

  String payload = "{}";

  if (httpResponseCode>0) {
    Serial.print("HTTP Response code: ");
    Serial.println(httpResponseCode);
    payload = http.getString();
  }
  else {
    Serial.print("Error code: ");
    Serial.println(httpResponseCode);
  }
 // 無料リソース
  http.end();

  return payload;
}

リソースと参考文献

ファイル📁

ファイルは利用できません。