我が家では、sparkfun の
weathermetersを使って、風向・風速・雨量の計測をやっています。
プログラムはガリレオ7さんのこちらから公開されているArduinoのライブラリを使わせていただき、プログラムを書いて計測をしているのですが、近隣のアメダスと比べて、2倍程度、値が大きくなる傾向がみられていたので、ちょっと修正が必要だなと思っていましたが、とりあえずデータは取れるので放置状態でした。
weathermeters は、風速計などの中にスイッチが入っていてそれの入り切りをarduinoでカウントして計測しているのですが、おそらくこのスイッチがチャタリングを起こしており、それを余計にカウントしているのだろう。という予想をしました。
weatherduino3の風速計などの計測は、Cで書かれたArduinoのライブラリで、スイッチによるINT0, INT1割り込みを受けてカウントを行っているのですが、ここにチャタリングの影響を除去するコードを差し込んでみました。
具体的には、Arduinoで時刻を測るのにmillis() でtimer0によってカウンタ(timer0_millis)を更新しているのですが、これを調べて、前のスイッチイベントから一定時間経ってないとチャタリングとみなしてカウントをしないようにしました。
下記は、変更した部分の抜粋です。
extern volatile unsigned long timer0_millis;
static unsigned long int0_millis=0, int1_millis=0;
#define CHATTERING_MILLIS 12// 割込み 風速
void wmeters_int0 () {
if (timer0_millis – int0_millis >= CHATTERING_MILLIS ) {
wmanemo_count ++;
int0_millis = timer0_millis;
}
}// 割込み 雨量
void wmeters_int1 () {
if (timer0_millis – int1_millis >= CHATTERING_MILLIS ) {
wmrain_count ++;
int1_millis = timer0_millis;
}}
時刻7017 あたりで、チャタリング除去コードに更新しました。
平均風速(赤い線)がかなりプログラム変更によって小さくなっていることがわかります。
時刻7018 以降にさらにチャタリングの待ち時間を最初に設定した7ms からさらに12msにしましたが、結果が変わっていないので、チャタリングは7ms 未満で収まっているようですね。
プログラムを変更しても依然近隣と比べ風が強めですが、これは地形の効果だと思います。
これで測定としてはちゃんとしたものになりますので、今週また来るであろう台風の風について調べてみようと思います。