いつのまにかIRremoteESP8266の仕様が変わってる?
1年くらい前から、esp-wroom-02にArduinoスケッチを書き込んで遊んでます。
このたびPCの環境が変わったので、新たにArduinoIDEをインストールし、スケッチは前のPCから移行してきました。
すると、1年くらい前に書いて、そのときはちゃんと動いてたスケッチが、今はコンパイルすら通らない!
エラーメッセージをよく読んでみたら、IRremoteESP8266という赤外線リモコンを扱うためのライブラリを使うところで何かが起きている。
どうやら、最新のIRremoteESP8266ライブラリをダウンロードしたので、1年前に書いたスケッチではうまく動かなくなってたらしい。
変わったこと1
ソースファイルが分割された。旧スケッチでは、
#include <IRremoteESP8266.h>
だけ済んだが、最新のライブラリでは、例えばIRsendを使うなら、
#include <IRremoteESP8266.h> #include <IRsend.h>
としないといけない。
変わったこと2
1年前に書いたスケッチではIRsend.sendRaw()を使っていたのだが、この関数の引数の型が変わっていた。
こんなコンパイルエラーが出た。
no matching function for call to 'IRsend::sendRaw(unsigned int*&, int&, const int&)
no known conversion for argument 1 from 'unsigned int*' to 'uint16_t* {aka short unsigned int*}'
sendRaw()の3つの引数の型が全てuint16_tになっていた。なんでだ。
Fix almost all Google cpplint issues & use c99 types. (#185) · markszabo/IRremoteESP8266@1967455 · GitHub
あとakaってなんやねん、と思ってググったら「also known as」という意味らしい。ほー。
エラーメッセージ C++の意味 - 万年素人からHackerへの道
ともかく、ライブラリの(新しい)サンプルスケッチを参考にしつつつ、第1引数の、赤外線パターンの配列をuint16_tで宣言したら一件落着。
修正前
unsigned int CH1_ON[67] = {10200,5150, 600,700, 650,650, 650,1900, 650,650, 650,650, 650,650, 650,650, 600,1950, 650,2000, 650,650, 650,650, 650,650, 600,2000, 600,700, 600,2000, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,1950, 600,2000, 600,2000, 600,1950, 600,2000, 600,2000, 600,1950, 650,2000, 600};
修正後
uint16_t CH1_ON[67] = {10200,5150, 600,700, 650,650, 650,1900, 650,650, 650,650, 650,650, 650,650, 600,1950, 650,2000, 650,650, 650,650, 650,650, 600,2000, 600,700, 600,2000, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,700, 600,1950, 600,2000, 600,2000, 600,1950, 600,2000, 600,2000, 600,1950, 650,2000, 600};
第2引数、第3引数も型が合ってないから気持ち悪いんだけど、これらは合ってなくてもコンパイル通る(勝手に型変換されてる?)。
たぶん第1引数は配列を渡していて、ということは実はポインタを渡しているから、こっちは型が合ってないとダメなんだろうなー、ということぐらいしかわからん。詳しい人教えて。