傘が必要かをLEDで教えてくれるIoTをESPrで作った

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

動作

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.

関連記事

+ブラウザで動くオンライン対戦リバーシ作ってみた
+socket.ioで簡易チャットアプリ作った
+SQLノート(MySQL)
+自然言語処理のCOTOHA APIをPHPで使ってみた
+LINEBOTで画像文字起こしと有害検出