何とか、其れらしい動きをする様にプログラムを修正しました。
volatile unsigned char data_l;
volatile unsigned char data_r;
volatile unsigned char vol_p;
volatile unsigned char vol_n;
volatile unsigned char mute;
// loop内に下記のルーティンを入れました。
void loop()
{
***********
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
switch (results.value) {
case 0xFDA05F:
send_att_mute_value_lch();
send_att_mute_value_rch();
mute = 1;
break;
case 0xFD906F:
data_inc(); // VR 大
vol_p = 1;
vol_n = 0;
mute = 0;
break;
case 0xFD807F: // VR 小
data_dec();
vol_n = 1;
vol_p = 0;
mute = 0;
break;
delay(50);
case 0xFFFFFFFF:
if(vol_p == 1 || mute !=0){
data_inc();
delay(200);}
else {data_dec();
delay(200);}
break;
}
irrecv.resume();}
}
case 0xFFFFFFFF: ボタンをし続けるとリピート フレームを検出します。このフレームと vol_p = 1;、 vol_n = 0;の組み合わせで data_inc(); 、data_dec(); のどちらかの関数を実行します。200msのデレイを入れていますので、LCD上の標示は
適当な速さで変わっていきます。
MUTE状態からVR大を押しますと押し方により-95dBを抜かし-94dBを標示してしまうことがあり、 delay(50);を入れていますが
気休めです。
このリモコンは最初にボタンを押すと其のボタンのコード「0xFD906F」を一回出し其の後はリピートフレームを連続で出し続けます。ですから、ボタンを短い時間押すときは-95dB、-94dB、-93dBと標示が変わりますが、ちょっと長押し気味に押すと飛び越してしまいます。
取りあえずはほぼ期待通りに動いているのでこれで良しとします。
一つ問題点があります、と云うのはリピートフレーム(0xFFFFFFFF)を出すリモコンでは誤動作してしまいます。これはどうしようもありません。リピートフレームを使わないでリモコンのボタン長押しを認識する方法があれば防げるのですがね。
2016/4/12(Tue)
一見うまく行った様な印象ですが、やはりNGです。リピートフレーム(0xFFFFFFFF)を使うやり方では駄目なことが分かりました。
残念!