概要
マイコンでフレーム内の温度・湿度・照度をマイコンを用いてリアルタイムでロギングし、WEB上に表示させます。ちなみに、各日でプログラムを変えたり、センサの位置を移動したりしている関係で、それぞれの日、時間のデータを単純に比べることはできません。
仕様とか
- 構成は、Arduino uno、Arduino Ethanet Shield、照度センサ、温度・湿度センサ
- 照度についてはフォトダイオードBS520を使用。200Ωの抵抗で電圧変換した結果、仕様的には、50mVで50000lux。レールツーレールオペアンプ(LMC6484AIN[4回路入りを贅沢に1つだけ利用])で100倍して5Vで50000lux(真夏の直射日光が100000lux、恐らく遮光するので最大50000luxぐらいでよいとおもう)。arduinoのアナログインプットで検出。校正はかなり適当で、信頼性はないが、桁ぐらいは合っていると思う。
- 温度、湿度については、RHT03を使用。参考文献通りのプログラムでArduino unoで検出。
- データの保存については、WEBサーバーにGETメソッドでデータ保存用PHPプログラムに送る。
- データの表示については、jqueryのhighcharts.jsを使用。
- 各日のデータの最大値、最小値および平均値をPHPで計算(2個目のグラフ)。
回路図
センサ部
Arduino部
Arduinoプログラム
#include <SPI.h> #include <Ethernet.h> #include <dht.h> dht DHT; #define DHT22_PIN 5 // ***は適宜変更 byte mac[] = { 0x**, 0x**, 0x**, 0x**, 0x**, 0x** }; EthernetClient client; void setup() { Serial.begin(9600); if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); } delay(1000); Serial.println("connecting..."); } void loop() { int chk = DHT.read22(DHT22_PIN); double temperature = DHT.temperature; double humidity = DHT.humidity; int lux = analogRead(0); // ***は適宜変更 if (client.connect("***.***.***", 80)) { Serial.println("connected"); client.print("GET /*********.php?temperature="); client.print(temperature,DEC); client.print("&humidity="); client.print(humidity,DEC); client.print("&lux="); client.print(lux,DEC); client.println(" HTTP/1.1"); client.println("Host: ***.***.***"); client.println("Connection: close"); client.println(); client.stop(); } else { Serial.println("connection failed"); client.stop(); } if (client.available()) { char c = client.read(); Serial.print(c); } if (!client.connected()) { Serial.println(); Serial.println("disconnecting."); } delay(300000); }
サーバサイドデータ取得プログラム(PHP)
<?php echo "1. Arduino get program start<br>"; //日付を取得(ファイル用) $today = date("Ymd"); echo "2. Today is $today<br>"; // 'temperature' という名前で Arduino からGET送信された温度の値を受け取る $strTempVal = $_GET['temperature']; echo "3. Temperature is $strTempVal<br>"; // 'humidity' という名前で Arduino からGET送信された温度の値を受け取る $strHumiVal = $_GET['humidity']; echo "4. Humidity is $strHumiVal<br>"; // 'lux' という名前で Arduino からGET送信された照度の値を受け取る $strLuxVal = $_GET['lux']; echo "5. Lux is $strLuxVal<br>"; $strLuxVal = $strLuxVal . "n"; // 時刻 $time = date("Y/m/d H:i:s"); echo "6. Time is $time<br>"; // データを保存するテキストファイルの相対パス $strDataFilePath = 'data/' . $today . '.txt'; echo "7. File path is $strDataFilePath<br>"; // データを保存するテキストファイルを追記モードでオープン $fp = fopen($strDataFilePath, "a"); // 送信された値をテキストファイルに書き込み fwrite($fp, $time . "," .$strTempVal . "," . $strHumiVal . "," . $strLuxVal); // ファイルポインタをクローズ fclose($fp); echo "8. Arduino get program end<br>"; ?>
感想と今後
湿度と温度が、一定の値を境に反転しているだけのようなグラフ結果なんですが(温度が上がると、湿度が下がる。温度=f(湿度) ?)、そういうもんなんでしょうかね。あと冬に向けて30℃を超えたらファンが回るようにする予定。
参考文献
- オペアンプ非反転増幅
http://www.cqpub.co.jp/hanbai/books/13/13501/13501_step25.pdf - フォトダイオードBS520
照度計(照度測定キット)|Reef工房室|1.023worldメタハラの照度はどのくらいの強さなんだろう・・・?と言う訳で照度計が欲しくなった訳ですが、そんなホイホイと買える値段ではありません(^^; - RHT03とArduino
http://garagelab.com/profiles/blogs/tutorial-humidity-and-temperature-sensor-with-arduino - arduino イーサネットシールドが熱暴走する問題について
Arduinoイーサーネットシールドの発熱量 - Todotaniのはやり物Logイーサーネットシールド(Ethernet shield)を購入しました。目的は、...
コメント
はじめまして こんにちは! いつも楽しく拝見させていただいております。
>湿度と温度が、一定の値を境に反転しているだけのようなグラフ結果なんですが(温度が上がると、湿度が下がる。温度=f(湿度) ?)、そういうもんなんでしょうかね。
という下りを読みましてちょっと気になったので計算してグラフを描いてみました。
http://twitter.com/niladmirari2010/status/525114042675765248/photo/1
大変見え辛いんですが 2014/10/21のグラフをちょこっと数字をいじって遊んで見ました。
青色 T温度
ピンク Rh(%) 湿度
黄色 a(g/m^3) dT その時刻の温度での最大温室内存在可能水量
水色 Rh x a (g/m^3) 実際に温室空気に存在した水の量
ほぼご想像の通り 水色のライン(実際に温室空気に存在した水の量)が 20g / m^3 ~ 30g /m^3 をさまよっていますので
換気をされていないのでしたら おおよそあっていると思います。
ただ、もし換気をされていないのでしたら・・・ 黄色と水色のaピークとbピークには大きな乖離が存在しており
何かが起こっている可能性がありそうです (ただ扉が開いただけかもしれない)
グラフは1m^3あたりの数値を計算しており温室内部の空間容量自体がちょっと分からないので
実はそんなに差が無い、
あるいは猛烈な結露を引き起こすほどの外部温度の変動が発生しただけ、
なのかもしれませんが
密閉度と温室の容量が分かればサボテンさんたちの”何か”を観測している可能性があり
同じ装置を作ろうとしている私はとても興味をひかれました。
乱雑ですがご一報までに。
用いた飽和水蒸気量計算式
http://ja.wikipedia.org/wiki/%E9%A3%BD%E5%92%8C%E6%B0%B4%E8%92%B8%E6%B0%97%E9%87%8F
田中様
はじめまして!書き込みありがとうございます!
私の稚拙な装置について、計算していただき感激です!
内容が複雑ですので、少し頭を整理し、考察してから改めてご返信させていただきたいと思っております。
1,2日中にはここにてご返信できるかと存じます。申し訳ありませんがしばしお待ちくださいませ!
取り急ぎ、書き込みの御礼申し上げます。
田中様
自分でもグラフを書いてみたのですが、少々違った結果になりました。ご紹介いただきましたWikipediaを参考に書いてみたのですが、どこが違いますでしょうか。グラフ自体は、温度から飽和水蒸気量を出して、その後、湿度を掛けた形になります(そもそもやっていることが違うのでしょうか。。。)。
グラフはこちらです。googleスプレッドシートです。
https://docs.google.com/spreadsheets/d/1CBQs_Qy3EdGrcVzaq1Eu4PzZJP4exdiiZ9NEGGG-OVc/edit?usp=sharing
※データには10月21日のほか、晴れの日だった10月18日のデータも入っています。
なお、私の温室に関するポイントは以下のとおりです。
・25℃になると排熱のため、サーモスタット付きの排気用FANが回転する(湿度を考察するのに重要)
・湿度温度センサーが温室内の日当たりに設置(重要。日向のせいで急激に温度が急上昇し、急下降する。本来ならば温室内の風当たり良い日陰に置く必要がある?)
・密閉度は低い(パイプとアクリル面の接合部はスカスカ。冬までには何とかする予定)。
・温室の容積はおおよそ1.08m^3です。
取り急ぎではございますが、もしご意見等ございましたらご連絡頂けますと幸いです。