
ESP8266は日本の技適を通ってないので,厳密なことを言うと国内でこれを使う(電波を出す)ことは違法です。僕みたいなアマチュアはそんなこと気にしなくてもいいと思いますが,そろそろ「技適厨」が沸いてきそうな気がするので,今日からESP32に切り替えることにします。
ところで,「技適厨」ってのは「ネトウヨ」と心性が似てる気がしますね。なんだか承認欲求をこじらせてる感じ(笑)。「技適厨」のネトウヨ率を調べてみたら面白いんじゃないかなー。
話がそれましたが,AmazonでESP32の開発ボード(990円)を買いました。Wi-FiのほかにBluetoothも使えるんですね。またしばらく遊べそうです。
ESP32をArduino IDEで使えるようにする手順は例によって省略。僕はこのあたりを参考にしました。ツール>ボードは ESP32 Dev Moduleを選択します。
とりあえずスケッチ例のBlinkを書き込んでみようとしたら,書き込み中にTimeOutしてしまいます。どうやら書き込むときにはタクトスイッチの複雑な操作が必要みたい。でも,ENとGNDの間に0.1μFくらいのコンデンサを入れてやればめんどうな操作なしで自動書込できるようになるらしいです。(僕が買った開発ボードは0.1μFではダメで,0.22μF(224)にしてやったらうまく書き込めるようになりました)

前回,天気予報APIを叩いてみましたが,今回は openexchangerates.org のAPIを叩いて為替レート(USD/JPY)を取得してみました。ここも無料アカウントを作ってIDをもらっておく必要があります。
//ESP32でhttps://openexchangerates.org/から USD/JPY の為替レート情報を取得する
//I2C OLED SSD1306
#include <WiFi.h>
#include <HTTPClient.h>
#include <ArduinoJson.h>
#include "Wire.h"
#include "SSD1306.h"
#define SDA 21 //SDA-GPIO21
#define SCL 22 //SCL-GPIO22
SSD1306 display(0x3c, SDA, SCL); //I2Cアドレス 0x3c
const char* ssid = "あなたの無線LANのSSID";
const char* password = "あなたのパスワード";
const String endpoint = "http://openexchangerates.org/api/latest.json?app_id=あなたのID";
void setup() {
Serial.begin(115200);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
display.init();
}
void loop() {
if ((WiFi.status() == WL_CONNECTED)) {
HTTPClient http; http.begin(endpoint);
int httpCode = http.GET();
if (httpCode > 0) {
String payload = http.getString();
Serial.println(httpCode);
Serial.println(payload);
DynamicJsonBuffer jsonBuffer;
String json = payload;
JsonObject& ratedata = jsonBuffer.parseObject(json);
if(!ratedata.success()){
Serial.println("parseObject() failed");
}
const double JPY = ratedata["rates"]["JPY"].as<double>();
const int timestamp = ratedata["timestamp"].as<int>();
static const char *wd[] = {"Sun","Mon","Tue","Wed","Thu","Fri","Sat"};
time_t t = timestamp;
struct tm *tm = localtime(&t);
char buff[12];
sprintf( buff, "%04d/%02d/%02d(%s)",tm->tm_year+1900,tm->tm_mon+1,tm->tm_mday,wd[tm->tm_wday] );
display.clear();
display.setFont(ArialMT_Plain_16);
display.drawString(0,0,buff);
display.display();
display.drawString(0,30,"USD/JPY " + String(JPY));
display.display();
}
http.end();
delay(60*60*1000); //60分おきに更新
}
}