直近9時間に雨予報があったら赤LED、なかったら緑LEDを発光。いずれは玄関に置きたいッ!

Contents
動作
10分毎にHTTPでOpenWeatherMapから天気を取得し、直近9時間に雨予報があったら赤LED、なかったら緑LEDを発光させる。
開発環境
SwitchScienceのESPrDeveloper(ESP-WROOM-02)で制御。とりあえずブレッドボードに配線組んでます。配線は画像の通り。
開発も書き込みもArduinoIDEで行っています。
僕はLinuxで開発しているので、USBデバイスの権限を変える。これはデバイスが接続されるたびに実行する必要がある。
sudo chmod 777 ttyUSB0
プログラム
デバッグ用コードそのままの適当なプログラムだけど、動く。ただ、StaticJsonBufferを2000以上にすると動かなくなるので、APIの取得数をcnt=2で直近6時間〜9時間の天気を取得している。10分ごとに取得して反映させる。
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ArduinoJson.h>
const char* ssid = "ここにSSID";
const char* password = "ここにセキュリティキー";
// id:場所,appid:APIKey,cnt:取得数
const char* openWeatherMapApiUrl = "http://api.openweathermap.org/data/2.5/forecast?id=1852663&units=metric&appid=ここにAPIKey&cnt=2";
// 1852663 seto
// 1894616 okinawa
String result = "";
boolean isWeatherClear = false;
void setup() {
Serial.begin(115200);
delay(10);
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(100);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pinMode(13, OUTPUT);
pinMode(14, OUTPUT);
}
void loop() {
if (WiFi.status() == WL_CONNECTED) {
Serial.print("connecting to ");
Serial.println(ssid);
} else {
Serial.print("not connection");
}
// 取得
result = getPageSource(openWeatherMapApiUrl);
// レスポンスのJSONをパース
StaticJsonBuffer<2000> resBuffer;
JsonObject& root = resBuffer.parseObject(result);
JsonArray& item = root["list"].asArray();
const int route1 = item[0]["weather"][0]["id"];
const int route2 = item[1]["weather"][0]["id"];
// weatherのIDが701以上だったら晴れ
if (route1 > 700 && route2 > 700) {
isWeatherClear = true;
} else {
isWeatherClear = false;
}
// LED切り替え
if (isWeatherClear) {
digitalWrite(13, LOW);
digitalWrite(14, HIGH);
Serial.println("CLEAR");
} else {
digitalWrite(14, LOW);
digitalWrite(13, HIGH);
Serial.println("RAIN");
}
// 10分待機
delay(10 * 60 * 1000);
}
String getPageSource(const char host[]) {
HTTPClient http;
http.begin(host);
int httpCode = http.GET();
result = "";
if (httpCode < 0) {
result = http.errorToString(httpCode);
} else if (http.getSize() < 0) {
result = "size is invalid";
} else {
result = http.getString();
}
http.end();
return result;
}
ESP-WROOM-02の強み
- WiFi接続が圧倒的に簡単
- 色んな面でArduinoの上位互換
- ArduinoIDEで開発できる
玄関に置くための課題
- バニラ基盤などで回路を組む
- もっと小さいESPを買う
- 電池ボックスから電源供給する
- StaticJsonBufferの値を2000以上にすると発生する不具合を解消して、もう少し先の時間までわかるようにする
The present writer kazz.