Arduino(?)に繋いだ可変抵抗を本当に回した時だけ値を受けとるには?が勉強になりました。なるほど、こうやるのか!
で、
- 平均化して、
- 値が変ったときだけ出力
というのがやりやすいように関数にしてみました。
#移動平均を出力する関数
int averageStream(int val){
static const int MODULUS = 8;
static int val_hist[MODULUS];
static int sum=0;
static byte i_mod=0;
sum += ( val - val_hist[i_mod] );
val_hist[i_mod] = val;
i_mod = ++i_mod % MODULUS;
return sum / MODULUS;
}
値を入力すると直近8個の移動平均を出力します。
#値が変ったかを判定する関数
boolean isChanged(int val){
static const int MODULUS = 4;
static int val_hist[MODULUS];
static byte i_mod=0;
val_hist[i_mod] = val;
i_mod = ++i_mod % MODULUS;
for(int j = 0; j < MODULUS - 1; j++){
if( val == val_hist[ (i_mod + j) % MODULUS ] ) return false;
};
return true;
}
直近の三つの値と比べて同じものがあれば偽、でなければ真を返します。
#まとめ
最近staticの使いどころが判ったので連発してみました。
これで一個のボリュームはいけるでしょう。
では複数にしたいときは?
- クラスに変数と関数を登録して
- インスタンスを作って...
みたいな感じなのかしら。こちら方面の流儀に疎いもんで...