Arduinoベースのデジタル温度計について多くのことが言われています。 それらはすべてコンピューターに接続されているか、ディスプレイにすぐに温度を表示します。
しかし、データをサイトに自律的に送信する街路温度計が必要でした。 それでは始めましょう。
必要なもの:
- Arduino Duemilanove(Freeduino 2009)
- イーサネットシールドv2
- デジタル温度センサー-DS18B20
- ケースファン(120 mm)
- 水エマルジョンまたはPVA接着剤の缶(2リットル)
- LED
- ツイストペア
タスク
1-Wireバスを介して温度センサーに問い合わせ、結果を3秒ごとに保存するWebサーバーに送信します。
デバイスのアルゴリズム:
- イーサネットシールドにMACアドレスとIPアドレスを割り当てます
- ポート80でサーバーへの接続を初期化する
- 1-Wireバス上のデジタル温度センサーからデータを受信します
- GETリクエストを生成する
- 取得リクエストを送信する
- 接続を切断する
スケッチのソースコード:
途中のコメントは明確にする必要があります。
include <Ethernet.h>
// Arduino.
// .
include <DallasTemperature.h>
// MAC-
byte mac[] = { 0x00, 0x3A, 0xF1, 0x19, 0x69, 0xFC };
// ip-
byte ip[] = { 192, 168, 1, 156 };
// ip-
byte server[] = { 79, 140, 28, 20 }; //
char temp[6];
byte isdata=0;
Client client(server, 80); // 80-.
DallasTemperature tempSensor;
void setup()
{
Ethernet.begin(mac, ip); // Ethernet Shield
tempSensor.begin(7); // 7-
Serial.begin(9600); // 9600 ( )
}
void loop()
{
delay(3000); // 3 .
//
if (client.connect()) {
Serial.println( "connecting..." ); // Serial.println . , , , .
//
switch (tempSensor.isValid())
{
case 1:
Serial.println( "Invalid CRC" ); //
tempSensor.reset(); //
return ;
case 2:
Serial.println( "Invalid device" ); // - "" :)
tempSensor.reset(); //
return ;
}
Serial.println( "connected" );
char buf[80];
float f=tempSensor.getTemperature(); //
Serial.println(tempSensor.getTemperature());
// . - Arduino float.
// . ,
// Arduino. .
int temp1 = (f - ( int )f) * 100; //
// GET . code , .
// Web-.
sprintf(buf, "GET /class/backend/meteo.php?temp=%0d.%d&code=123456 HTTP/1.0" , ( int )f, abs(temp1));
Serial.println(buf);
client.println(buf); // GET
client.println( "Host: opck.info" ); // , host ip .
client.println();
} else {
Serial.println( "connection failed" );
}
while (client.available()) {
isdata=1;
char c = client.read(); // , Web-
Serial.print(c);
}
if (!client.connected()) {
isdata=0;
Serial.println();
Serial.println( "disconnecting." );
client.stop(); //
}
}
デバイスアセンブリ:
- センサーの最初の「足」は「マイナス」GNDにフックされます
- 7番目のピンの2番目の「足」(DQ)
- プラスバイサード
- 2番目と3番目は〜4.7 Kの抵抗で接続する必要があります。 しかし、抵抗をLEDに交換し、センサーバスにアクセスするインジケータを受け取りました(注意!抵抗またはLEDなしでは何も動作しません。忘れないでください!)
理論的には、それだけです。 動作するはずです。
それは機能しますが、戦闘条件は、太陽光がセンサーに降りかかると、熱くなり、実際よりもはるかに高い温度を示すことを示しました。 そうです-彼は太陽の温度を表示します。 そして、気温が必要です。
初めて、このためにホイルで包まれたコーヒー缶ケースが組み立てられました。 しかし、助けにはなりませんでした。
実際の気象観測所の写真を研究することは、解決策を見つけるのに役立ちました。 センサーのハウジングは大きくする必要があり、そのような場合にはアクティブな換気も必要です。
センサーのハウジングを作る
水性塗料の缶は、サイズが適切であることが判明しました(2〜3リットルのPVA接着剤の下にあります)。 缶の底に、ファン用の穴を開けます。 そして、それを銀行に取り付けます。 缶の中央に、空気が循環できるように、缶自体よりもわずかに小さい直径のプラットフォームをセンサーの下に配置します。
いくつかの写真:
水エマルジョンからの銀行
詳細と割り当て済みの缶
ハウジングへのセンサーの取り付け
ハウジング内のセンサー、上面図
覚えているように、抵抗器をLEDに置き換えたので、そこに穴を開けて、デバイスの動作が常に見えるようにしました。
ハウジング、側面図
缶の蓋は必要ありませんが、代わりにキャノピーが必要です。これにより、空気が通過でき、降水が内部に入らないようになります(センサーは通りに配置されます)。
Arduinoのケースは、Explay C360 mp3プレーヤーのプラスチックボックスから作成しました。
Arduino
データを受信するバックエンド:
サーバー側では、温度計がアクセスしているスクリプトが実行されています。 スクリプトは、読み取り値を置き換えられないように、シークレットコードの正確性をチェックします。
そして、新しいレコードをMySqlテーブルに追加します。 その後、このデータを好きなように表示できます。 さらに、1分ごとに過去1分間のデータが平均化され、別のテーブルに追加されます。
これは次の目的で必要です。
1.データベースでサンプルを作成する方が簡単でした(そうではなく、特定の分を指定して結果を取得する方が便利です)
2.サンプルはより高速でした(10,000,000の代わりに年間500,000レコードまで)
センサーの長期動作中に問題が発見されました。時々自然に(3〜4時間ごとに)ランダムな値が得られます。 そのため、15秒で1度以上の温度変化のチェックを追加しました。 そのような値は無視されます。
何がすべての原因:
私のサイトでは、温度計のあるページを投稿し、最終日の温度グラフを追加しました。
ここで確認できます: イーサネット温度計 。
短所:
センサーの精度は0.5 * Cで、私には十分ではありません。 しかし、パフォーマンスを改善する方法があります。 1つ以上のセンサーが必要になります(異なるロットのものが望ましい)。 すべてのセンサーからデータを受け取り、算術平均を考慮します。 そのため、100分の1度の精度を達成できます。
今後の計画:
- 湿度センサー
- 圧力センサー
- 風速センサー
- 光センサー
- これらのいくつかを街に置き、天気予報をします
- Power over EthernetでArduinoをパワーアップ
- 照明に応じてファンをオンにして速度を自動化する
- リモコン
- 通信不足の場合のデータのリセット(私にとってこれは重要です)
私にとっての既知の欠点:
-高価格-2180ルーブル。 (Freeduino 2009(800 p。)+ Ethernet Shield v2(1300 p。)+ 1センサー(80 p。))
-ファンの起動が速すぎると、彼自身がセンサーを吹き飛ばして温度に誤差を生じます。 彼は吹いてはいけませんが、空気を押すだけです。
関連リンク:
HabréのArduinoブログ
オンライン温度計
DS18B20データシート
PS:記事は完全にリダーマンに属します-彼へのすべての質問