Demo program for BME280, ESP8266 and IFTTT service

Dependencies:   BME280 ESP8266Interface IFTTT mbed

/media/uploads/MACRUM/ifttt_ios.jpg

これは?

温湿度・気圧センサーで測定した値をスマホなどに通知するデモです。

使用したコンポーネントやサービス

NXP製のLPC824が搭載された mbed 対応ボード。DIP 形状なので、ブレッドボードと共に使用することが出来ます。マイコンへのプログラミング、シリアル入出力、電源供給等は一本のUSBケーブルで行います。

Bosch製の温湿度気圧センサーを使用したモジュール。気温(℃)、湿度(%)、気圧(hPa)データを出得することが出来ます。mbed とは I2C で接続します。

マイコンとシリアル接続で使用する低価格な WiFi モジュールです。WiFiアクセスポイントは、モバイル無線ルータ等の機器も使用可能です。

複数のWebサービスを関連付けて使うことが出来るサービスです。mbed から Maker Channel を使用してデータのポストを行うことが出来ます。デバイスのへの通知は、IF Notifications を使用します。

部品の接続

/media/uploads/MACRUM/bread_board.jpg

ブレッドボードなどを使用して、部品を接続します。以下の情報を参考にして下さい。

mbed LPC824 pinBME280 module pinESP-WROOM-02 (simple) module pin
26 (GND)1, 5 (SDO, GND)1 (GND)
13 (3V3 OUT)4, 6, 7 (CSB, Vcore, Vio)4, 8 (EN, 3V3)
dp4 (P0_11)3 (SDI)
dp5 (P0_10)2 (SCK)
dp7 (P0_27)5 (RST)
dp8 (P0_26)6 (TXD)
dp9 (P0_25)7 (RXD)

※ ESP-WROOM-02 の 2 (IO0), 3 (IO2) は、オープン。
※ dp4 と dp5 は、1kΩ程度の抵抗でプルアップする。
※ プッシュスイッチを dp15 に接続する。

セットアップ

mbed 側のコード

以下の部分をご自分の環境に合わせて書き換えて使用して下さい。

#define IFTTT_SECRET_KEY   "YOUR_SECRET_KEY_OF_THE_MAKER_CHANNEL" // https://ifttt.com/maker
#define WIFI_SSID          "SSID"
#define WIFI_PASSWORD      "PASSWORD"

IFTTTの設定(登録とレシピの作成)

IFTTTに関しては、こちらの情報が参考になります。

http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/
http://mag.switch-science.com/2015/06/26/ifttt-maker-channel-mbed-raspberrypi-intel-edison/

IFTTTのアカウントを作成して、Maker Channel を登録します。"Your secret key is:" で表示されている文字列を、mbed プログラム側の "YOUR_SECRET_KEY_OF_THE_MAKER_CHANNEL" の部分に置き換えます。

  • Trigger : Event Name の例
    BME280_iOS
  • Action : Notification の例
    気温 {{Value1}} ℃, 湿度 {{Value2}} %, 気圧 {{Value3}} hPa

Information

最近、iOS notification と Android notification が統合され、IF notification になってしまったので iOS と Android 端末に通知を別々に送ることが出来なくなってしまいました。サンプルコードでは通知を分けていますが、実際には複数の端末で同時に通知が行われます。

トラブルシューティング

  • WiFiアクセスポイントに接続されない

WiFiのアクセスポイントに接続されない場合は、デバッグログを確認して下さい。私の環境では、何故か iPhone のテザリング(インターネット共有)では動作しませんでした。

  • 端末側に通知されない

IFTTT アプリが正しくインストールされているか確認して下さい。また、IFTTT のレシピが正しく設定されているか確認して下さい。デバッグログでエラーが発生していないか確認して下さい。

Revision:
0:d4f636717e56
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main.cpp	Thu Aug 27 01:26:29 2015 +0000
@@ -0,0 +1,83 @@
+/*
+ * PackageLicenseDeclared: Apache-2.0
+ * Copyright (c) Toyomasa Watarai
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#include "mbed.h"
+#include "ESP8266Interface.h"
+#include "TCPSocketConnection.h"
+#include "ifttt.h"
+#include "BME280.h"
+
+#define IFTTT_SECRET_KEY   "YOUR_SECRET_KEY_OF_THE_MAKER_CHANNEL" // https://ifttt.com/maker
+#define WIFI_SSID          "SSID"
+#define WIFI_PASSWORD      "PASSWORD"
+
+ESP8266Interface wifi(dp9, dp8, dp7, WIFI_SSID, WIFI_PASSWORD); // TX, RX, Reset, SSID, Password
+Serial pc(USBTX, USBRX);
+BME280 sensor(I2C_SDA, I2C_SCL);
+InterruptIn btn1(dp16);
+InterruptIn btn2(dp15);
+
+static int has_event = 0;
+
+void btn1_pressed()
+{
+    has_event = 1;
+}
+
+void btn2_pressed()
+{
+    has_event = 2;
+}
+
+int main()
+{
+    btn1.mode(PullUp);
+    btn2.mode(PullUp);
+    btn1.fall(&btn1_pressed);
+    btn2.fall(&btn2_pressed);
+
+    wifi.init();
+    wifi.connect(); //Use DHCP
+    pc.printf("\nIP Address is %s\n", wifi.getIPAddress());
+    TCPSocketConnection socket;
+
+    while(1) {
+        char v1[8], v2[8], v3[8];
+        float f1, f2, f3;
+        f1 = sensor.getTemperature();
+        f2 = sensor.getHumidity();
+        f3 = sensor.getPressure();
+        sprintf(v1, "%2.2f", f1);
+        sprintf(v2, "%2.2f", f2);
+        sprintf(v3, "%4.2f", f3);
+        pc.printf("%2.2f degC, %2.2f %%, %04.2f hPa, \n", f1, f2, f3);
+
+        if (has_event == 1) {
+            IFTTT ifttt("BME280_iOS", IFTTT_SECRET_KEY, &socket);
+            ifttt.addIngredients(v1, v2, v3);
+            ifttt.trigger(IFTTT_POST);
+            has_event = 0;
+        }
+        if (has_event == 2) {
+            IFTTT ifttt("BME280_Android", IFTTT_SECRET_KEY, &socket);
+            ifttt.addIngredients(v1, v2, v3);
+            ifttt.trigger(IFTTT_POST);
+            has_event = 0;
+        }
+        wait(1);
+    }
+}