ESP8266とBME280とIFTTTでIoTボタンをつくった

Amazon Dash Buttonを汎用のIoTボタンとして使っている例がどんどん出てきている中、1週遅れの感じがしますが、ESP8266 + Arduino IDEの組み合わせが劇的に簡単だったので、IFTTTのGoogle Spreadsheet連携を使って、ライフロギング用のIoTボタンを作ってみました。

作ったのが年末休みで、Twitterで#大晦日ハッカソンがナイスタイミングで開催されていたので、投稿してみました。

IoT button using ESP-01 + OLED + BME280 + IFTTT from Takayuki Yuasa on Vimeo.

(上のビデオで、アパートのWiFiのSSIDがでちゃってるのはご愛嬌ということで😛)

[toc]

先行事例

以下の記事を見れば、この記事にかかれていることは既に出ていると思います。この記事は自分の制作記録としてまとめておきます。

Amazon Dash Button

ESP8266+IFTTT連携

ブロックダイアグラム

部品

  • ESP-01 - Aliexpressで2-3ドル(安い、、、)*
    • 日本だとスイッチサイエンスさんでESP-WROOM-02モジュールが864円で入手可能(技適取得済み)。
  • スライドスイッチ  - GPIO0に接続してスケッチ書き込みと実行の選択
    • Sim Lim Towerの入り口1F部分にある時代電子で買いました。1個50セント。
  • 秋月のBME280モジュール - I2Cで接続
  • OLED 128×64ピクセル (SSD1306ドライバを使用したモジュール) - I2Cで接続
    • Adafruitの例
    • Aliexpressの例
  • 電池ボックスからの電源供給用コネクタ
  • 抵抗 4.7kΩ、 220Ω
  • ユニバーサル基板
  • ケース
    • 本当はアクリルプレートで工作できればかっこいいけど、手元にないのとシンガポールで買うと高いので、今回は一時帰国したときに買ってきた金沢うら田のお菓子「愛香菓」(下図)の箱。甘すぎず、品がある感じ。おしゃれなおみやげに最適。

*Aliexpressの場合、一般的に言って、商品が本物かどうかはよくわからないので、購入者のコメントを確認してから買うようにしましょう。でも、1年間電子部品を使ってみた感覚として、Lazadaより全然商品のクオリティは高いと思います(たとえばLazadaでノーブランドの電源タップを買ってはいけません。アース線が途中で切れていたり、適切なはんだ付けがなされていなかったりする製品がとどいて、感電死のリスクがあります)。

ハードウエア

ブレッドボードでざっくり動作確認してから、ユニバーサル基板にはんだ付け。組み上がりは以下のようになりました。ディスプレイの下に4個2×2のピンヘッダがでていて、左から順に以下のような割当になっています。

  1. 電源(3.3V+GND) + ESP Tx/Rx (スケッチの書き込み、シリアルコンソールとして使用)
  2. RST (ここにスイッチを接続して、スイッチが押されるとdeep sleepから復帰)
  3. GPIO 0/2をI2CのSDAとSCLに接続するかどうかを選択
  4. I2Cデバイスの電源供給するかどうかのジャンパ

回路図

秋月のBME280モジュールは1000円以上して他の部品よりも相対的に高価なので、ピンソケットを使って、取り外しできるようにしました。

Arduino IDEからスケッチを書き込むとき

  1. 秋月のFT232RL USBシリアル変換モジュールを利用します。
  2. 書き込み前にSDA/SCLのジャンパを外す(外さなくても書き込めるけど、異なるインタフェースが並列接続されるのは気持ち悪いので)。
  3. スライドスイッチをPRGに設定。
  4. 3.3VとGND、FT232 Tx→ESP-01 Rx、ESP-01 Tx→FT232 Rxを接続して、Arduino IDEから書き込み。

IFTTTの設定

IFTTTのMy Applets→ New appletから作成します。スクリーンショットが多いので、ギャラリー形式で挿入しておきます。基本と同じなので、簡単ですね。

thisをクリック
thisをクリック
makerで検索
makerで検索
Receive a web requestを選択
Receive a web requestを選択
トリガーのイベント名を設定
トリガーのイベント名を設定
thatをクリック
thatをクリック
google driveを選択
google driveを選択
Add row to spreadsheetを選択
Add row to spreadsheetを選択
シートのファイル名、行を追加するときのデータ形式を設定
シートのファイル名、行を追加するときのデータ形式を設定
Google Drive内のフォルダパスを設定してCreate action
Google Drive内のフォルダパスを設定してCreate action

トリガーするときのURLに入れる必要があるkeyは、Maker channelの右上にあるSettingsボタンから確認できます。/use/ABCD-1234-abcdみたいになっている部分の「ABCD-1234-abcd」の部分がキーになります。ソースコードのurlの中のREPLACE_THIS_WITH_KEYをこのキーで置き換えます。EVENT_NAMEのところは、イベント名で置き換えます。

1
2
3
const char* url = "/trigger/EVENT_NAME/with/key/REPLACE_THIS_WITH_KEY";

ソースコード

以下のgistに貼ってあります。

yuasatakayuki/esp01_oled_bme280.cpp

冒頭のWiFiのSSID/パスワード、IFTTTのイベント名とトリガー用URLのところは適宜置き換えてください。

1
2
3
4
const char* ssid = "WIFI_SSID";
const char* password = "WIFIT_PASSWORD";

1
2
3
const char* url = "/trigger/EVENT_NAME/with/key/REPLACE_THIS_WITH_KEY";

使用したArduinoのライブラリ

以下のライブラリを使用しました。Macの場合は、Documents/Arduino/libraries/にライブラリ単位でフォルダ分けして保存し、Arduino IDEを(再)起動すると認識されます。BME280のライブラリはソースコードがページに直接貼り付けられているので、コピーペーストしてBME280というフォルダに保存してからlibrariesに入れました。

  • Adafruit GFX
  • Adafruit SSD1306 (OLED制御用ライブラリ)
  • BME280.h/.c - Arduinoで遊ぶページ - garretlabさん
    • ライセンスは明記されていませんが、「はじめに」のページで"翻訳以外のウェブページの著作権は、私自身に帰属します。とはいえ、常識・良識の範囲での利用については特に権利を主張しません。当然責任もとりません。Arduinoが普及するように使っていただけるとありがたいです。もちろん引用は自由です。"としてくれているので、ありがたく使わせていただきます。
    • AdafruitのBME280のライブラリも試したのですが、なぜか一発で動かなかったので、デバッグの時間を節約するためにこちらを利用しました(こちらはアドレス設定したら一発で動作しました)。

消費電力

動作状態では3Vで80mA。IFTTTへのトリガーを終えると10秒後にOLEDの表示を消してESP8266がdeep sleepに入ると、6mAになります。ESP-01上のパイロットランプ(赤色LED)は今回は取り外していないので、deep sleepのときの消費電流はこのLEDが支配的になります。LEDを取り外すと、ESP-01単体では78uAにできるようです(Hackadayからリンクされている”Low Power ESP8266 – Sleeping at 78 micro Amps“の記事)。6mAでも容量2800mAhのeneloop proで19日くらい使えることになるので、最初はパイロットランプを外さずに使ってみます(やっぱり、動いているかすぐ確認できて便利なので)。

それで、シンガポールではESP-01をつかっていいのか

日本ではESP-01モジュールはモジュールとして技適の認証が無いので日本では使えないことになっているようです(ESP-WROOM2はモジュールとして技適をとっているのでOK。Arduino IDEを使っている分にはプログラムを書き換えてもOK - スイッチサイエンスさんの記事)。シンガポールではどうなのか気になったのでしらべました(現実的な問題がないところで他人の足を引っ張るのが趣味な人たちにつつかれて時間をムダにしないように😃)。結論からいうと、「(Aliexpressなど)外国から購入した」機器で、「個人的に使うだけで、販売したり商用化しない」場合は使っても問題なさそうです。

調べた資料

シンガポールでは通信機器のレギュレーションはメディアや通信に関する規制当局であるIMDA (2016年4月にInfocomm Development AuthorityとMedia Development Authorityが合併して形成)が担っています。

Equipment Registration Frameworkのページの下の方の資料一覧にでている”Q&A on Requirements for Telecommunication Equipment Registration“というPDFの中で、13ページ目に”Telecommunication Equipment for Personal Use “として以下のような個人利用の通信機器に関する質問がでています。

Q40. I have bought a piece of telecom equipment from overseas and intend to use it in Singapore. Do I need to register the equipment with IMDA? No, if you bring in telecom equipment intended for personal use and not for sale or hire in the local market, you do not need to register with IMDA nor seek the approval of IMDA. However, you have to ensure that the equipment complies with the stipulated IMDA standards and will not cause interference and disruption to the public telecom network.

この回答によれば、「外国から購入した」機器で「個人的に使うだけで、販売したり商用化しない」場合は、IMDAに機器登録をする必要はないとのこと(そもそも機器の登録は個人では出来ない)。その機器がIMDA標準に従っていて、他の通信ネットワークに干渉しないことを確実にすること、となっています。他にもQ41〜Q45が関連質問です。

IMDA標準に従っていることを確認することが重要なのですが、”Radio communication standards“からリンクされている”Technical Specification - Short Range Device“というPDFの12ページにWiFi標準規格の概要が列挙されていて、2.4GHz帯の帯域とEIRPでの出力が出ています。

Espressifのデータシートによると、周波数と出力は以下のようになっているので、20dBmでも100mWなので、25番のWireless LANの出力の制限内です。

Equipmentの登録情報はEquipment Searchのページから検索することができます。ESP8266に関しては、Model Nameのところに「ESP8266」と入れてSearchを入れると、ESP8266MODの登録がでてきます。

ちなみに、IMDAにかぎらずシンガポールの公官庁はどこも非常によくディレクションされており、利用者中心の考え方が徹底されています(働いている人たちも超優秀でモチベーションが高い。質問メールにも定型文ではない、個別の回答をすぐ返信してくれます)。レギュレーション関連のトップページであるRegulations, licensing, consultationのページには以下のように宣言されていて、センスの良さを感じます。日本も参考にしたいですね。

As the regulator of the infocomm and media sectors in Singapore, IMDA aims to create a conducive and vibrant environment that enables the growth of businesses while protecting consumers’ interests and providing them with access to more innovative services and media choices. (シンガポールにおける情報通信とメディアセクターの規制当局として、IMDAは消費者の利益を守りつつより革新的なサービスやメディアへのアクセスを提供しながら、関連するビジネスを成長させていけるような活発な環境を創造することを目指しています。)