ESP8266と気象センサを使って,なんちゃって百葉箱を作ってみる
なんちゃってといっても実用レベルを目指すつもり
いろんな試行実験が必要なので完成までは時間が掛かる予定
はじめに
実のところデジタルセンサで百葉箱を作ろう計画はかなり前からあり研究準備していた
と,いうのも現在住んでる場所が山の側であり市街に設置されていたアメダスと気温が(-2℃位)異なるため自宅付近の気温をロギングしたかったためであった
それが2年前8月にアメダスが近く(300m位離れた場所)に引っ越してきたため作製の意欲が無くなり現在に至ることとなる
準備したパーツも勿体ないので重い腰を上げたって感じでもある
arduinoIDE
基盤はESP8266であり久々に使うことになるのだが,先ずアップデートされたarduinoIDE(ボードESP8266選択)で(かなり)嵌る
設定が増えていて「Crystal Freequency」を26MHzに設定しないと古いESP8266では問題が生じるようだ
例えばシリアル出力が指定bps通りに出力されず文字化けする
ESP8266でDHT11とLPS25Hを試す
Arduinoで試していたDHT11とLPS25HのスケッチがあるのでESP8266で動作させてみたところ,DHT11は(DHT22も)動作したがLPS25HはCPU依存コードもあってか動作不良となった
- sizeof(int)の違い
- ESP8266のバイトオーダーはLSBファースト
ほどなくスケッチの解決はしたが,LPS25HをESP8266とArduino(ATMega328P)で差し替えしながら計測値を比べていたところ情けない事に逆差しして破壊してしまう
大気圧センサとしてLPS25H,気温・湿度センサとしてSHT31を高精度なので利用しようと考えていたため残念なことに・・・既にLPS25Hは販売していないのでBME280に変更を余儀なくされた
BME280を使う
BME280からのデータ取得はややこしかったのでライブラリをこちらからいただくことにして入出力部をSPIからI2Cへとコンストラクタを修正
ESP8266のデフォルトのI2Cピンアサインは、SDA: IO04, SCL: IO05だが Wire.begin(SDA, SCL); で指定可能
BME280は省電力モードで使用
サーバ
データは自前のWebサーバで受けMySQLでDB化,閲覧には見栄えするグラフ化を予定
DBは以下のとおりテーブルを3個
CREATE TABLE IF NOT EXISTS `LOG` (
`LOCATION` char(2) DEFAULT NULL COMMENT '計測場所(ID)'
, `DATETIME` datetime DEFAULT NULL COMMENT '適用日'
, `PRESSURE` decimal(6,2) DEFAULT NULL COMMENT '気圧'
, `TEMPERATURE` decimal(4,2) DEFAULT NULL COMMENT '気温'
, `HUMIDITY` decimal(4,2) DEFAULT NULL COMMENT '湿度'
, `BATTERY_VOLT` decimal(4,2) DEFAULT NULL COMMENT 'バッテリー電圧'
, `BATTERY_TEMP` decimal(4,2) DEFAULT NULL COMMENT 'バッテリー温度'
, PRIMARY KEY (`LOCATION`, `DATETIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='気象データログ'
CREATE TABLE IF NOT EXISTS `LOCATION` (
`ID` char(2) DEFAULT NULL COMMENT '計測場所ID'
, `NAME` varchar(32) DEFAULT NULL COMMENT '計測場所名'
, `STATUS` boolean DEFAULT NULL COMMENT '計測有効'
, `PRES_ID` char(2) DEFAULT NULL COMMENT '気圧センサID'
, `TEMP_ID` char(2) DEFAULT NULL COMMENT '気温センサID'
, `HUMI_ID` char(2) DEFAULT NULL COMMENT '湿度センサID'
, PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='計測場所'
CREATE TABLE IF NOT EXISTS `SENSOR` (
`ID` char(2) DEFAULT NULL COMMENT 'センサID'
, `NAME` varchar(32) DEFAULT NULL COMMENT '名称'
, `VENDOR` varchar(32) DEFAULT NULL COMMENT '売り手'
, PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='センサ'
受けはPHPでプログラミングして今回はPOSTを使用(GETは手動確認用で使う)
<?php
//自宅アメダス : 気象データ(気圧,気温,湿度)を登録
//
//コード:UTF-8N
// 行末:LF
//TAB:4
//インターフェイスチェック
if(php_sapi_name() == "cli") {
//コマンドラインで実行
exit(0);
}
//Web経由で実行
//登録データ取得
$inLoc = empty($_POST['LOC'])? empty($_GET['LOC'])? "0":$_GET['LOC']: $_POST['LOC']; //計測場所
$inPres = empty($_POST['PRES'])?empty($_GET['PRES'])? "":$_GET['PRES']:$_POST['PRES']; //気圧
$inTemp = empty($_POST['TEMP'])?empty($_GET['TEMP'])? "":$_GET['TEMP']:$_POST['TEMP']; //気温
$inHumi = empty($_POST['HUMI'])?empty($_GET['HUMI'])? "":$_GET['HUMI']:$_POST['HUMI']; //湿度
$inBVolt = empty($_POST['BVOLT'])?empty($_GET['BVOLT'])? "":$_GET['BVOLT']:$_POST['BVOLT']; //バッテリー電圧
$inBTemp = empty($_POST['BTEMP'])?empty($_GET['BTEMP'])? "":$_GET['BTEMP']:$_POST['BTEMP']; //バッテリー温度
if(empty($inLoc) || empty($inPres) && empty($inTemp) && empty($inHumi)) {
//パラメタエラー
$content .= "Error.\n";
} else {
//DB接続
$db = new mysqli("localhost", "tenki", "tenki", "tenki");
$db->query("set names utf8");
//登録
$sql = "insert into LOG (LOCATION, DATETIME, PRESSURE, TEMPERATURE, HUMIDITY, BATTERY_VOLT, BATTERY_TEMP)";
$sql .= " values (${inLoc}, now(), '${inPres}', '${inTemp}', '${inHumi}', '${inBVolt}', '${inBTemp}')";
$db->query($sql);
$db->close();
$content .= "Ok.\n";
}
//コンテンツ出力
echo $content;
?>
消費電力
ESP8266とサーバ側のDB登録が出来ているので消費電力の確認を行った
(Waitで1分毎にデータをDB登録)
1時間で累積42mAhとなる
(ディープスリープ使用で10分毎にデータをDB登録)
12時間で8mAhとなった
これは先人様が計測されているのと変わりないようである
また(WiFi有効の)起動時には300mA,通信時には約70mA程流れるらしい