ESP8266で電圧ロガーを作製
計測した電圧をWEBから確認するESP8266を使用したプロトタイプを作っておこうと先ずはESP8266を使用した電圧ロガーを作製
これが簡単にできると思っていたが使い物になるまで日数が掛かってしまった
仕様
- 定間隔で電圧を計測してDBに登録
- 計測電圧は0~15V
- 高低電圧を設定でき範囲外となった場合計測を終了(同時にリレーをON/OFF)
- DBの登録データはブラウザでグラフ表示
- LOG ON/OFF,UP,DOWNの3ボタン
操作(UI)
- LOGボタンでログのON/OFF
- LOGボタンの長押しで最大/最小電圧の選択切替
- UP,DOWNボタンで選択電圧の変更
- LOGボタンでを押しながらUP/DOWNボタンでログ間隔を変更
回路図
- 2つのボタンはBOOT時HIGHで使用するIO0とIO2を利用
- ADCの分圧は多回転半固定で調整できるようにした
- 現在リレーは未実装
作製
いつものとおりブレッドボードで試作
ADCの精度
ESP8266にはアナログ入力が1PinあるがADCの精度があまり良くないという情報を得ていたので外部ADCも検討したが手持ちのADC(MCP3002)がSPI接続だったためとりあえずは内部ADCで作製することにした
0~15Vでの測定なので分圧し,いつものように割合をソフトで調整しようとしたのだが,測定電圧がブレてしまい電圧が定まらない
ブレッドボード上のせいか?と思われたので基板に載せて調整しようとしたが同じ結果だったためソフトでの調整を諦め多回転半固定でハード的に調整することにした
結果,そこそこマシにはなったが精度が悪くロガーとしては問題がある
不明のスタックエラー
プログラム開発の途中で原因不明のExceptionによる異常終了に陥った
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
Exception (0):
epc1=0x402030dc epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000
>>>stack>>>
ctx: cont
sp: 3ffffab0 end: 3fffffc0 offset: 0190
3ffffc40: 3ffe8c85 40104dc3 3ffec6c0 feefeffe
3ffffc50: 401026af 3ffec6c0 3fffc248 4000050c
3ffffc60: 400043e6 00000030 00000017 ffffffff
3ffffc70: 400044ab 3fffc718 3ffffd60 08000000
3ffffc80: 60000200 08000000 08000000 00000000
・
・
・
3fffff90: feefeffe feefeffe feefeffe feefeffe
3fffffa0: 3fffdad0 00000000 3ffeeae4 40206c80
3fffffb0: feefeffe feefeffe 3ffe8510 401012c9
<<<stack<<<
--------------- CUT HERE FOR EXCEPTION DECODER ---------------
WiFi接続時に発生していることが判明したが原因は判らなかった
最終的にI2Cの初期化と順番を変えることで解決
×
//I2C初期化
Wire.begin();
u8g2.begin();
u8g2.clear();
//WiFi接続
WiFi.begin(ssid, password);
unsigned long timeout = millis();
while(WiFi.status() != WL_CONNECTED) {
if(millis() - timeout > 30000) halt();
delay(100);
}
-------------------
〇
//WiFi接続
WiFi.begin(ssid, password);
unsigned long timeout = millis();
while(WiFi.status() != WL_CONNECTED) {
if(millis() - timeout > 30000) halt();
delay(100);
}
//I2C初期化
Wire.begin();
u8g2.begin();
u8g2.clear();
チャタリング
ボタンを3個にしたため,電圧を上下させる際の最大/最小切り替えるボタンをLOGボタンの3秒長押しにしたのだが,LOGボタンを長押しした後ボタンを離すとチャタリングが発生しているようでソフトで対策したが完全に解決しない
static volatile unsigned long btnintrtm;
void ICACHE_RAM_ATTR logsw_intr() {
if(millis() - btnintrtm <= 50) {
//チャタリング防止
return;
}
btnintrtm = millis();
noInterrupts();
・
・
・
interrupts();
}
LOGボタンの不良または内部プルアップであることが原因かもしれない(未確認)
懸案事項
- 現行では3分記録ログで約200mAhの消費電力なので100mAh以下を目指す
- 測定電圧の精度が良くないので外部ADC化
- チャタリングのハード的な原因調査
- リレーの実装
参考までに
DBテーブル(FUNCIDは現在未使用)
CREATE TABLE IF NOT EXISTS `FUNCID` (
`ID` char(2) NOT NULL DEFAULT '0' COMMENT 'ID',
`NAME` char(32) NOT NULL COMMENT '名称',
`SUMMARY` text NOT NULL COMMENT '概要',
PRIMARY KEY (`ID`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='装置機能別名称';
CREATE TABLE IF NOT EXISTS `HISTORY` (
`ID` char(2) CHARACTER SET utf8 NOT NULL DEFAULT '0' COMMENT 'ID',
`CTIME` datetime NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '初期日',
`INTERVAL` decimal(2,0) NOT NULL COMMENT 'ログ間隔(分)',
`MINVOLT` decimal(4,2) NOT NULL COMMENT '最小終止電圧',
`MAXVOLT` decimal(4,2) NOT NULL COMMENT '最大終止電圧',
PRIMARY KEY (`ID`,`CTIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='履歴';
CREATE TABLE IF NOT EXISTS `LOG` (
`ID` char(2) NOT NULL DEFAULT '0' COMMENT 'ID',
`CTIME` datetime NOT NULL COMMENT '初期日',
`MTIME` datetime NOT NULL COMMENT '適用日',
`VOLTAGE` decimal(4,2) NOT NULL COMMENT '測定電圧',
`VALIDITY` char(1) NOT NULL DEFAULT '0' COMMENT 'データ有効性',
UNIQUE KEY `ID` (`ID`,`CTIME`,`MTIME`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='電圧監視ログ';
以下は現在版で将来的には十分に改版あり(現在のブラウザのデフォルトがSJISのようなのでUTF8からSJISに変換している)
DB登録(regVolt.php)
ログ表示(gLogVolt.php)
ESP8266ロガープログラム(voltMonitor.ino)