最近の投稿
最近のコメント
表示回数の多いページ

Posts Tagged ‘nodemcp’

IoT支える有望なデバイスを使って今度は、ESP-WROOM-02を使ってさらに、MCP3208でAD変換をして多くのアナログデータを制御してみた!

前回、ESP8266のnodemcpバージョンを使って、ソーラーパネルで発電してバッテリーに蓄電する電圧ロガーを作ってみましたが。。。

今回は、また新たにESP8266のESP-WROOM-02バージョンを使って、前回のバッテリー電圧だけじゃなくて、ソーラーパネルの発電量とソーラーパネル周辺の明るさをデーター化できるように新たに作ってみました。。。

 

ESP8266はすでにご存じの通り、アナログ入力のポートは1個しかなくて、アナログセンサーなどを複数つなぐのはちょっと面倒なことをしなけりゃいかんかったんですよね。。。

そんならデジタルデバイスを使えばええやんというご意見が聞こえてきそうですけど、アナログデバイスは、価格が安いとか、回路が簡単いうメリットがあるし、なにより、”味のある数値”(なんじゃそりゃ!)が出るということもあり結構すきなんですよねー!

 

ということもあり、ESP8266で使えるアナログポートを増やして、たんまり、アナログな味に浸れるバージョンを前回の発展形として作ってみました。。

 

今回は、前回3つ入手したうちの2つ目の種類である、ESP-WROOM-02を使ってみます。

今回は、アナログ入力が3つ必要となるので、ESP8266とMCP3208というADコンバーターをSPIで繋いで、アナログポートを増やして作ります。。

 

これは、前回使用した、nodemcpバージョンのように、USBシリアルやら、レギュレータやらは一切なくて、単にチップだけで構成されています。

なので、単純にプログラムを書き込むだけでも、それなりのUSBシリアルを介した回路を組んでやる必要があるんですよね。。

 

詳しくは、ESP8266 書き込み でググってみてください。。

 

まぁ、ネットの情報を元に作ってみたのがこんな感じ。。。

上のブレッドボードのヤツが今回作ってみたやつ!

(下は前回製作した、nodemcuバージョンのやつですな。)

 

右上の青い変な形をしている基盤に乗っかってるのが、ESP-WROOM-02

 

その下のちょっと小さな基盤が、USBシリアルコンバーター

 

こんな感じ。。。

 

 

ブレッドボードのちょうど中心にあるのが、ADコンバーターのMCP3208

こんな感じ。。

まぁフツーのICの形なんで、見た目わかりません。。。

このADコンバーターは8ch分のアナログ入力が可能で、12bitの分解能力がある優れもの!

でも300円弱なんでコストパフォーマンスは高いですな。

 

これに、0chには、バッテリーの端子間電圧

1chには、ソーラーパネルの電圧

2chには、CDSを付けて、明るさを数値化していることにしてみました。。

 

っで、肝心かなめのプログラムは。。。

extern "C"{
 #include <spi.h>
 #include <spi_register.h>
 }
 #include <ESP8266WiFi.h>
 #include <ESP8266HTTPClient.h></pre>
char ssid[] = "xxxxxxxxxxxxx";
char password[] = "xxxxxxxxxxxxxxxxxxxxxxx";
int wifipin = 16;
int accpin = 5;

void setup() {

Serial.begin(115200);
Serial.println("");

spi_init(HSPI);

pinMode(wifipin,OUTPUT);
pinMode(accpin,OUTPUT);

delay(1000);

digitalWrite(wifipin,LOW);
connectWifi();
digitalWrite(wifipin,HIGH);

delay(1000);

}

void loop() {

digitalWrite(accpin,HIGH);

String value_data = get_value();

String acc_url = "http://xxxxxxxxxxxxxxxxxxxxxxx?";
String url_string = acc_url + value_data;

Serial.println(url_string);

char buf[256];
url_string.toCharArray(buf,256);

String result_data = getPageSource(buf);

Serial.println(result_data);
digitalWrite(accpin,LOW);

delay(60000);

}

void connectWifi() {

WiFi.disconnect();
delay(250);

Serial.println("");
Serial.println("Status : " + WiFi.status());
Serial.println("SSID : " + WiFi.SSID());

WiFi.mode(WIFI_STA);
delay(100);
WiFi.begin(ssid, password);

Serial.println("ssid : " + String(ssid));

while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(500);
}
Serial.println("");
Serial.println("connected!");
}

