気になっていたstrawberrylinuxのウェザーメーター。
https://strawberry-linux.com/catalog/items?code=18078
Sparkfun本国のサイトでarduinoのスケッチを発見したのと、DHT22を追加発注したのでついでに注文してみた。
さっそくつないでみたが、スケッチではなぜか風向きが逆方向で出力される。
ドキュメントを見ると16方向の時に得られる抵抗値が記載されている。
実際に調べてみると、若干の相違?というか誤差レベルの抵抗値も出力されているようだ。
| 抵抗値 |
方角 |
| 15 |
ESE |
| 16 |
ESE |
| 20 |
E |
| 22 |
E |
| 23 |
E |
| 31 |
SSE |
| 45 |
SE |
| 46 |
SE |
| 60 |
SSW |
| 61 |
SSW |
| 71 |
S |
| 101 |
NNE |
| 115 |
NE |
| 150 |
WSW |
| 157 |
SW |
| 158 |
SW |
| 176 |
NNW |
| 196 |
N |
| 197 |
N |
| 207 |
WNW |
| 222 |
NW |
| 236 |
W |
このまま得られた抵抗値をシリアルに出力して、PHPで方角に変換したほうが楽であろう。
風速は 1.492 MPh / hz だそうだ。 1マイル=1.60934キロだから? 約2.4kmか。日本では普通風速はm/sなので、÷60の÷60。2400m/60/60=0.66666m。
1秒かけて1周させれば0.67mってことか。仮に5秒置きに計測するとして5秒間で20周したら?1秒間に4周=0.67*4=2.68m/sか。
別のところから拾ってきたコードでは、km/hの計算で、下記の通り。
WindSpeed = (numRevsAnemometer/ 5) * 2.4; //2.4 K/h for one switch closure per second ってなっているから、20 /5 * 2.4 k/h = 9.6 k/h = 2.66666666m。
うん、あっている。これも指定秒間あたりの回転数を出力させてしまえば良いか。計算は母艦で。
で、スケッチ
/* Arduino sketch for Weather device from Sparkfun.
これはネットで拾ったスケッチを改修しています。
私のオリジナルではありません。
=========================================================
ANEMOMETER
=========================================================
風速計はgndと2番ピンにつなぐ。
パルスを拾うために attachInterrupt ができるピンである必要がある。
1パルス = 0.67m/s となる。
初期値では5秒あたりの回転数を出力する。
風速計はモジュラーの4ピンの内、2番と3番(内側)。
極性はなさそう。
=========================================================
WIND DIRECTION VANE
=========================================================
風向計
モジュラーの1番と4番(外側)。極性はなさそう。
10kの抵抗を与えて下図のように接続。
風向に応じて抵抗値が返ってくるのでそれを変換する必要がある。
(アナログといっても風向で返ってくる値は決まっている)
実測ではこんな感じだった。
抵抗値 方角
15 ESE
16 ESE
20 E
22 E
23 E
31 SSE
45 SE
46 SE
60 SSW
61 SSW
71 S
101 NNE
115 NE
150 WSW
157 SW
158 SW
176 NNW
196 N
197 N
207 WNW
222 NW
236 W
配線図
+5V
|
<
> 10K
< Resistor
<
>
|
Analog Pin 5------|
|
-----------| To weather vane
| (mystery resistance)
-----------|
|
|
-----
---
-
*********************************************************************/
#define ulong unsigned long
#define PIN_ANEMOMETER 2 // Digital 2 風速
#define PIN_VANE 5 // Analog 5 風向
// 5秒置きに出力
#define MSECS_CALC_WIND_SPEED 5000
#define MSECS_CALC_WIND_DIR 5000
volatile int numRevsAnemometer = 0; // 回転数
ulong nextCalcSpeed; // 風速を次に出力する時間(この秒になったら出力)
ulong nextCalcDir; // 風向きを次に出力する時間(この秒になったら出力)
ulong time; // 時間の流れ
//=======================================================
// 初期化
//=======================================================
void setup() {
Serial.begin(9600);
pinMode(PIN_ANEMOMETER, INPUT);
digitalWrite(PIN_ANEMOMETER, HIGH);
attachInterrupt(0, countAnemometer, FALLING); //割り込み0=ピン2 の割り込み設定
nextCalcSpeed = millis() + MSECS_CALC_WIND_SPEED; //次の計測は現在の+5000ミリ秒
nextCalcDir = millis() + MSECS_CALC_WIND_DIR;
}
//=======================================================
// メインループ
//=======================================================
void loop() {
time = millis();//現在時刻を取得
if (time >= nextCalcSpeed) { //計測時間になったら
calcWindSpeed();
nextCalcSpeed = time + MSECS_CALC_WIND_SPEED; //次の計測時間を設定
}
if (time >= nextCalcDir) {
calcWindDir();
nextCalcDir = time + MSECS_CALC_WIND_DIR;
}
}
//=======================================================
//風速の割り込み。回転数を+1
//=======================================================
void countAnemometer() {
numRevsAnemometer++;
}
//=======================================================
// 風向を出力
//=======================================================
void calcWindDir() {
int val;
val = analogRead(PIN_VANE);
val >>=2; // Shift to 255 range(0~255の値にする?)
Serial.print("Dir:");
Serial.println(val);
}
//=======================================================
// 風速を出力 (初期値では5秒あたりの回転数となる)
//=======================================================
void calcWindSpeed() {
Serial.print("speed:");
Serial.println(numRevsAnemometer);
numRevsAnemometer = 0; // 回転数をリセット
} |
/* Arduino sketch for Weather device from Sparkfun.
これはネットで拾ったスケッチを改修しています。
私のオリジナルではありません。
=========================================================
ANEMOMETER
=========================================================
風速計はgndと2番ピンにつなぐ。
パルスを拾うために attachInterrupt ができるピンである必要がある。
1パルス = 0.67m/s となる。
初期値では5秒あたりの回転数を出力する。
風速計はモジュラーの4ピンの内、2番と3番(内側)。
極性はなさそう。
=========================================================
WIND DIRECTION VANE
=========================================================
風向計
モジュラーの1番と4番(外側)。極性はなさそう。
10kの抵抗を与えて下図のように接続。
風向に応じて抵抗値が返ってくるのでそれを変換する必要がある。
(アナログといっても風向で返ってくる値は決まっている)
実測ではこんな感じだった。
抵抗値 方角
15 ESE
16 ESE
20 E
22 E
23 E
31 SSE
45 SE
46 SE
60 SSW
61 SSW
71 S
101 NNE
115 NE
150 WSW
157 SW
158 SW
176 NNW
196 N
197 N
207 WNW
222 NW
236 W
配線図
+5V
|
<
> 10K
< Resistor
<
>
|
Analog Pin 5------|
|
-----------| To weather vane
| (mystery resistance)
-----------|
|
|
-----
---
-
*********************************************************************/
#define ulong unsigned long
#define PIN_ANEMOMETER 2 // Digital 2 風速
#define PIN_VANE 5 // Analog 5 風向
// 5秒置きに出力
#define MSECS_CALC_WIND_SPEED 5000
#define MSECS_CALC_WIND_DIR 5000
volatile int numRevsAnemometer = 0; // 回転数
ulong nextCalcSpeed; // 風速を次に出力する時間(この秒になったら出力)
ulong nextCalcDir; // 風向きを次に出力する時間(この秒になったら出力)
ulong time; // 時間の流れ
//=======================================================
// 初期化
//=======================================================
void setup() {
Serial.begin(9600);
pinMode(PIN_ANEMOMETER, INPUT);
digitalWrite(PIN_ANEMOMETER, HIGH);
attachInterrupt(0, countAnemometer, FALLING); //割り込み0=ピン2 の割り込み設定
nextCalcSpeed = millis() + MSECS_CALC_WIND_SPEED; //次の計測は現在の+5000ミリ秒
nextCalcDir = millis() + MSECS_CALC_WIND_DIR;
}
//=======================================================
// メインループ
//=======================================================
void loop() {
time = millis();//現在時刻を取得
if (time >= nextCalcSpeed) { //計測時間になったら
calcWindSpeed();
nextCalcSpeed = time + MSECS_CALC_WIND_SPEED; //次の計測時間を設定
}
if (time >= nextCalcDir) {
calcWindDir();
nextCalcDir = time + MSECS_CALC_WIND_DIR;
}
}
//=======================================================
//風速の割り込み。回転数を+1
//=======================================================
void countAnemometer() {
numRevsAnemometer++;
}
//=======================================================
// 風向を出力
//=======================================================
void calcWindDir() {
int val;
val = analogRead(PIN_VANE);
val >>=2; // Shift to 255 range(0~255の値にする?)
Serial.print("Dir:");
Serial.println(val);
}
//=======================================================
// 風速を出力 (初期値では5秒あたりの回転数となる)
//=======================================================
void calcWindSpeed() {
Serial.print("speed:");
Serial.println(numRevsAnemometer);
numRevsAnemometer = 0; // 回転数をリセット
}