You are here

ESP8266: Blynkで環境ログ(データの蓄積利用)

Blynkの使用例では、IoTデバイスを対話的に操作する例が多いですが、ここではThingSpeakを利用するアプリケーションと同様に、計測データをIoTプラットフォーム(この場合はBlynkサーバー)に蓄積して、現時点のIoTデバイスの計測値ではなく、サーバーに蓄積された計測値の継時変化を表示するためのスケッチを示します。

この方法では、IoTデバイスはBlynkサーバーにデータを送る時だけ稼働していればいいので、BlynkでもIoTデバイスをスリープさせて継続的に稼働状態にしておく必要はなくなります。
このような方法を利用すると、IoTデバイスの電力使用量を抑えて、電池等での運用期間を延ばしたり、IoTデバイスの発熱による計測値の誤差の増大を防ぐことができます。

。。。ただし、IoTデバイスがほとんどの期間眠りこけているので、スマートフォンからIoTデバイスの対話的な操作はできなくなりますが。。。

スマートフォンのBlynkアプリ

スマートフォンの画面は上記の通り。
9月はまだ暑い。でも、夏の暑さに体が慣れて、この程度ではまあ大丈夫。動くと汗がうっすらと出ますね。
明るさのグラフが、朝の夜明けから順調に上がっていますが、一時ガクンと落ちました。
グラフを見てどうしたんだろうと思って確認すると、一時的に空に雲がかかって心もち暗くなっていました。
人間はあまり意識していなくても、明るさの数値的なものとかは時々刻々と大きく変化しているんですね。


環境センサーBME280の利用法は以下のページをご参照ください。
http://www.microfan.jp/esp8266/workshop/bme280-oled


IoTデバイス(ESP8266-LEAF-R5)から環境データを定期的にBlynkサーバーに送って蓄積し、スマートフォンのBlynkアプリではHistory Graphでサーバーからデータを取得して時間的な変化をグラフ化します。

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#include <BME280I2C.h>
#include <Wire.h>

// BlynkのAuth Tokenを設定
char auth[] = "YOURAPPAUTHTOKEN" ;

char ssid[] = "YOURSSID" ;
char pass[] = "YOURPASSWORD" ;

#define SLEEP_MINUTES 1

BME280I2C bme;
#define PRESSURE_HPA 1 // ヘクトパスカル

BlynkTimer timer ;

void setup()
{
  Serial.begin(115200);

  while (!bme.begin()) {
    delay(1000) ;
  }

  Blynk.begin(auth, ssid, pass) ;
  // サーバーへのデータの送信間隔をミリ秒で指定
  timer.setInterval(SLEEP_MINUTES * 60 * 1000L, sendEnv) ;
}

void sendEnv()
{
  float temp ; // 温度
  float hum ;  // 湿度
  float pres ; // 気圧
  float dew ;  // 露点
  int brightness = analogRead(A0) ;  // 明るさ

  // 気圧(hPa)、温度(摂氏)、湿度を取得
  bme.read(pres, temp, hum, true, PRESSURE_HPA) ;
  dew = bme.dew(true) ; // 露点(摂氏)を取得
  
  Blynk.virtualWrite(V0, temp) ;
  Blynk.virtualWrite(V1, hum) ;
  Blynk.virtualWrite(V2, pres) ;
  Blynk.virtualWrite(V3, dew) ;
  Blynk.virtualWrite(V4, brightness) ;
}

void loop()
{
  Blynk.run() ;
  timer.run() ;
}

このスケッチは、PUSH型のIoTデバイスとなっており、スマートフォンのBlynkアプリの実行の有無にかかわらず、指定した間隔で環境データをBlynkサーバーに送信します。
このため、スマートフォンBlynkアプリが実行されていなかった機関の計測データも含めていつでも参照することができます。


上記の例では、ESP-WROOM-02が継続稼働するため、発熱による温度等の計測エラーが問題になります。

ESP-WROOM-02の発熱を抑えて温度等の計測精度を向上させたり、IoTデバイスの使用電力を削減するために、DeepSleapを使用して、間欠的に動作して計測データをBlynkサーバーに送ります。

このため、スマートフォンのBlynkアプリから見ると、基本的にIoTデバイスはスリープによってオフラインとなります。

このスケッチを実行する際には、DeepSleepから復帰できるように、ESP8266-LEAF-R5のD16端子とRST端子を1KΩ程度の抵抗で接続してください。

D16とRSTの接続

#define BLYNK_PRINT Serial

#include <ESP8266WiFi.h>
#include <BlynkSimpleEsp8266.h>

#include <BME280I2C.h>
#include <Wire.h>

// BlynkのAuth Tokenを設定
char auth[] = "YOURAPPAUTHTOKEN" ;

char ssid[] = "YOURSSID" ;
char pass[] = "YOURPASSWORD" ;

#define SLEEP_MINUTES 5

BME280I2C bme;
#define PRESSURE_HPA 1 // ヘクトパスカル

void setup()
{
  Serial.begin(115200) ;

  while (!bme.begin()) {
    delay(1000) ;
  }

  Blynk.begin(auth, ssid, pass) ;
}

void loop()
{
  float temp ; // 温度
  float hum ;  // 湿度
  float pres ; // 気圧
  float dew ;  // 露点
  int brightness = analogRead(A0) ;  // 明るさ

  // 気圧(hPa)、温度(摂氏)、湿度を取得
  bme.read(pres, temp, hum, true, PRESSURE_HPA) ;
  dew = bme.dew(true) ; // 露点(摂氏)を取得
  
  Blynk.virtualWrite(V0, temp) ;
  Blynk.virtualWrite(V1, hum) ;
  Blynk.virtualWrite(V2, pres) ;
  Blynk.virtualWrite(V3, dew) ;
  Blynk.virtualWrite(V4, brightness) ;
  Blynk.run() ;

  // スリープ時間をμ秒で指定
  ESP.deepSleep(SLEEP_MINUTES * 60 * 1000 * 1000 , WAKE_RF_DEFAULT) ;

  delay(60 * 1000) ;
}

利用したパーツ



開発ソフト: 
チップファミリー: 
MCUチップ: