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インストール

ArduinoのIDE(統合開発環境)をインストールする


2.下記を参考にESP-WROOM-02開発環境を準備する.

ESP-WROOM-02開発ボードをArduino IDEで開発する方法


3.Arduinoの基本を理解する.

Arduinoの動かせ方入門



ESPr Developer ( ESP-WROOM-02 開発ボード )の使い方をザッと紹介



ESPr Developer + Ambientで作る自宅の環境モニターを作る



〇補足

・シミュレータを探してみた.

電子工作シミュレータ「123d circuits」を使ってみよう!


・Webでよく出てくる回路図下のFritzingについて調べてみた.

【ハード】回路図作成ソフトの定番!『Fritzing』を使い倒す


・よく出てくるWireライブラリについて調べてみた.

このライブラリはI2C(TWI)デバイスとの通信を可能にします。ArduinoUnoR3のレイアウトでは、SDA(データ線)とSCL(クロック線)という2つのピンがAREFの隣にあり、このピンにI2Cデバイスを接続することができます。

Wireライブラリ - Arduino 日本語リファレンス