IToTの覚え書き

マイクロビット、アルドゥイーノ、ラズベリーパイなどで楽しい道具を作る趣味のサイトです。 基本的に自分用の覚え書きです。

カテゴリ: アルドゥイーノ

※この記事の内容は少し古くなっています。最新版はこちらです。

Arduino UNO互換のD1ボードの最大の違いはWiFi機能が搭載されていることです。
WiFi機能は IoT(Internet of Things) には必要な機能です。
IoTの中心となるGoogle HomeやAmazon Alexaなどのスマートスピーカーとの連動をする準備をまとめます。

1.D1ボードを買います。
 Arduino UNO R3互換、ESP8266搭載のWiFi 開発ボード、WeMos D1を入手します。
アマゾンで買えます。明日着くのがありがたい。数日待てるならもう少し安く買えます

2.USBドライバをインストールします。
 D1ボードのUSBドライバをダウンロードしてインストールします。

3.Arduino IDEをインストールします。
 ソフト開発環境(IDE)はArduinoのが使える点が有り難い。
Arduino 1.6.5 WIndows installer をダウンロードしてインストールします。
(esp8266-google-home-notifier 1.0.6はこれ以降のバージョンではコンパイルエラーをおこします)

4.Arduino IDEを設定します。
 1)Arduino IDEを起動して、
ファイル>環境設定>Additional Board Manager URLs で、
http://arduino.esp8266.com/stable/package_esp8266com_index.json と入れてOKをクリックします。
 2)ツール>ボード>Boards manager...で空欄に esp8266 と入れて、
esp8266 by ESP8266 communityのバージョン2.4.1(または2.4.2でも可)をInstall します。
(esp8266-google-home-notifier 1.0.6はこれ以降のバージョンではコンパイルエラーをおこします)
 3)ツールからボード設定します。
ボード>WeMos D1 R1(またはLOLIN(Wemos) D1 R2 & miniでも可)
Flash Size>4M(3M SPIFFS)
CPU Frequency>80MHz
Upload Speed>115200
ポート>COM3(←実際にD1ボードが刺さっているCOMポート)
書込装置>Arduino as ISP

5.スマートスピーカーと連携します。
 1)Google home miniなどGoogle homeユーザは、
スケッチ>Include Library>Manage Libraries...で空欄にgoogleと入れて、
esp8266-google-home-notifier 1.0.6 と esp8266-google-home-tts 1.0.7 を Install します。
(これでD1ボードから自由にGoogle homeをしゃべらせることができます)
 2)Echo DotなどAmazon Alexaユーザは、
https://github.com/witnessmenow/esp8266-alexa-wemo-emulator
サイトのClone or Downloadボタン>Download ZIPクリックでダウンロードします。
スケッチ>Include Library>Add ZIP Libraries...>esp8266-alexa-wemo-emulator-master.zipを選択します。
(これでD1ボードからIFTTTを介さなくても、室内の電源のON/OFFができます)

6.IFTTT(イフト)と連携します。
 1)IoTにはIFTTTが必須ではないでしょうか?例えば室外からのスマホでの遠隔操作などにWebHooks機能をつかいます。まだでしたらIFTTTの登録をおすすめします。
 2)D1ボードとIFTTTとの連動はESP8266IFTTTを使います。
サイトのClone or Downloadボタン>Download ZIPクリックでダウンロードします。
スケッチ>Include Library>Add ZIP Libraries...>ESP8266IFTTT-master.zipを選択します。

///////////////////////////// ESP8266IFTTTスケッチ例 /////////////////////////////////
//スケッチの冒頭に一行入れます。小文字のESP8266Ifttt.hだとコンパイルできません。
#include <ESP8266IFTTT.h>

/*IFTTT_WEBHOOK_NAMEのところにIFTTT Webhook's nameを、IFTTT_KEYに IFTTT Webhook api keyを入れます。
IFTTT Webhook api keyはIFTTT>My Applets>Web Hooks>Web Hooksのロゴマーク>Documentation、またはhttps://ifttt.com/maker_webhooks>Documentationで出てきます。*/

//もしトリガーだけなら・・・
IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY);

//もしvalueがあれば・・・(但しvalueは文字列に限ります。"~~"でくくってください)
IFTTT.trigger(IFTTT_WEBHOOK_NAME, IFTTT_KEY, value1, value2, value3);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
これで準備完了です。
あとはファイル>スケッチの例>からいろいろ試して見るといいでしょう。
スケッチのコンパイルおよびボードへの転送はメニューバー下の→(右矢印)ボタンでできます。

これでできることは、
1.Google homeやAlexaから、IFTTTを使って家の電気をつけたり消したりできます。
(赤外線を使った家電製品もコントロールできます。家の外からスマホを使ってもできます)
2.Alexaからは、IFTTTを使わずesp8266AlexaWemoEmulaterで、家の電気をつけたり消したりできます。
3.Google homeでesp8266-google-home-notifierを使って、好きな言葉をしゃべらせることができます。
4.Google home(や多分Alexaも)から、IFTTTを使ってGoogle Spredsheetに各種データを保存できます。

【スケッチ作成上の注意】
PinMODEはプリント基板の表面の表示ではなく、裏側の表示に従ってください。
デジタル I/Oピンは11個あり、すべて3.3Vです。
D0以外のすべての IOピンは interrupt/pwm/I2C/one-wire機能があります。
アナログ入力ピンは1つで最大3.2Vです。
内蔵LEDは、GPIO2です。

ガスセンサーに1602LCDモニターを付けるところから始めた。
1602LCDは1個200円くらいで売っていて安いが、多くのピンを使ってしまう。D1ボードはArduino互換だけれどWiFiがある分、使えるピン数が少ないのにもったいない。これからはI2C付きの1602LCDを使おう。値段は2倍するがピン数は半分節約できる。
次にアナログガスセンサーを取り付けた。ガス値の測定を始め、モニターに表示し始めた。
・・・とここまでは良かったが、Arduino Unoとちがい、D1ボードにはアナログピンが1個しかない。
今回は2個のガスセンサーを使う予定だったのに・・・

1つのアナログピンで2つのセンサーを使う方法はないか?
デジタル出力ピンから5V電源を取ればセンサーそのものの電源をON/OFFして別々に計れるのではないか?
電源を入れていない状態ではガスセンサー値は1だった。いける!
そう思ってやってみたが上手くいかなかった。
電流計で計ってみると電源を入れてた状態ではガスセンサーには100mA流れていたので、20mAが限界のデジタルピンでは無理らしい。←違いました。D1ボードはデジタルピンの電圧3Vなので5Vのガスセンサーはだめなのでした。
こんなところでリレーを使うわけにもいかない。仕方がないのでアマゾンでMOSFETを注文した。2~3日で来るらしいが、今日はここまで。
ついでにI2C付きの1602LCDとI2Cだけのと注文した。

D1ボードは安くて面白いのだけれど、アナログ1個だったり、デジタル3Vだったり、本格的に使おうとするといろいろ使えない。初めからUNOにWiFi付けた方が早かったかも。


//////////////////////////////////////////////////途中のスケッチ///////////////////////////////////////////////

#include <LiquidCrystal.h>

const int rs = 14, en = 12, d4 = 5, d5 = 16, d6 = 1, d7 =3;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

void setup() {

//テスト出力で4番のMOSFETをオンに
pinMode(4, OUTPUT);
digitalWrite(4, HIGH);

lcd.begin(16, 2);

//センサー加温
for (int t = 9; t > 0; t--) {
lcd.begin(16, 2);
lcd.print("wait ");
lcd.print(t);
lcd.print("sec");
delay(1000);
}

delay(3000);

int val;
val=analogRead(0);
lcd.begin(16, 2);
lcd.print("H2:");
lcd.print(val);


delay(3000);
lcd.begin(16, 2);
}

void loop() {

}

////////////////////////////////////////////////////////////////////////////////////////////////////////

友人の依頼をうけて試薬を飲んだ後、30分おきに2時間、水素とメタンの値を計る装置を作ることになりました。
仕様を考えたいと思います。

最初、UNOにクロックを付けた上で、マイクロSDカードに日付、時間とデータを書き込むことを考えましたが、それに代わるもっといい方法を思いつきました。

D1ボードを使い、グーグルスプレッドシートに2つの計測値を行で追加していきます。グーグルスプレッドシートならクロックを設置しなくても日付と時間は自動的に追加されます。
トリガーはD1カードからのウェブリクエスト、アクションはグーグルスプレッドシートでIFTTTを設定すれば、あとはGASなど面倒な設定は必要ありません。

30分ごとの5分前にグーグルホームに予告させます。時間計測はボード内部の時計でやろうと思います。
"すべての計測は5回です。" ”あと5分で第~回目の計測をします。” "~回目を計測します。大きく息を吸って、ゆっくり息を吹きかけてください。" ”ごくろうさまでした。これで終了です。” などです。
これはesp8266-google-home-notifierを使ってD1ボードがグーグルホームにしゃべらせます。

ガスセンサーはセンサーの電源を入れて10秒後に10秒間息を吹きかけてもらい、5秒後の値をデータとして取るようにします。計測後はいったんセンサーの電源を切るようにしておきます。

きちんと作動しているか心配なので一応モニターはつけておきます。
仕様が変わる可能性が高いのでハンダ付けは極力避け、ワイヤーでつなぎます。
箱はダンボールにカッターやドリルで穴を開けて、ボード類はタイラップで止めます。
ここら辺は仕様が固まったらちゃんとしようと思います。

D1ボード600円、グーグルホームミニ3000円、2つのガスセンサー700円、LCDモニタ300円、AC電源400円、ダンボールで総費用5000円くらいです。

D1ボードからグーグルスプレッドシートに書き込むテストに成功した。

///////////////////////////////////////////////////////////
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <ESP8266IFTTT.h>

void setup() {

WiFi.mode(WIFI_STA);
WiFi.begin("tgoto's iPhone", "zxhkl***12345");

delay(3000);

IFTTT.trigger("gasdata", "dwFzglPyeOQI9I4FAjo***", "888", "888", "888");
}

void loop() {
}
/////////////////////////////////////////////////////////////////////////

Arduino IDE 1.6.5
ESP8266 2.4.1(追記2.4.2OK)
ESP8266IFTTT

D1ボードはESP8266を搭載しているのでesp8266-google-home-notifierを使ってgoogle homeに何かをしゃべらせることができるはず。
台所にガスセンサーを置いておいて、ガス濃度が高ければ警告を出すとか、いろいろ使えそう。
この時、アルドゥイノIDEは1.6.5、ボードマネージャでESP8266のバージョン2.4.1を使いました。
notifierとttsは最新版を使います。

アルドゥイノIDE>スケッチ>ライブラリをインクルード>ライブラリを管理>空欄に"esp8266-google"をタイプ>esp8266-google-home-notifierをインストール>esp8266-google-ttsをインストール>閉じる


//////////////////////////////////// スケッチ例 ////////////////////////////////

#include <ESP8266WiFi.h>
#include <esp8266-google-home-notifier.h>
#include <google-tts.h>

GoogleHomeNotifier ghn;

void setup() {

WiFi.mode(WIFI_STA);
WiFi.begin("106F3F3C2***", "mh1nr5jpc0***");

while (WiFi.status() != WL_CONNECTED) {
delay(250);
}

ghn.device("リビングルーム", "ja");
ghn.notify("こんにちわ。私はグーグルホームです。");

}

void loop() {

}

////////////////////////////////////////////////////////////////////////////////

参考記事
https://qiita.com/horihiro/items/4ab0edf415916a2cd542
ESP8266 から Google Home に喋らせるライブラリ

↑このページのトップヘ