macsbug

Just another WordPress.com site

ESP と BME280 と ThingSpeak で IOT

with 6 comments

ThingSpeak で 温度、湿度、気圧 をモニターする。                                                   2015.10.13


BME280 センサーから温度、湿度、気圧を取得し ESP-WROOM-02 から ThingSpeakに送信する。
ThingSpeak は、センサーによって収集されたデータを、ブラウザーに可視化することができます。
PluginやMATLAB等の機能があり、Pluginでは、円グラフ表示も出来る様になります。



用意するもの:
1. ESP-WROOM-02:秋月電子通商、共立電子、マイクロテクニカ、Cerevo、aitendo。
_ 注:各社によって基板の配線や端子が事なる為、ピン番号等を充分確認の事。
2. BME280(温度、湿度、気圧)センサー:秋月で1個1080円
3. IoTデータの収集サービス:ThingSpeakアカウント登録済みの事。Channel設定済みの事。
_ アカウント登録で作られた Thingspeak Write KEY を入手しておく事。(スケッチに記入)
.
以下は既に ESP-WROOM-02(ESP-12) に書き込みが出来るように準備済である事。
1. 3.3V 800mA 電源:例:YwRobot Breadboard Power Supply。注:500mA以上必要。
2. USBシリアル変換機:例;超小型USBシリアル変換モジュール。秋月。
3. ブレッドボード、ワイヤー、10KΩ 、100Ω 、スイッチ、AC Adapter(DC9V 2A):秋月。
4. Arduino IDE ver 1.6.5:Board は、Generic ESP8266 Module が設定済みである事。
5. Libraly:Adafruit_BME280_Library Adafruit_Sensor をインストール済みの事。
6. Arduino IDEによる PROGRAM と RST スイッチの書き込み方法は事前に習熟の事。


配線:左が BME280。右が YwRobot Breadboard Power Supply(AS1117 33 Regulator:800mA)。
橙色のスイッチは、RST(RESET) スイッチ。緑のスイッチは、PROGRAM スイッチ。

左上に USBシリアル変換機。中央に ESP-WROOM-02。
中央下の ESPの電源とGND端子側に 導電性高分子アルミ固体電解コンデンサ47uF。
ESP-WROOM-02の電源端子に SMA Connector を装着(電源モニター用)。

Deep-Sleep から 送信時の電源:3.24V -> 3.12V。12mVpp。[ Analog Discoveryによる観測]


BME280:温度、湿度、気圧を内蔵したセンサー
_ 温度:範囲:-40~65℃:精度:+-0.5℃(@25℃)、+-1.0℃(0~65℃):分解能 0.01°
_ 湿度:測定範囲:0~100%RH:分解能:0.008%RH:精度:+-3%RH
_ 気圧:測定範囲:300~1100hPa:精度:+-1.0hPa:分解能 0.008%


メモ:
1. Deep-Sleep モードを使用する時は、Pin 17(IO 16) と Pin 15(RST) をジャンパーする事。
_ Deep-Sleep 復帰時に、LOW信号が出力され RST(RESET) を動作させる。
2. Deep-Sleep モード(10uA)からの送信は過大な電流が流れる為、3.3V電源は 3.0V以上の事。
3. BME280 は、SPI接続とI2C接続がある。今回は、Liblaryの関係でSPI(4本線)を採用した。
_ 理由:I2C 接続を実施してみたが動作しない為、SPI 接続とした。(宿題)
4. スケッチ:次の設定は各自で行う事。
_ SEALEVELPRESSURE_HPA、MySSID、MyPassword、thingspeak_key
_ BME280とESPの配線変更は、Adafruit_BME280 bme(CSB,SDI,SDO,SCK )の値を設定する。
5. 送信間隔:10分毎でスケッチ最下段にあり。system_deep_sleep(10 * 60 * 1000000);
6. データー送信方法:
_ Requesting URL: /update?key=XY64****RF4&field1=23.45&field2=45.67&field3=1008.12
_ という形で Thingspeakサイトに AppKeyと一緒にフィールドデータを送ります。
_ なので、うまく自分のチゃネルにデータが送り込める訳です。


スケッチ:

