pinewell's farmer blog 農業と電子工作、ソフトウェア、バイク、車

2013年5月7日

ウェザーメーター

Filed under: 農業機械 — pinewell @ 6:49 PM

気になっていた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;        // 回転数をリセット
}

3 Comments »

  1. 春小の芽吹きは、いつになるでしょう(^_^;)
    2010年度のブログを拝見させてもらうと4/17播種で5/3には芽吹いてたとの事なので16日後…4/24播種で5/3が芽吹く頃となる様ですが当年の低温.湿潤の環境では、いつになるか…
    最悪、不発芽の懸念も(>_<)

    コメント by レイン — 2013年5月8日 @ 6:45 PM

  2. 育苗管理を終えたシステムの他用途なんですがハウスの外(圃場や自宅周辺)での使用が可能ならばカメラの向き(欲を言えば望遠機能も)を遠隔操作できる機能が有れば活用の幅も広がるように感じます。
    育苗管理システムの仕上がり期待してますよ〜(^_^)

    コメント by レイン — 2013年5月8日 @ 7:07 PM

  3. 本日も天候悪く、農作業はできませんねぇ~。
    すっきり晴れるのは一体いつになるのでしょうか・・・。

    春小も芽が出てこないし。

    さて、育苗管理システムですが、「カメラの向きを変える」というのは実は実験済みなのです。
    サーボを動かすことができたのでこれにカメラを設置してしまえば
    可能なんです。・・・が、左右の動き(パン)ができるようになると上下の動き(チルト)もさせたくなります。
    そうなると、サーボを動かすだけではダメでカメラを設置する台なりを作らねばならなくってしまい、そのからくりが非常に手間がかかるかなぁ、と。
    諦めてしまいました。3Dプリンタでもあればこの辺の工作がかなりラクにできそうなんですけどね~。
    ズームに関しては使用しているUSBカメラがズームに対応していないことで、まぁ難しいですね。所詮200万画素のカメラではデジタルズームにすると画素が荒くて。
    その他構想としては
    ・スマートフォン・PCの操作でライトをつける(実証済み)
    ・ソリッドステートリレーを使って、AC電源をとる。例えば設定温度を下回ったら電源を入れる、とか。
    ・近接センサーを使って夜間の動物侵入時にライトオン、映像記録。
    と、いうのを考えており、いずれも実験のためのパーツは揃えていたりします。

    コメント by pinewell — 2013年5月10日 @ 11:18 AM

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress