IoTには欠かせない代物のESP8266を使ってソーラーパネルの充電状態を監視する電圧ロガーを作ってみた!
以前に製作した自作ソーラーパネルは順調に稼働して、バッテリーはいつも満充電状態で保てており、しかも、中国製デサルフェーターもつけていて、サルフェーションも発生させないようにしてとりあえず安心安心です。。。
いよいよ4月となり、春がやってきて、お天道様も活発に活動されてきてるので、ますますソーラー発電は、いい感じに発電してくれるだろとは思ってはいるものの、そういえばその充電状態ってどんな感じなんだろうかとふと疑問が。。。
それならばということで、近頃のなんでもインターネットに繋いじゃうという、『IoT』のブームに乗っかって、自作ソーラーパネルで発電した電力を蓄電池に充電するときの、バッテリー端子間の電圧を一定周期で測って、それを見れるようにしちゃいましょう!!!
そんな安易な考えのもと、どんな仕様にするかを検討。。。
とりあえず、自作ソーラーパネルも充電システムもベランダにあるので、ケーブルを室内に引き込むのはイヤなので、取得した電圧は、WiFiで飛ばして、自前クラウドのIoT用ノードのWebサーバにアクセスしてデータベースに格納するっという感じにすることとしましょう!
まずは、デバイス探しということで。。。
まぁ探すも何も、こんな仕様であれば、もうこいつしかないです!!!
ESP8266!!!
これは素晴らしいデバイスです!
中国のEspressif Systemsって会社が作っているデバイスで、32ビットのRISC CPUを積んでいて、なんとWiFiモジュールも搭載されていて、完全互換ではないものの、Arduinoとの一部互換もあり、IDEもそのまま使えるというもの!
今のIoTを支える便利なデバイスですね。。。
しかも安い!
秋月電子なんかでも取り扱っていて、デバイスだけなら、¥550!( Wi-Fiモジュール ESP-WROOM-02 )
スイッチサイエンスでは、USBシリアル変換もついたブレイクアウトボードとして販売してて、¥2160!( ESPr® Developer(ESP-WROOM-02開発ボード )
でも、秋月のは安いとはいえ、USBシリアルやらロジックレベルコンバーターだの追加せにゃいかんし、はじめて使うデバイスとしてはチトメンドクサイ。。。
スイッチサイエンスのは、そのまま使えそうな感じやけど、少々高い。。。
ならばということで、いつものAliexpressで探してみると。。。。
ありました。。
USBシリアル変換は、Ch340gを搭載した、 nodemcuのESP8266
お値段は、US $2.98! だいたい日本円で350円弱ってとこですかね。。
(上記のバナーから、ESP8266 nodemcu で検索すれば出てきますよ!)
とりあえずうまくいくかいかんかもわからんので、とりあえずこれを発注!
そんで、来たのがこれ!
まぁスイッチサイエンスのヤツの仕様とほぼ同じです。。。
これを動かすために早速プログラム作成するわけやけど。。。
そもそも、このデバイスは完全にArduinoに準拠しているわけではないので、いろいろと開発するには準備が必要ですな。。
まぁ安いデバイスやのにそれなりに使えるんでガマンガマン。。。
まずは、ArduinoのIDEをダウンロードしてきます。。。
URLは、https://www.arduino.cc/en/main/software
動作環境は、Windowsだけでなく、LinuxやらMacOS Xなんかもあるんでまぁお好きなのをどうぞ。。。
とりあえずインストールしたら、ESP8266を使うためには、Boad Managerに追加せなばならないので、
[ファイル] – [環境設定]を開いて、”追加のボードマネージャのURL”に、http://arduino.esp8266.com/staging/package_esp8266com_index.json を設定しておきます。
こんな感じ。。。
次は、ボードのデータをダウンロードですわ。。。
[ツール] – [ボード] – [ボードマネージャ]を選択して、たぶんリストの一番下にある”esp8266 by ESP8266 Community”ってのを選んでインストールしちゃいます。。。
これで、とりあえずはIDEのインストール完了!
あとは、USBのデバイスドライバのインストール!
このnodemcuは、USBデバイスにCh340gが乗っかってるんで、 http://www.wch.cn/download/CH341SER_ZIP.html この辺のサイトからダウンロードしてインストールしちゃってください。。
これでとりあえずは、開発ができるお膳立てが完了!!
いよいよ、デバイスとIDEをインストールしたマシンをUSBで接続して、仮想シリアルポートとしてデバイスが参照できていれば接続完了ってことですな!
っで、いよいよプログラムを書くわけですが、、、
このESP8266には、1ポートだけアナログ入力のポートがあって、ここにバッテリーの電圧をかけて、AD変換した値を読み取って、Webサーバへ飛ばすって仕様なのでそんなに難しくはないンですけど。。。
注意せにゃいかんのが、フツーのArduinoの仕様であれば、アナログ入力は、0~5Vの10bit分解ではあるものの、このESP8266は、0~3.3Vの10bit分解ってことらしいです。。。
なので、発電して、バッテリーにかかる電圧は、最大で15Vくらいにはなると思うんで、これを分圧抵抗回路を介して、15Vを3.3Vくらいにしてから、アナログ入力ポートに突っ込まなければなりませんね。。。
こんな感じ。。。
最大で15Vを3.3VくらいにするためのR1とR2の組み合わせを考えないかんのですけど、便利なサイトがありました。。。
http://sim.okawa-denshi.jp/teikokeisan.htm
このサイトの素晴らしいところは、VINとVOUTを指定すると、各系列の市販されている抵抗種類に合わせて組み合わせを割り出してくれます!素晴らしい!!!!
ここの計算結果によると。。。R1には3.9KΩでR2には1.1KΩとなりました。。。
でもそんな抵抗は手持ちにはないので、結局のところは、合成抵抗で近似値を作って回路を作ります。。。
っで、とりあえずブレッドボードで回路を作って見たのが。。。。
こんな感じ。。。
手持ちの電源が12Vしかなかったんで、左側は3端子レギュレーターで3.3Vと5Vを作ってます。。。
とりあえず、esp8266は3.3Vで動かすようにして、手持ちの抵抗を探しまくって、結局のところ3本で合成抵抗を作って、3.9kΩと1.1kΩを作ってます。。。
LEDは、WiFiのコネクションが正常な状態の時は、点灯させるためと、電圧を測定している時からWebサーバへのデータ転送が完了するまでの間に点灯させるためのアクセスランプを付けて見ました。。。
っで、この回路で稼働させるためのプログラムはこんな感じにしてみました。。。
(数多くのネットに掲載されていらっしゃる諸先輩方のプログラムを多く流用させてもらいました。。。感謝です。。)
[html]
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
char ssid[] = “xxxxxxxxxxxxx”;
char password[] = “xxxxxxxxxxxxxx”;
int wifipin = 4;
int accpin = 5;
void setup() {
Serial.begin(115200);
Serial.println(“”);
pinMode(wifipin,OUTPUT);
pinMode(accpin,OUTPUT);
delay(1000);
digitalWrite(wifipin,LOW);
connectWifi();
digitalWrite(wifipin,HIGH);
delay(1000);
}
void loop() {
digitalWrite(accpin,HIGH);
double value = analogRead(A0);
double value_org = value;
Serial.println(value);
value *= 3.3;
value /= 1024;
value /= 1.1;
value *= 3.9;
String acc_url = “http://xxxxx.xxxxx.xxxx/xxxxx.xxxx?xxxxxx=”;
String acc_data = String(value);
String url_string = acc_url + acc_data;
url_string = url_string + “&value=” + String(value_org);
Serial.println(url_string);
char buf[128];
url_string.toCharArray(buf,128);
String result1 = getPageSource1(buf);
Serial.println(result1);
digitalWrite(accpin,LOW);
delay(60000);
}
void connectWifi() {
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
Serial.print(“.”);
delay(100);
}
Serial.println(“connected!”);
}
String getPageSource1(char host[]) {
Serial.println(host);
HTTPClient http;
http.begin(host);
int httpCode = http.GET();
String result = “”;
if (httpCode < 0) {
result = Serial.println(“Error!”);
} else if (http.getSize() < 0) {
result = “size is invalid”;
} else {
result = http.getString();
}
http.end();
return result;
}
[/html]
こっちが、ESP8266用のプログラムで。。。。
受け側のWebサーバ側のプログラムはお手軽に書けるようにPHPにしてみました。。。
[html]
<?php
if(isset($_GET[‘denatsu’])){
echo “GET denatsu —> “.$_GET[‘denatsu’].”<br>”.PHP_EOL;
echo “GET value —> “.$_GET[‘value’].”<br>”.PHP_EOL;
$db = new SQLite3(‘/tmp/denatsu.sqlite3’);
echo “SQL —> “.”insert into denatsu values(‘”.date(‘Y/m/d H:i:s’).”‘,'”.$_GET[‘denatsu’].”‘,'”.$_GET[‘value’].”‘)”.PHP_EOL;
$results = $db->query(“insert into denatsu values(‘”.date(‘Y/m/d H:i:s’).”‘,'”.$_GET[‘denatsu’].”‘,'”.$_GET[‘value’].”‘)”);
$db->close();
}
?>
[/html]
こんな感じ。。。
PHP側は、GETで受けたらsqliteにinsertしてデータをスタックするようにしてみました。。。
まぁセキュリティーは一切考慮してないんで、これで運用しちゃうと簡単にやられちゃいますね。。。。
まぁとりあえずESP8266はどんなもんなんかを知るためなんで、今回はそういったややこしいことは一切無視!ってことで。。。。(それでええんか!!!って非難が聞こえてきそう。。。)
これでとりあえず実行してみることに!!!!
んー。。。
ちゃんと、WiFiで接続してWebサーバにGetしてデータは転送されましたね。。。。
でも肝心かなめのデータに結構、誤差が多い。。。。。
3.3Vで1024の値が返ってくるハズなんやけど。。。
この値を元に、抵抗値から逆算してみると、実際の計測値と比較して2.4Vくらい下回る値となる結果。。。。
んーーーーーー!!!!
わからん。。。
まぁ、とりあえず、10bitの分解された値はそれなりに返ってきているんで、これと実際の計測電圧との相対比で計算して実際の電圧を割り出した方が、精度としては高そうな感じ。。。
ちょっと、残念ではあるものの、こっちに仕様変更しよーっと!
まぁ、抵抗の誤差とかなんかの影響かなー。。。。。
もうちょっと調べよ。。。
まぁとりあえずは、ちゃんと動いてるんで、Webサーバ側のPHPのプログラムでこの誤差を補正するようにちょっと考えて見よ。。。
うまく使えればいいデバイスになりそうな予感。。。。
もうちょっと勉強しよ。
【追記!】
sqliteにスタックしたデータをグラフにしてみました!
http://norisuke.servehttp.com/denatsu-graph.html
上記のプログラムロジックで電圧を算出してましたが、誤差があまりにも大きいので、10Bit分解値で950の場合を14.5Vとして基準値として相対比で電圧を算出することとしました。
実測値とほぼ誤差なしです!
14.5Vでレギュレーターが上昇制限をかけてるようで、これ以上は電圧の上昇はないことがよくわかります。。。
数値化してはじめてわかりました!!!
近日中にソーラーパネル単体の発電状態を表すグラフを追加予定!!!
好期待のほど!!!!!!!