// ESPWROOM-02(ESP-12) + BME280 + thingspeak service
// BMP280(VDD) --> 3.3V
// BMP280(GND) --> GND
// BMP280(CSB) --> ESP(GPIO 14)( 3 pin)
// BMP280(SDI) --> ESP(GPIO 12)( 4 pin)
// BMP280(SDO) --> ESP(GPIO 13)( 5 pin)
// BMP280(SCK) --> ESP(GPIO  4)(10 pin)

#include <ESP8266WiFi.h>
#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BME280.h>
extern "C" {
  #include "user_interface.h"
}
#define SEALEVELPRESSURE_HPA (1000.00)                  // please set
//Adafruit_BME280 bme();                                // I2C                   
Adafruit_BME280 bme(14, 12, 13, 4 );                    // CSB,SDI,SDO,SCK
const char* ssid     = "MySSID";                        // myRouter SSID
const char* password = "MyPassword";                    // myRouter Password
const char* host = "api.thingspeak.com";                // thingspeak URL
const char* thingspeak_key = "xxxxxxxxxxxxxxxx";        // thingspeak Write KEY

void turnOff(int pin) { pinMode(pin, OUTPUT); digitalWrite(pin, 1);}

void setup() {
  Serial.begin(115200);
  turnOff(0);turnOff(2);turnOff(5);turnOff(15);//disable all output to save power
  pinMode(4,INPUT);pinMode(12,INPUT);pinMode(13,INPUT);pinMode(14,INPUT);
  Serial.println(F("BME280 Start"));    // BME280 check
  if (!bme.begin()){Serial.println("Failed BME280 sensor!"); while (1);}
  Serial.println();Serial.println();Serial.print("Connecting to ");
  Serial.println(ssid);
  WiFi.begin(ssid, password); 
  while (WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}
  Serial.println("");Serial.println("WiFi connected");Serial.println("IP address: ");
  Serial.println(WiFi.localIP());
}

void loop() {
  delay(5000);
  Serial.print("connecting to ");Serial.println(host);
  WiFiClient client;      // Use WiFiClient class to create TCP connections
  const int httpPort = 80;
  if (!client.connect(host,httpPort)){Serial.println("connection failed");return;}

  String temp = String(bme.readTemperature());                 // Temp
  String humi = String(bme.readHumidity());                    // Humidity
  String pres = String(bme.readPressure()/100);                // Pressure
  String alti = String(bme.readAltitude(SEALEVELPRESSURE_HPA));// Altitude 
  String url = "/update?key=";
  url += thingspeak_key;          // thingspeak Write KEY
  url += "&field1=";url += temp;  // Temp
  url += "&field2=";url += humi;  // Humidity
  url += "&field3=";url += pres;  // Pressure
  url += "&field4=";url += alti;  // Altitude   
  Serial.print("Requesting URL: ");Serial.println(url);
  
  // send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + "Connection: close\r\n\r\n");
  delay(10);
 
  while(client.available()){           // reply from server
   String line = client.readStringUntil('\r'); Serial.print(line);
  }
 
 Serial.println();Serial.println("closing connection. going to sleep...");
 delay(1000);
 system_deep_sleep_set_option(0);      // go to deepsleep for 10 minutes
 system_deep_sleep(10 * 60 * 1000000); // 10 minutes
}

参考:
Thingspeak Data Logger
How to Hookup Adafruit BME280 Barometric Pressure Sensor to an Arduino
Bring IOT to Arduino, togerther

宅Make !【IoTをDIY!】ThingSpeakで作る湿温度モニター(第一回)
Qiita:ESP8266とThingspeakとArduinoで電力計を作る
BME280:Breakout Temperature Humidity Barometric Pressure BME280 Digital Sensor Module
_ ebayで 1個828円。BME280の派生品で専用のライブラリ−がある。
ネットワークをモニターするマック用のソフト:IP Scanner Home:ESPを確認できる。


復習:
ファームウエアの書き込みモード
ALL OFF
PROGRAM(IO_0 : pin_8) Push (GND)
PROGRAM(IO_0 : pin_8) Push (GND) + RESET(RST : pin_12) Push (GND)
PROGRAM(IO_0 : pin_8) Push (GND)
ALL OFF


 

Written by macsbug

10月 13, 2015 @ 7:52 am

カテゴリー: ESP8266

コメント / トラックバック6件

