ESP-WROOM-02(ESP8266)+BME280+Milkcocoa+FreeBoard
備忘録
17/1/11
〇MilkcocoaとESP8266
・このHPだけでほぼすべて完成
ESP8266やArduinoでMilkcocoaを使う方法(Milkcocoa Arduino SDK)
http://blog.mlkcca.com/iot/milkcocoa-arduino/
・Arduino&GitHUBを使ってことがあれば,このソースだけで十分です.
・私が使えなかった理由:1)そもそもGitHUBの意味が分かってなかった.2)Arduino初めて触った.3)マイコンの知識ゼロの3点です.
GitHUB:ESPrDeveloper_BME280
https://github.com/quallo-japan/ESPrDeveloper_BME280
〇Milkcocoaでグラフ化について
SORACOM AirとRaspberry Piを接続しつつMilkcocoa FreeBoardと連携しました
http://blog.mlkcca.com/iot/milkcocoa-on-soracom-air/
RaspberryPI3とMilkCocoaを連携させてみる。
http://takashin10mura.blogspot.jp/2016/06/raspberrypi3milkcocoa.html
Milkcocoaと複数のESP8266と温度センサでIoTしてみた。
http://qiita.com/wamisnet/items/f3d63be2044672b661a1
4050円で作るIoT温湿度・気圧センサモジュール
http://qiita.com/quallo_japan/items/ed7975d0b49436b638b5
〇Deep-Sleepモードの使い方
ESP8266の真骨頂Deep-Sleepモードの使い方
http://qiita.com/azusa9/items/65a5c3772c41631b5ca1
〇「実行モード」と「ファームウェアの書き込みモード」の切り替え
ESPr Developer(ピンソケット実装済)
https://www.switch-science.com/catalog/2652/
Hue Tapスイッチが高いのでESP-WROOM-02で物理スイッチを自作する 前編
http://make-muda.weblike.jp/2016/07/4192/
〇その他
・Milkcocoaについて
ESEC2016 組み込み開発に役立つIoTサーバの基礎知識
http://www.kumikomi.net/archives/2016/04/esec2016_1.php
・Blynk
結論:面白そうだが,使用不可
理由:アプリを使用していない場合はデータが蓄積されないため.閲覧したい人が複数いるため.
コメント:水槽管理など,見たい時だけ可視化するにはOKかも.
Raspberry Piを自在に遠隔操作できるスマホアプリ「Blynk」を実際に使ってみた!
http://plus.appgiga.jp/masatolan/2015/05/22/56025/
・Ambient、Xively、ThingSpeak、AT&T M2X
ESP8266・その6・IoTサービスサイト
http://ja2grc.blog3.fc2.com/blog-entry-3640.html
MeshbluでオープンソースのIoTをはじめよう - Part2: BME280の環境データをfreeboardに表示する
http://qiita.com/masato/items/5e1c811fe649dc4a6b28
完成したソースコード
#include<ESP8266WiFi.h>
#include<BME280_MOD-1022.h>
#include<Wire.h>
#include<Milkcocoa.h>
extern "C" {
#include "user_interface.h"
}
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "...SSID..." //自分の環境に合わせて変更
#define WLAN_PASS "...PASS..." //自分の環境に合わせて変更
/************************* Your Milkcocoa Setup *********************************/
#define MILKCOCOA_APP_ID "...YOUR_MILKCOCOA_APP_ID..." //自分の環境に合わせて変更
#define MILKCOCOA_DATASTORE "esp8266"
/************* Milkcocoa Setup (you don't need to change this!) ******************/
#define MILKCOCOA_SERVERPORT 1883
/************ Global State (you don't need to change this!) ******************/
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID;
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
/************************* *********************************/
/*void onpush(DataElement *elem) {
Serial.println("onpush");
Serial.println(elem->getInt("v"));
};
*/
void setupWiFi() {
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
//Wire.begin(13, 14); delay(10); // SDA=GPIO_13,SCL=GPIO_14
//SCL IO5(デフォルト)またはIO14
//SDA IO4(デフォルト)またはIO2
//I2Cアドレス 0x76(デフォルト)または0x77
Wire.begin(4, 5); delay(10);
setupWiFi();
// Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
}
void loop() {
milkcocoa.loop();
delay(5000);
// need to read the NVM compensation parameters
BME280.readCompensationParams();
// Need to turn on 1x oversampling, default is os_skipped, which means it doesn't measure anything
BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample)
BME280.writeOversamplingTemperature(os1x);
BME280.writeOversamplingHumidity(os1x);
BME280.writeMode(smForced); // After taking the measurement the chip goes back to sleep
while (BME280.isMeasuring()){Serial.println("Measuring...");delay(50);}
Serial.println("Done!");
BME280.readMeasurements(); // read out the data
/* double temp = 0.0, pressure=0.0, humid=0.0;
BME280.getTemperature();
BME280.getPressure();
BME280.getHumidity();
temp = BME280.getTemperature();
pressure = BME280.getPressure();
humid = BME280.getHumidity();*/
Serial.print("Temp=");
Serial.println(BME280.getTemperature()); // must get temp first
Serial.print("Humidity=");
Serial.println(BME280.getHumidity());
Serial.print("Pressure=");
Serial.println(BME280.getPressure());
/*Serial.print("PressureMoreAccurate=");
Serial.println(BME280.getPressureMoreAccurate()); // use int64 calculcations
Serial.print("TempMostAccurate=");
Serial.println(BME280.getTemperatureMostAccurate()); // use double calculations
Serial.print("HumidityMostAccurate=");
Serial.println(BME280.getHumidityMostAccurate()); // use double calculations
Serial.print("PressureMostAccurate=");
Serial.println(BME280.getPressureMostAccurate()); // use double calculations */
// int light = system_adc_read(); //analogRead(A0);
Serial.print(" % Light:=");
Serial.println(1024 - system_adc_read());
DataElement elem = DataElement();
elem.setValue("Temp", BME280.getTemperature());
elem.setValue("Humidity", BME280.getHumidity());
elem.setValue("Pressure", BME280.getPressure());
elem.setValue("Light", 1024 - system_adc_read());
milkcocoa.push(MILKCOCOA_DATASTORE, &elem);
delay(1000);
//DEEP SLEEPモード突入命令
Serial.println("DEEP SLEEP START!!");
//1:μ秒での復帰までのタイマー時間設定 2:復帰するきっかけの設定(モード設定)
ESP.deepSleep(1 * 60 * 1000 * 1000 , WAKE_RF_DEFAULT); //10min
//deepsleepモード移行までのダミー命令
delay(1000);
//実際にはこの行は実行されない
Serial.println("DEEP SLEEPing....");
}
unsigned int readLight()
{
unsigned int light = system_adc_read();
return light;
}
17/1/10
まとめ
〇「実行モード」と「ファームウェアの書き込みモード」が理解できず苦労した
・実行モード:電源のみで作動
(書き込み不可:エラー表示)
error: failed reading byte
warning: espcomm_send_command: cant receive slip payload data
・書き込みモード:PCとUSBで接続し,ESP8266にデータを書き込めるモード
・切り替え方:実行モード(RESETボタンを押す),書き込みモード(FLASHを押しながらRESETボタンを押す)
〇 Milkcocoaへの出力は簡単にできた.
〇FreeBoard(+Milkcocoa)でのグラフ化:少し苦労した
・下記のように設定するだけだが,違う設定で一度Saveした場合は,改めて作り直すこと!
・TYPE:Milkcocoa //Milkcocoaを選択
・NAME:Sensor //データ名をつける,自由
・DATASOTRE:esp8266 //#define MILKCOCOA_DATASTORE "esp8266"の中身
・API:push //
〇MilkcocoaとESP8266
このHPだけでほぼすべて完成
ESP8266やArduinoでMilkcocoaを使う方法(Milkcocoa Arduino SDK)
http://blog.mlkcca.com/iot/milkcocoa-arduino/
〇Milkcocoaでグラフ化について
SORACOM AirとRaspberry Piを接続しつつMilkcocoa FreeBoardと連携しました
http://blog.mlkcca.com/iot/milkcocoa-on-soracom-air/
RaspberryPI3とMilkCocoaを連携させてみる。
http://takashin10mura.blogspot.jp/2016/06/raspberrypi3milkcocoa.html
Milkcocoaと複数のESP8266と温度センサでIoTしてみた。
http://qiita.com/wamisnet/items/f3d63be2044672b661a1
〇Deep-Sleepモードの使い方
ESP8266の真骨頂Deep-Sleepモードの使い方
http://qiita.com/azusa9/items/65a5c3772c41631b5ca1
〇「実行モード」と「ファームウェアの書き込みモード」の切り替え
ESPr Developer(ピンソケット実装済)
https://www.switch-science.com/catalog/2652/
Hue Tapスイッチが高いのでESP-WROOM-02で物理スイッチを自作する 前編
http://make-muda.weblike.jp/2016/07/4192/
〇その他
・Milkcocoaについて
ESEC2016 組み込み開発に役立つIoTサーバの基礎知識
http://www.kumikomi.net/archives/2016/04/esec2016_1.php
・Blynk
結論:面白そうだが,使用不可
理由:アプリを使用していない場合はデータが蓄積されないため.閲覧したい人が複数いるため.
コメント:水槽管理など,見たい時だけ可視化するにはOKかも.
Raspberry Piを自在に遠隔操作できるスマホアプリ「Blynk」を実際に使ってみた!
http://plus.appgiga.jp/masatolan/2015/05/22/56025/
・Ambient、Xively、ThingSpeak、AT&T M2X
ESP8266・その6・IoTサービスサイト
http://ja2grc.blog3.fc2.com/blog-entry-3640.html
MeshbluでオープンソースのIoTをはじめよう - Part2: BME280の環境データをfreeboardに表示する
http://qiita.com/masato/items/5e1c811fe649dc4a6b28
完成したソースコード
#include<ESP8266WiFi.h>
#include<BME280_MOD-1022.h>
#include<Wire.h>
#include<Milkcocoa.h>
/************************* WiFi Access Point *********************************/
#define WLAN_SSID "...SSID..." //自分の環境に合わせて変更
#define WLAN_PASS "...PASS..." //自分の環境に合わせて変更
/************************* Your Milkcocoa Setup *********************************/
#define MILKCOCOA_APP_ID "...YOUR_MILKCOCOA_APP_ID..." //自分の環境に合わせて変更
#define MILKCOCOA_DATASTORE "esp8266"
/************* Milkcocoa Setup (you don't need to change this!) ******************/
#define MILKCOCOA_SERVERPORT 1883
/************ Global State (you don't need to change this!) ******************/
// Create an ESP8266 WiFiClient class to connect to the MQTT server.
WiFiClient client;
const char MQTT_SERVER[] PROGMEM = MILKCOCOA_APP_ID ".mlkcca.com";
const char MQTT_CLIENTID[] PROGMEM = __TIME__ MILKCOCOA_APP_ID;
Milkcocoa milkcocoa = Milkcocoa(&client, MQTT_SERVER, MILKCOCOA_SERVERPORT, MILKCOCOA_APP_ID, MQTT_CLIENTID);
/************************* *********************************/
/*void onpush(DataElement *elem) {
Serial.println("onpush");
Serial.println(elem->getInt("v"));
};
*/
void setupWiFi() {
Serial.println(); Serial.println();
Serial.print("Connecting to ");
Serial.println(WLAN_SSID);
WiFi.begin(WLAN_SSID, WLAN_PASS);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println();
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
}
void setup() {
Serial.begin(115200);
//Wire.begin(13, 14); delay(10); // SDA=GPIO_13,SCL=GPIO_14
//SCL IO5(デフォルト)またはIO14
//SDA IO4(デフォルト)またはIO2
//I2Cアドレス 0x76(デフォルト)または0x77
Wire.begin(4, 5); delay(10);
setupWiFi();
// Serial.println( milkcocoa.on(MILKCOCOA_DATASTORE, "push", onpush) );
}
void loop() {
milkcocoa.loop();
delay(5000);
// need to read the NVM compensation parameters
BME280.readCompensationParams();
// Need to turn on 1x oversampling, default is os_skipped, which means it doesn't measure anything
// BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample)
// BME280.writeOversamplingTemperature(os1x);
// BME280.writeOversamplingHumidity(os1x);
BME280.writeMode(smForced); // After taking the measurement the chip goes back to sleep
while (BME280.isMeasuring()){Serial.println("Measuring...");delay(50);}
Serial.println("Done!");
BME280.readMeasurements(); // read out the data
Serial.print("Temp=");
Serial.println(BME280.getTemperature()); // must get temp first
Serial.print("Humidity=");
Serial.println(BME280.getHumidity());
Serial.print("Pressure=");
Serial.println(BME280.getPressure());
/* Serial.print("PressureMoreAccurate=");
Serial.println(BME280.getPressureMoreAccurate()); // use int64 calculcations
Serial.print("TempMostAccurate=");
Serial.println(BME280.getTemperatureMostAccurate()); // use double calculations
Serial.print("HumidityMostAccurate=");
Serial.println(BME280.getHumidityMostAccurate()); // use double calculations
Serial.print("PressureMostAccurate=");
Serial.println(BME280.getPressureMostAccurate()); // use double calculations */
//float temp = BME280.getTemperature();
//float pressure = BME280.getPressure();
//float humid = BME280.getHumidity();
DataElement elem = DataElement();
elem.setValue("Temp", BME280.getTemperature());
elem.setValue("Humidity", BME280.getHumidity());
elem.setValue("Pressure", BME280.getPressure());
// elem.setValue("Temp", temp);
//elem.setValue("Humidity", pressure);
//elem.setValue("Pressure", humid);
milkcocoa.push(MILKCOCOA_DATASTORE, &elem);
delay(1000);
//DEEP SLEEPモード突入命令
Serial.println("DEEP SLEEP START!!");
//1:μ秒での復帰までのタイマー時間設定 2:復帰するきっかけの設定(モード設定)
ESP.deepSleep(10 * 60 * 1000 * 1000 , WAKE_RF_DEFAULT); //10min
//deepsleepモード移行までのダミー命令
delay(1000);
//実際にはこの行は実行されない
Serial.println("DEEP SLEEPing....");
}
14/1/10
〇PGが書き込めない問題解決&動作チェック
・解決しました...
:結論としては,接続チェックのためにリセットボタンを押したため「実行モード」に切り替わっていた.
対策:下記ページを参考に「書き込みモード」に変更する.
一部抜粋
モード切替ボタンはIO0番ピンにつながっています。ボタンを押すとIO0がLOW、放すとIO0がHIGHになります。IO0がHIGHの状態でリセットされるとファームウェアの実行モードで起動しますが、IO0がLOWの状態でリセットされるとファームウェアの書き込みモードで起動します。
ESPr Developer(ピンソケット実装済)
https://www.switch-science.com/catalog/2652/
動作環境
・ESPr Developer(ピンソケット実装済)
・ESPr Developer用環境センサシールド
・Arduino:1.8.0 (Windows 8.1), ボード:"Generic ESP8266 Module, 80 MHz, 40MHz, QIO, 115200, 4M (3M SPIFFS), nodemcu, Disabled, None"
動作確認に使ったPGの機能
・シリアルモニタに温度,湿度,気圧を出力する
使用方法
1.コンパイル
2.書き込み
3.シリアルモニタを開く
#include<ESP8266WiFi.h>
#include<BME280_MOD-1022.h>
#include<Wire.h>
extern "C" {
#include "user_interface.h"
}
void setup() {
Serial.begin(115200);
//Wire.begin(13, 14); delay(10); // SDA=GPIO_13,SCL=GPIO_14
//SCL IO5(デフォルト)またはIO14
//SDA IO4(デフォルト)またはIO2
//I2Cアドレス 0x76(デフォルト)または0x77
Wire.begin(4, 5); delay(10);
}
void loop() {
delay(5000);
// need to read the NVM compensation parameters
BME280.readCompensationParams();
// Need to turn on 1x oversampling, default is os_skipped, which means it doesn't measure anything
// BME280.writeOversamplingPressure(os1x); // 1x over sampling (ie, just one sample)
// BME280.writeOversamplingTemperature(os1x);
// BME280.writeOversamplingHumidity(os1x);
BME280.writeMode(smForced); // After taking the measurement the chip goes back to sleep
while (BME280.isMeasuring()){Serial.println("Measuring...");delay(50);}
Serial.println("Done!");
BME280.readMeasurements(); // read out the data
Serial.print("Temp=");
Serial.println(BME280.getTemperature()); // must get temp first
Serial.print("Humidity=");
Serial.println(BME280.getHumidity());
Serial.print("Pressure=");
Serial.println(BME280.getPressure());
Serial.print("PressureMoreAccurate=");
Serial.println(BME280.getPressureMoreAccurate()); // use int64 calculcations
Serial.print("TempMostAccurate=");
Serial.println(BME280.getTemperatureMostAccurate()); // use double calculations
Serial.print("HumidityMostAccurate=");
Serial.println(BME280.getHumidityMostAccurate()); // use double calculations
Serial.print("PressureMostAccurate=");
Serial.println(BME280.getPressureMostAccurate()); // use double calculations
delay(1000);
}
17/1/4
1.下記を参考にIDEインストール
2.下記を参考にESP-WROOM-02開発環境を準備する.
ESP-WROOM-02開発ボードをArduino IDEで開発する方法
3.Arduinoの基本を理解する.
ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介
ESPr Developer + Ambientで作る自宅の環境モニターを作る
〇補足
・シミュレータを探してみた.
電子工作シミュレータ「123d circuits」を使ってみよう!
・Webでよく出てくる回路図下のFritzingについて調べてみた.
【ハード】回路図作成ソフトの定番!『Fritzing』を使い倒す
・よく出てくるWireライブラリについて調べてみた.
このライブラリはI2C(TWI)デバイスとの通信を可能にします。ArduinoUnoR3のレイアウトでは、SDA(データ線)とSCL(クロック線)という2つのピンがAREFの隣にあり、このピンにI2Cデバイスを接続することができます。