概要
マイコンでフレーム内の温度・湿度・照度をマイコンを用いてリアルタイムでロギングし、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 イーサネットシールドが熱暴走する問題について
http://todotani.cocolog-nifty.com/blog/2009/05/arduino-f889.html