Subscribe to comments with RSS.

  1. スケッチの24行目、アウトプットの出力をカットオフするのだから
    void turnOff(int pin) { pinMode(pin, OUTPUT); digitalWrite(pin, 1);}
    は、
    void turnOff(int pin) { pinMode(pin, OUTPUT); digitalWrite(pin, 0);}
    ではないでしょうか?

    infomac

    10月 13, 2015 at 8:56 am

    • ご質問の内容をお聞きします。
      カットオフとは、どういう意味で、どういう状態に、することでしょうか?

      macsbug

      10月 14, 2015 at 12:40 am

  2. どうも、infomacこと林です。カットオフって、かっこつけて書きましたが、単純に電源供給を切るということです。パイロットランプ代わりにGPIOピンにLEDなどを付けておくことがありますが、そこへの電源供給をストップしておくには
    void turnOff(int pin) { pinMode(pin, OUTPUT); digitalWrite(pin, 0);}
    としておく必要があるのではないか、と考えたのですが。

    infomac

    10月 14, 2015 at 5:48 am

    • 意味が解り理解できました。LED を接続していた場合はオフにする必要がある。
      LEDを負荷にした場合は、出力を”0″にする必要がありますね。
      LEDをプルアップしてESPに接続した場合は、出力を”1″にする必要があります。
      ご指摘のように初期化での設定は大変重要です。
      それには、CPUやESPの内部構造がどうなっているか知る必要があります。
      実は、命題として「未使用ピンの処理」はどうするかで悩んでいます。
      ここでの意味は、使用していないピンの処理は、出力モードにして、”1″にする事。
      これにより、消費電力をセーブする事と部品数を少なくする事を目指しました。
      ESPのDeep-Sleepは、10uAです。電源に乾電池を使用した場合、長時間持たせるには、消費電力を押さえる工夫が必要です。
      1に省エネ、2に省エネって感じでしょうか。その為に今回はこのような設定にしました。
      かと言って実際にどのくらいセーブできたかは、測定していませんし、恐らく測れないくらいだと想像します。
      ESPがDeep-Sleep時に、BME280はどのように消費電力をセーブするかの問題もあります。
      他に入力モードにしない理由は、ノイズの影響があるからです。
      まだまだ、技術的に未熟なものですからこれからも勉強をして行きたいと思います。
      以下、参考になればと思います。
      未使用GPIO(汎用I/O)の処理はどうすれば良いの? (1/3)
      http://ednjapan.com/edn/articles/1408/19/news003.html
      未使用のIOピンについて教えてください。
      http://japan.renesas.com/support/faqs/faq_results/Q103401-Q103500/MPUMCU_SH_067J.jsp
      使わないI/Oピンの処理
      http://www.picfun.com/lowpower/lowpower07.html
      【I/Oポート】 推奨されている以外の方法で、未使用端子処理をしてはいけないのか。
      http://japan.renesas.com/support/faqs/faq_results/Q105101-Q105200/740_105179_jp.jsp
      低消費電力マイコン 応用回路の作り方
      http://toragi.cqpub.co.jp/Portals/0/backnumber/2008/06/p113-114.pdf

      macsbug

      10月 14, 2015 at 6:51 am

      • 素晴らしい解説をありがとうございます。参考文献がとても役に立ちます。

        >LEDをプルアップしてESPに接続した場合は、出力を”1″にする必要があります。
        この部分がよく分かりません。GPIO端子をプルアップしてあるところにLEDを接続していたとしたら、1にしたら、LEDに電流が流れてしまいますよね?
        やはり、ここでも0を出力しておく必要があるのではと思いますが、どうなんでしょうか?

        infomac

        10月 14, 2015 at 9:06 am

      • 説明が舌足らずで申し訳ない。LEDの駆動は2つの方法があります。
        以下の配線で考えています。 ”LEDをプルアップして” は、1.の配線の事を言います。
        .
        1. +3V—-330Ω—LED—GPIO(1/0)
         GPIO=LO(0)で、LED=ON。
         GPIO=HI (1)で、LED=OFF。
        .
        2. GPIO(1/0)–330Ω—-LED—GND
         GPIO=LO(0)で、LED=OFF。
         GPIO=HI (1)で、LED=ON。
        .
        他にもいろいろな接続方法があると思います。
        接続方法によって、コントロールの仕方が変わってきますね

        macsbug

        10月 14, 2015 at 10:28 am


コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

%d人のブロガーが「いいね」をつけました。