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:記事は完全にリダーマンに属します-彼へのすべての質問

Source: https://habr.com/ru/post/J110610/


All Articles