WeMosをRESPのクライアントとして機能するため、JSONと、HTTPClientを検証する。
前回ArduinoJsonというライブラリを使用したので、ESP8266ならではのWiFi機能を使い、インターネットから情報を取得して表示させてみる。
JSON データ形式
為替レートの情報は、
Foreign exchange rates and currency conversion JSON API
から取得する。
ドル円レートの情報を取得する場合、URLはhttp://api.fixer.io/latest?base=USD&symbols=JPY
応答は下記の通り
HTTP/1.1 200 OK Server: nginx/1.13.6 Date: Sat, 04 Nov 2017 13:40:46 GMT Content-Type: application/json Content-Length: 57 Connection: close Cache-Control: public, must-revalidate, max-age=900 Last-Modified: Fri, 03 Nov 2017 00:00:00 GMT Vary: Origin X-Content-Type-Options: nosniff {"base":"USD","date":"2017-11-03","rates":{"JPY":113.94}} closing connection
プログラム
下記の処理をする
- WiFiManagerでWiFi自動接続
- get_exchange_rate処理
- api.fixer.io JSONデータ取得
- parse json data
- OLEDへ表示
- 60秒待ち
- 2へ続き
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> #include <ArduinoJson.h> #include <Adafruit_GFX.h> #include <Adafruit_SSD1306.h> #define OLED_RESET 0 // GPIO0 Adafruit_SSD1306 OLED(OLED_RESET); const char* URL = "http://api.fixer.io/latest?base=USD&symbols=JPY"; // http resource //sample json data used in this sketch // {"base":"USD","date":"2017-11-03","rates":{"JPY":113.94}} //needed for library #include <DNSServer.h> #include <ESP8266WebServer.h> #include "WiFiManager.h" //https://github.com/tzapu/WiFiManager void configModeCallback (WiFiManager *myWiFiManager) { Serial.println("Entered config mode"); Serial.println(WiFi.softAPIP()); //if you used auto generated SSID, print it Serial.println(myWiFiManager->getConfigPortalSSID()); } void setup() { OLED.begin(); OLED.clearDisplay(); //Add stuff into the 'display buffer' OLED.setTextWrap(false); OLED.setTextSize(1); OLED.setTextColor(WHITE); OLED.setCursor(0,0); delay(10); Serial.begin(115200); Serial.println(""); delay(10); // Connect to WiFi network OLED.println("wifiManager autoConnect..."); OLED.display(); //output 'display buffer' to screen //WiFiManager //Local intialization. Once its business is done, there is no need to keep it around WiFiManager wifiManager; //reset settings - for testing //wifiManager.resetSettings(); //set callback that gets called when connecting to previous WiFi fails, and enters Access Point mode wifiManager.setAPCallback(configModeCallback); //fetches ssid and pass and tries to connect //if it does not connect it starts an access point with the specified name //here "AutoConnectAP" //and goes into a blocking loop awaiting configuration if(!wifiManager.autoConnect()) { Serial.println("failed to connect and hit timeout"); //reset and try again, or maybe put it to deep sleep ESP.reset(); delay(1000); } // Print the IP address OLED.print("http://"); OLED.print(WiFi.localIP()); OLED.println("/"); OLED.println("WiFi connected"); OLED.display(); //output 'display buffer' to screen //if you get here you have connected to the WiFi Serial.println("connected...yeey :)"); } void get_exchange_rate() { const int BUFFER_SIZE = JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1); StaticJsonBuffer<BUFFER_SIZE> jsonBuffer; HTTPClient http; Serial.print("[HTTP] begin...\n"); // configure targed server and url http.begin(URL); Serial.print("[HTTP] GET...\n"); // start connection and send HTTP header int httpCode = http.GET(); if(httpCode != HTTP_CODE_OK) { return; } String buffer = http.getString(); Serial.println(buffer); //parse json data char json[buffer.length() + 1]; buffer.toCharArray(json, sizeof(json)); Serial.println(json); JsonObject& root = jsonBuffer.parseObject(json); if (!root.success()) { Serial.println("parseObject() failed"); return; } const char* date = root["date"]; Serial.println(date); const char* base = root["base"]; Serial.println(base); JsonObject& rates = root["rates"]; rates.printTo(Serial); Serial.println(); const char* rate = rates["JPY"]; Serial.println(rate); Serial.println(); Serial.println("closing connection"); OLED.clearDisplay(); OLED.setCursor(0,0); // Print the IP address OLED.print("http://"); OLED.print(WiFi.localIP()); OLED.println("/"); OLED.setCursor(0, 16); OLED.print(date); OLED.setCursor(0, 24); OLED.print("JPY/"); OLED.print(base); OLED.print(": "); OLED.print(rate); OLED.display(); //output 'display buffer' to screen } void loop() { get_exchange_rate(); delay(60000); }
参考
- http://blog.boochow.com/article/425016458.html — ESP8266版Arduinoでネットから情報を取ってきてLCDに表示する