とっても便利に使ってますminIRum。
・・・が、エアコンのコードが出せなくていろいろ悩んだので同じ状況の人向けに。
作者様の名誉のために断っておきますが修正対象はminIRum本体ではなくてライブラリです。
まずはminIRum(IRKit)のデータ構造をおさらい
minIRum(というかIRKit)の扱うデータは次の様なJSONとなっています。
{
'format':'raw', //データ形式(RAW以外は見たことない)
'freq':'38', //サブキャリア周波数(38or40:単位KHz)
'data':[...] //ON時間、OFF時間が連なる配列
}formatは’raw’固定です。拡張する予定があったかはともかく少なくとも公式の拡張は無さそう
freqはIRkitは38or40となってますが、他の値が通るかは不明1ソース精査してないので・・・ただしIRRemote使ってるminIRumでは通ります
dataはon時間とoff時間の組が連なる配列(単位は確かusec)
で、dataの配列サイズが今回のキモです。
変更点1:ajson
まずはajsonを修正します。
そもそもが本来メモリ2kBとかのarduino用ライブラリなんで不具合と言うつもりも無いけど、配列のサイズ/インデックスがunsigned charなのでそのままだと255エントリ(=家電協フォーマットだと15バイト+α)分しか扱えません。2赤外線リモコンのフォーマットについてはここ参照。ON時間+OFF時間の2エントリで1ビットを表現するので16エントリ/1バイト。それにリーダが2エントリ+エンドマークで2エントリ必要つまり18バイト3リーダ+エンドマーク込み292エントリ必要なウチのエアコン4霧ヶ峰って型番がMSZ-なのがガンダ(ryはアウト。
そのため、次の箇所を修正します。
// Get Array size/item / object item.
//unsigned char
unsigned int
aJsonClass::getArraySize(aJsonObject *array)
{
aJsonObject *c = array->child;
// unsigned char i = 0; //←ここを
unsigned int i = 0; //こう変更
while (c)
i++, c = c->next;
return i;
}
aJsonObject*
//aJsonClass::getArrayItem(aJsonObject *array, unsigned char item) //←ここを
aJsonClass::getArrayItem(aJsonObject *array, unsigned int item) //こう変更
{
aJsonObject *c = array->child;
while (c && item > 0)
item--, c = c->next;
return c;
}aJsonObject*
//aJsonClass::getArrayItem(aJsonObject *array, unsigned char item) //←ここを
aJsonClass::getArrayItem(aJsonObject *array, unsigned int item) //こう変更
{
aJsonObject *c = array->child;
while (c && item > 0)
item--, c = c->next;
return c;
}要は項目数とインデックスをunsigned char→unsigned intに変更しているだけです。
配列はLinkedList5これの実装は次のエントリへのポインタだけ持っている片方向。ちなみに前のエントリのポインタも持ってると双方向LinkedListで保持してるのでエントリ数の上限は特に無さそうですが、配列の各要素がクラス(少なくとも次エントリへのポインタと値は個々が持ってる筈)なのでメモリ的に普通のarduinoだと255エントリも使えないゆえの仕様でしょう
変更点2:IRremoteESP8266
こちらはminIRumで長いリモコンコードを読み込む際には必要です。
つまり別の解析ツールがあるとかでこれでコード読まないなら別に弄る必要はないです。
// Marks tend to be 100us too long, and spaces 100us too short
// when received due to sensor lag.
#define MARK_EXCESS 50U
//#define RAWBUF 100U // Default length of raw capture buffer //ここを
#define RAWBUF 300U // Default length of raw capture buffer //こう変更
#define REPEAT UINT64_MAX
#define UNKNOWN_THRESHOLD 6U // Default min size of reported UNKNOWN messages.RAWBUFの値を100→300に変更しています。
あと、ちょっと驚いたのが
// Constants
// Offset (in microseconds) to use in Period time calculations to account for
// code excution time in producing the software PWM signal.
// Value determined in https://github.com/markszabo/IRremoteESP8266/issues/62
#define PERIOD_OFFSET -3
#define DUTY_DEFAULT 50 //←これこのDUTY_DEFAULTってのはサブキャリアのデューティ比のデフォルト値ですがなぜか50%になってる。(NECフォーマットも家電協フォーマットも仕様は33%というか1/3) 実害はないんですが気になる人は33%にしといてもいいかも(申し訳程度だろうけど省電力になるはずですし)