平滑化っぽいことを行い
ちょっとまちがってるけどね。
最大値を保持する変数を設けて、
最初はありえないほど小さな値にしておくか、それとも一番最初に取得舌データを入れておいて、
新しいデータが得られる度にその最大値を保持する変数と新しいデータとを比べて、
新しいデータの方が大きい値なら最大値を新しいデータで書き換えれば、
いいんじゃない?
平滑化(移動平均)処理の誤りについて
平均ってどうやるか、これは言うまでもなく、要素全部の和/要素の数を計算すればいいわけです。
ここで、1023が150個あるはずの平均の計算が1023*151/150の値になったとすれば、「要素全部の和」が正しく求められているかをチェックする、というのが流れでしょう。
その計算は、
for(int i=0;i<n;i++) sensorValue+=f[i];
でやっているわけですがしかし、このループに入る前にsensorValueには
sensorValue = analogRead(sensorPin);
という値が与えられています。これによって1023が151個分足される、ということになるわけです。ここを修正する必要があります。
analogRead()は「実行したまさにそのときの値」
多分大問題にはならないでしょうけど...analogRead()は、そのときそのときのADコンバータの値を返してきます。電圧が変化していたなら2度連続で読んで、おなじ値になる保証はありません。
sensorValue = analogRead(sensorPin);//ここと
for(int i=n-1;i>0;i--)f[i]=f[i-1];
f[0]=analogRead(1);//ここ
温度のデータならこの短時間で大きく変化はしないだろう、というのは言えますけれど、一般論としてはよろしい手法ではないです。
int tmpValue= analogRead(sensorPin); //取得は一回だけ
sensorValue=tmpValue;
for(int i=n-1;i>0;i--)f[i]=f[i-1];
f[0]=tmpValue;
for(int i=1;i<n;i++) sensorValue+=f[i];
などとして、取得は一度だけにしておいた方がよいでしょう。
millis()による時間取得で似たようなことをやって、微妙なバグを生んでしまう例をみたことがあります。random()を何度も呼んでしまって動きが目茶苦茶になって...という質問も(ここではありませんが)先日ありました。この辺はバグが顕著に出やすいですね。
計算の改善案
150個分のデータを貯めておいて平均の計算をするわけですが、総和を求める際には別に計算の順序はどうでも良くて、直近150個分のデータをとにかく足せばいいわけです。150個の配列は、先頭から順に新しいデータが並んでいる必要はありません。なので、一個ずつデータにお詰め合わせを願って先頭に最新のデータを置く、なんてやらずに、
int i=0;
をグローバル変数に追加して
sensorValue=0;
f[i]=analogRead(sensorPin);
i= (i+1) % n;//この計算によりiは0,1,..,149,0,1,...を繰り返すことになる
for(int j=0;j<n;j++) sensorValue+=f[j]; //変数はiのままでもいいんだけど、わざわざ紛らわしいことはしない
で十分かと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/12/31 11:00
2019/12/31 13:15
2020/01/01 12:30
2020/01/06 16:09