Posts Tagged ‘MCP3208’
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を付けて、明るさを数値化していることにしてみました。。
っで、肝心かなめのプログラムは。。。
[html]
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;
}
[/html]
こんな感じ。。。
多くのネットの諸先輩方の献身的な情報公開によってSPIの接続のとこをはちょっと悩みましたけど。。。
なんとか動きました!!!
この情報で取得した結果は、前回同様!!
http://norisuke.servehttp.com/denatsu-graph.html に公開してますんで見てみてね!