Arduinoイーサネット温度計

Arduino



Arduinoベースのデジタル温度計について多くのことが言われています。 それらはすべてコンピューターに接続されているか、ディスプレイにすぐに温度を表示します。

しかし、データをサイトに自律的に送信する街路温度計が必要でした。 それでは始めましょう。



必要なもの:






タスク


1-Wireバスを介して温度センサーに問い合わせ、結果を3秒ごとに保存するWebサーバーに送信します。



デバイスのアルゴリズム:


  1. イーサネットシールドにMACアドレスとIPアドレスを割り当てます
  2. ポート80でサーバーへの接続を初期化する
  3. 1-Wireバス上のデジタル温度センサーからデータを受信します
  4. GETリクエストを生成する
  5. 取得リクエストを送信する
  6. 接続を切断する




スケッチのソースコード:


途中のコメントは明確にする必要があります。



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(); //

}

}










デバイスアセンブリ:


  1. センサーの最初の「足」は「マイナス」GNDにフックされます
  2. 7番目のピンの2番目の「足」(DQ)
  3. プラスバイサード
  4. 2番目と3番目は〜4.7 Kの抵抗で接続する必要があります。 しかし、抵抗をLEDに交換し、センサーバスにアクセスするインジケータを受け取りました(注意!抵抗またはLEDなしでは何も動作しません。忘れないでください!)




理論的には、それだけです。 動作するはずです。

それは機能しますが、戦闘条件は、太陽光がセンサーに降りかかると、熱くなり、実際よりもはるかに高い温度を示すことを示しました。 そうです-彼は太陽の温度を表示します。 そして、気温が必要です。



初めて、このためにホイルで包まれたコーヒー缶ケースが組み立てられました。 しかし、助けにはなりませんでした。



実際の気象観測所の写真を研究することは、解決策を見つけるのに役立ちました。 センサーのハウジングは大きくする必要があり、そのような場合にはアクティブな換気も必要です。



センサーのハウジングを作る


水性塗料の缶は、サイズが適切であることが判明しました(2〜3リットルのPVA接着剤の下にあります)。 缶の底に、ファン用の穴を開けます。 そして、それを銀行に取り付けます。 缶の中央に、空気が循環できるように、缶自体よりもわずかに小さい直径のプラットフォームをセンサーの下に配置します。

いくつかの写真:



水エマルジオンカランの銀行



水エマルジョンからの銀行

詳細と割り当て終了みの缶

詳細と割り当て済みの缶



センサーの設置

ハウジングへのセンサーの取り付け



ハウジング内のセンサー、上図

ハウジング内のセンサー、上面図



覚えているように、抵抗器をLEDに置き換えたので、そこに穴を開けて、デバイスの動作が常に見えるようにしました。



ハウジング、側面図

ハウジング、側面図



缶の蓋は必要ありませんが、代わりにキャノピーが必要です。これにより、空気が通過でき、降水が内部に入らないようになります(センサーは通りに配置されます)。



Arduinoのケースは、Explay C360 mp3プレーヤーのプラスチックボックスから作成しました。



Arduino

Arduino



データを受信するバックエンド:


サーバー側では、温度計がアクセスしているスクリプトが実行されています。 スクリプトは、読み取り値を置き換えられないように、シークレットコードの正確性をチェックします。

そして、新しいレコードをMySqlテーブルに追加します。 その後、このデータを好きなように表示できます。 さらに、1分ごとに過去1分間のデータが平均化され、別のテーブルに追加されます。

これは次の目的で必要です。

1.データベースでサンプルを作成する方が簡単でした(そうではなく、特定の分を指定して結果を取得する方が便利です)

2.サンプルはより高速でした(10,000,000の代わりに年間500,000レコードまで)



センサーの長期動作中に問題が発見されました。時々自然に(3〜4時間ごとに)ランダムな値が得られます。 そのため、15秒で1度以上の温度変化のチェックを追加しました。 そのような値は無視されます。



何がすべての原因:


私のサイトでは、温度計のあるページを投稿し、最終日の温度グラフを追加しました。

ここで確認できます: イーサネット温度計



短所:


センサーの精度は0.5 * Cで、私には十分ではありません。 しかし、パフォーマンスを改善する方法があります。 1つ以上のセンサーが必要になります(異なるロットのものが望ましい)。 すべてのセンサーからデータを受け取り、算術平均を考慮します。 そのため、100分の1度の精度を達成できます。



今後の計画:






私にとっての既知の欠点:


-高価格-2180ルーブル。 (Freeduino 2009(800 p。)+ Ethernet Shield v2(1300 p。)+ 1センサー(80 p。))

-ファンの起動が速すぎると、彼自身がセンサーを吹き飛ばして温度に誤差を生じます。 彼は吹いてはいけませんが、空気を押すだけです。



関連リンク:


HabréのArduinoブログ

オンライン温度計

DS18B20データシート



PS:記事は完全にリダーマンに属します-彼へのすべての質問



All Articles