Arduino +ESP-WROOM-02 気温の測定とネットへの送信


Arduino UNO + ESP-WROOM-02(ESP8266)で気温を測定してweb上に記録していくシステムを作りました。
Arduino UNO + ESP-WROOM-02 shield

温度センサは秋月電子で買った「高精度IC温度センサー LM60(TO-92)」を使います。+VとGNDを接続してあとはアナログ値で測定できる簡単センサーです。

Arduino UNO + ESP-WROOM-02 shield LM60LM60は+424mVのオフセット、6.25mV/°Cの出力があります。測定した電圧[V]から424mVを引いて6.25mVで割ってあげると気温[°C]が求まります。

Arduinoのアナログ入力は5Vを1024段階で読み取ります。分解能は5V/1024 = 0.004V = 4mV。測定した気温の小数点以下は当てになりませんが、整数部分はまあ良いでしょう。できれば出力をオペアンプで増幅してから測定することで精度を上げる事ができます。今回は面倒なのでやりません。

サーバ側のPHPは次の通りです。Arduinoから受け取ったデータに日付を追加してカンマで区切って保存しているだけです。

<?php
date_default_timezone_set('Asia/Tokyo');//タイムゾーンの設定

//文字コードの設定
mb_language("Japanese");
mb_internal_encoding("UTF-8");
$temperature = $_GET["t"];

$fhandle = fopen("./temperature.txt", "a+");//読み込み/書き出し用でオープンします。 ファイルポインタはファイルの終端

//現在時刻の書き込み
fwrite($fhandle,date("Y/m/d g:i"));
//カンマで区切って
fwrite($fhandle,",");
//温度を書き込み
fwrite($fhandle,$temperature);
//改行
fwrite($fhandle, "\n");

fclose($fhandle );

Arduinoのスケッチは次の通りです。温度の計算、温度を文字列に変換する所にちょっと工夫があります。


#include "ESP8266.h"
#include <SoftwareSerial.h>

//Arduino UNOとESP8266をシリアルで繋いで通信。
//UNOとESP8266はSoftware Serialで通信。

#define SSID "ssid"
#define PASSWORD "password"
#define HOST_NAME "mkbtm.sakura.ne.jp"
#define HOST_PORT 80

//
int analogPin = 3; // ポテンショメータのワイプ(中央の端子)に
SoftwareSerial mySerial(12, 11); /* RX:12, TX:11 */
ESP8266 wifi(mySerial);
//software serialの速度はESP8266.hで設定

void setup(void)
{
//Serial.begin(9600);
Serial.begin(57600);
Serial.print("setup begin\r\n");

Serial.print("FW Version:");
Serial.println(wifi.getVersion().c_str());

if (wifi.setOprToStationSoftAP()) {
Serial.print("to station + softap ok\r\n");
} else {
Serial.print("to station + softap err\r\n");
}

if (wifi.joinAP(SSID, PASSWORD)) {
Serial.print("Join AP success\r\n");
Serial.print("IP:");
Serial.println( wifi.getLocalIP().c_str());
} else {
Serial.print("Join AP failure\r\n");
}

if (wifi.disableMUX()) {
Serial.print("single ok\r\n");
} else {
Serial.print("single err\r\n");
}

Serial.print("setup end\r\n");
}

void loop(void)
{
//uint8_t buffer[512] = {0};

//アナログ入力
//アナログ入力
int val = analogRead(analogPin); // アナログピンを読み取る
//valは0〜1023の値 これを電圧に変換
float v = val * 5.0/1024;
// Serial.println(v);
float offsetV = 0.424;
float v1 = v - offsetV;
float temp = v1 / 0.00625;
//LM60CIM offset +424mV 6.25mV/度C
Serial.println(temp);
//Arduinoはsprintfでfloat型が扱えない
//10倍して整数にする。
int i_temp = int(temp);//整数部分
int f_temp = round((temp - float(i_temp))*10);//小数点以下

if (wifi.createTCP(HOST_NAME, HOST_PORT)) {
Serial.print("create tcp ok\r\n");
} else {
Serial.print("create tcp err\r\n");
}

char req1[] = "GET /PHP/esp8266/temperature/temperature.php?t=";

String i_tempString = String(i_temp);
String f_tempString = String(f_temp);
String tempString = i_tempString + "." + f_tempString;
Serial.println(tempString);

char req2[20];
tempString.toCharArray(req2, tempString.length()+1);

char req3[] = " \rHTTP/1.0\r\nHost: mkbtm.jp\r\nUser-Agent: arduino\r\n\r\n";

strcat(req1,req2);
strcat(req1,req3);

Serial.print(req1);
wifi.send((const uint8_t*)req1, strlen(req1));



for (int i=0 ; i<5 ; i++){
delay(60000);
}
}

温度の計算は浮動小数点を使っています。浮動小数点を文字列にする時にsprintfを使えれば簡単だったのですが、Arduinoでは何故か浮動小数点ではsprintfが使えません。そこで整数部と小数点以下をわけてそれぞれ文字列にして処理をしています。
PHPに送るリクエストの文字列処理がちょっと複雑ですが中に変数を入れているのでこうなりました。
最後のforループとdelayで測定間隔を調整しています。delay(60000)で1分間、それをforループで5回実行して5分となってます。

サーバのphpと同じフォルダにtemparature.txtというファイルを書き込み許可で作成しておきます。このファイルに次の様にデータが保存されていきます。スクリーンショット 2015-09-17 7.56.31

秋になり気温が変化しないので面白く無いデータですが、5分おきにデータを記録してくれてます。ちなみに2日前からデータ取ってますが20°C〜24°Cまでの変化しかありません。過ごしやすいですがデータ的にはつまらないですね。

外からでも自宅の部屋の気温を知れるというのは変な感じもします。ペットを室内で飼っている人が室内温度のモニタをしたり、人感センサを付けて簡易の防犯システム、お店等の入り口に付けて人の出入りをモニタしたりとか色々と応用できそうです。

過去のESP-WROOM-02関連の記事は次の通りです。