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パースエラーを処理する。
配線指示

コンポーネントを配線するには、まず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での気象ステーションのデモンストレーション
/*
* ルイ・サントス
* プロジェクトの詳細は、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;
}
Common Course Links
Common Course Files
リソースと参考文献
-
ドキュメンテーションESP32 チュートリアル 43/55 - SunFounder の IoT インターネット気象 Station ドキュメントページdocs.sunfounder.com
ファイル📁
ファイルは利用できません。