String getPageSource(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;
}

String get_value() {

uint32 val0 = check(0);
uint32 val1 = check(1);
uint32 val2 = check(2);

String vale_data = "ba=" + String(val0) + "&so=" + String(val1) + "&br=" + String(val2);

Serial.print(" Battery Voltage : ");
Serial.println(val0);
Serial.print(" Solar Pannel Voltage : ");
Serial.println(val1);
Serial.print(" Brightness : ");
Serial.println(val2);

return vale_data;

}

uint32 check(int channel) {
uint8 cmd = (0b11 << 3) | channel;

const uint32 COMMAND_LENGTH = 5;
const uint32 RESPONSE_LENGTH = 12;

uint32 retval = spi_transaction(HSPI, 0, 0, 0, 0, COMMAND_LENGTH, cmd, RESPONSE_LENGTH, 0);

retval = retval & 0x3FF; // mask to 10-bit value

return retval;
}

こんな感じ。。。

多くのネットの諸先輩方の献身的な情報公開によってSPIの接続のとこをはちょっと悩みましたけど。。。

なんとか動きました!!!

 

この情報で取得した結果は、前回同様!!

http://norisuke.servehttp.com/denatsu-graph.html に公開してますんで見てみてね!

 

 

Pocket

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サーバへのデータ転送が完了するまでの間に点灯させるためのアクセスランプを付けて見ました。。。

 

っで、この回路で稼働させるためのプログラムはこんな感じにしてみました。。。

(数多くのネットに掲載されていらっしゃる諸先輩方のプログラムを多く流用させてもらいました。。。感謝です。。)


#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;
}

こっちが、ESP8266用のプログラムで。。。。

受け側のWebサーバ側のプログラムはお手軽に書けるようにPHPにしてみました。。。


<?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();
}
?>

こんな感じ。。。

PHP側は、GETで受けたらsqliteにinsertしてデータをスタックするようにしてみました。。。

まぁセキュリティーは一切考慮してないんで、これで運用しちゃうと簡単にやられちゃいますね。。。。

まぁとりあえずESP8266はどんなもんなんかを知るためなんで、今回はそういったややこしいことは一切無視!ってことで。。。。(それでええんか!!!って非難が聞こえてきそう。。。)

 

これでとりあえず実行してみることに!!!!

 

んー。。。

ちゃんと、WiFiで接続してWebサーバにGetしてデータは転送されましたね。。。。

でも肝心かなめのデータに結構、誤差が多い。。。。。

 

3.3Vで1024の値が返ってくるハズなんやけど。。。

この値を元に、抵抗値から逆算してみると、実際の計測値と比較して2.4Vくらい下回る値となる結果。。。。

 

んーーーーーー!!!!

 

わからん。。。

 

まぁ、とりあえず、10bitの分解された値はそれなりに返ってきているんで、これと実際の計測電圧との相対比で計算して実際の電圧を割り出した方が、精度としては高そうな感じ。。。

ちょっと、残念ではあるものの、こっちに仕様変更しよーっと!

まぁ、抵抗の誤差とかなんかの影響かなー。。。。。

 

もうちょっと調べよ。。。

 

まぁとりあえずは、ちゃんと動いてるんで、Webサーバ側のPHPのプログラムでこの誤差を補正するようにちょっと考えて見よ。。。

 

うまく使えればいいデバイスになりそうな予感。。。。

もうちょっと勉強しよ。

 

【追記!】

sqliteにスタックしたデータをグラフにしてみました!

http://norisuke.servehttp.com/denatsu-graph.html


過去4日間のデータを対象として表示します。

上記のプログラムロジックで電圧を算出してましたが、誤差があまりにも大きいので、10Bit分解値で950の場合を14.5Vとして基準値として相対比で電圧を算出することとしました。

実測値とほぼ誤差なしです!

14.5Vでレギュレーターが上昇制限をかけてるようで、これ以上は電圧の上昇はないことがよくわかります。。。

数値化してはじめてわかりました!!!

 

近日中にソーラーパネル単体の発電状態を表すグラフを追加予定!!!

好期待のほど!!!!!!!

Pocket