インターネッツ・オブ・シングスしたいですよね。
でも、何から手を付けてよいやら分かんないっすよね。
ググッてみたら、妙にハードル高い記事多いし、逆に簡単だけど、ホントの最初の最初しかねえよ!みたいな...
ってなわけで、私がESP-WROOM-02というゴイスーなWi-Fiモジュールを使ってゴニョゴニョした際の足跡をば。
ESP-WROOM-02がゴイスーな理由
- 安い(モジュール単品だと数百円)
- 簡単(Arduinoが使えるぜ!)
- 小さい(2.0cm×2.0cmぐらい?)
- 参考記事多い!(超大事)
買い物しよう
よろしく作り込んでくれているコイツを買いましょう。
あと、持ってない人は「半田ごて」と「半田」も買いましょう。
開発ボード単体で遊ぶ分には不要ですが、ブレッドボードにぶっ刺したりするには自分で半田付けし、ピンを付けたげる必要があります。
なお、「開発ボードが売り切れていた」「いきなりハードモード希望」の方は、
等を参考に頑張ってください。
シリアル通信してみたり、Wi-Fi繋いだり、スマホからGETしたりしよう
そもそも「シリアル通信」ってなんじゃい?って方は、これでも読んで知ったかぶりしよう。
セットアップについては、こちらの記事が素晴らしく分かり易いので、これ読んで頑張ってください。
なお、記事はちゃんと最後のコメント欄まで読むようにしましょう。↓ココ超大事です。
ESP FLASH DOWNLOAD TOOLでSTARTボタンを押す前に、IO0スイッチを押した状態で、RESETボタンを押して離し、IO0スイッチを押した状態のまま、ESP FLASH DOWNLOAD TOOLのSTARTボタンを押さないと、ファームウェアの書き込みが出来ませんでした。
ファーム書き込み時に上記のコマンド入力が必要です。波動拳出すより簡単なので大丈夫。
スマホからWi-Fi設定出来るようにしよう
色んな場所で使いたいよね!ってことで、Wi-Fi設定をブラウザから出来るようにしてみましょう。
HTTPでGETしちゃおう
Wi-Fi繋がったら次はHTTPリクエストですね。
以下メソッドを作って、Wi-Fi接続完了直後とかにぶち込んじゃいましょう。
シリアルモニタを起動させて再起動すると、お天気情報のJSONが表示されます。ゴイスー。
/**
* HTTPリクエスト(GET)
*/
void http_get() {
HTTPClient http;
http.begin("http://weather.livedoor.com/forecast/webservice/json/v1?city=400040");
int httpCode = http.GET();
if(httpCode) {
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if(httpCode == 200) {
String payload = http.getString();
Serial.println(payload);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
}
http.end();
delay(5000);
}
せっかくだからArduinoでJSON扱おう
採ってきたJSONをよしなに扱えるようにデコードしましょう。
下記のライブラリを使います。
https://github.com/bblanchon/ArduinoJson
使い方は
1. GithubからzipでDL
2. Arduino IDEのメニュー開く
3. スケッチ>ライブラリをインクルード>.ZIP形式のライブラリをインストール
でDLしたzipファイルを選択しインスコ。
コードはこんな感じで。
#include <ArduinoJson.h>
/**
* HTTPリクエスト(GET)
*/
void http_get() {
const int BUFFER_SIZE = JSON_OBJECT_SIZE(4) + JSON_ARRAY_SIZE(1);
StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
HTTPClient http;
http.begin("http://api.fixer.io/latest?base=USD&symbols=JPY");
int httpCode = http.GET();
if(httpCode) {
Serial.printf("[HTTP] GET... code: %d\n", httpCode);
if(httpCode == 200) {
String payload = http.getString();
Serial.println(payload);
/* JSONデコード */
char* json = new char[payload.length() + 1];
payload.toCharArray(json, payload.length() + 1);
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) {
Serial.println("parseObject() failed");
}
const char* date = root["date"];
Serial.println(date);
}
} else {
Serial.printf("[HTTP] GET... failed, error: %d\n", httpCode);
}
http.end();
delay(5000);
http_post();
}
なお、先述のお天気情報だとデータ量が大きすぎるのか、改行が入ってると駄目なのか、
何にせよ上手いこといかなかったので、呼び先は為替情報APIに変更してます。
別のJSONライブラリ使えば上手く行くかも。。
HTTPでPOSTしちゃおう
次はPOST。ESP8266HTTPClientを使ったやり方になります。
送り先は各自適当にサーバ立てるなりしてお試し下さい。
/**
* HTTPリクエスト(POST)
*/
void http_post() {
HTTPClient http;
const char * headerkeys[] = {"User-Agent","Set-Cookie","Cookie","Date","Content-Type","Connection"} ;
http.begin("http://hogehoge/hogehoge/");
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
int httpCode = http.POST(String("parameter1=value1& parameter2=value2"));
Serial.printf("[HTTP] POST... code: %d\n", httpCode);
Serial.println(http.getString());
}
SPI通信しよう
IoTのTをやりましょう!!
というわけで3軸ジャイロセンサーを買います。
こちらを以下の通りに配線します。配線コードは適当に買って下さい。
ESP-WROOM-02側 | センサ側 |
---|---|
ピン1:VDD | ピン1:VDD |
ピン3:SPI_CLK | ピン2:SPC |
ピン5:SPI_MOSI | ピン3:SDI |
ピン4:SPI_MISO | ピン4:SDO |
ピン6:SPI_CS | ピン5:CS |
ピン18:GND | ピン8:GND |
Arduinoのプログラムは下記参照。そのままペタッと貼り付けて、書込み実施すると動きます!
ブレッドボードを手に持ってグリグリ動かしてみましょう!きっと面白いよ!
なお、ここまでの記事内容に従って、Arduino IDEの設定を行っている場合は、
シリアルモニタの表示が文字化けしてしまうので、
Serial.begin(9600);
の「9600」を「115200」に書き換えます。
センサから取った値をインターネッツに放り投げよう。
ってなところで、適当にサーバおっ立てましょう。Djangoとか簡単でいいと思うよ!
んで、そこに向かってセンサの値を放り投げちゃえば...This is IoT!! Yeah!!