[[Arduino勉強会]] #contents 2015/11/01からのアクセス回数 &counter; ** IFTTTについて [#jcadb429] Makerが提供するIFTTT(イフトと発音するらしい)サービスを使うと ESP-WROOM-02モジュールからのデータを簡単にサーバに送り、 様々な処理を施すことができます。 詳しくは、スイッチサイエンスさんの [[IFTTTにMaker Channelができました>http://mag.switch-science.com/2015/06/25/ifttt-maker-channel/]] を参照してください。 MakerのIFTTTに登録するとユーザIDにシークレットKEYが割り当てられます。 このKEYとイベントでIFTTTに情報を送ります。 *** iPhoneアプリIF by IFTTT [#pcf63581] iPhoneでMakerのIFTTTで作ったイベントを受け取るには、iPhoneアプリIF by IFTTTをインストールします。 詳しくは以下を参照してください。 - [[IF by IFTTT>https://itunes.apple.com/jp/app/if-by-ifttt/id660944635?mt=8]] *** Maker Channel画面 [#j2407c42] 登録が終わり、http://ifttt.com/makerに行くと以下の様な画面になります。 Reconnect Channelを押すとKeyが再割り当てされますので、注意しましょう。 &ref(th_Maker_Channel.png); *** トリガーイベントの作成 [#c29cfe1e] 新しくイベントを作るには、Receive a web requestをクリックし、 Receive a web requestの「Create a new Recipe」ボタンを押すとレシピの作成画面に移動します。 &ref(CreateRecipe1.png); 「this」をクリックし、Search ChannelsでMakerと入力し、 Makerのアイコンを選択します。 &ref(CreateRecipe2.png); Choose a Trigger画面が表示され、Receive a web requestをクリックします。 以下の様なComplete Trigger Fields画面になりますので、ここでEvent Name を入力します。ここではLM35と入力しました。 &ref(CreateRecipe4.png); 以下の画面でthatを選択します。 &ref(CreateRecipe5.png); Choose Action Channelが表示されるので、iPhoneと入力し、iPhoneのIF Notificationを選択します。 &ref(CreateRecipe6.png); Choose an Action画面がでるので、Send a notificationをクリックします。 Complete Action Fields画面がでるので、Notificationに出すメッセージを入力します。 以下の様にキーワードを{{ }}で括って入力し、Create Actionボタンを押します。 #pre{{ 温度センサLM35からイベント{{EventName}}と値{{Value1}}を受け取りました。 }} &ref(CreateRecipe8.png); 以下の最終確認でますので、Create Recipeボタンをクリックします。 &ref(CreateRecipe9.png); *** レシピの確認 [#kdc505e7] MakerのIFTTTで作ったイベントは、普通のHTTPプロトコルで送ることができるので、 ブラウザーからイベントのテストができます。 先ほど作ったLM35レシピを確認してみましょう。 ここではシークレットキーをSECRET_KEYで説明しますので、適宜置き替えてください。 - イベント名: LM35 - KEY: SECRET_KEY ブラウザーから以下の様に入力します。 #pre{{ http://maker.ifttt.com/trigger/LM35/with/key/SECRET_KEY?value1=21.0 }} iPhoneに以下の様なNotificationが表示されます。 &ref(LM35_Notification.png); *** IFTTTの受け付けるHTTP GET要求 [#m91aace5] MakerのIFTTTサーバは、[[Arduino勉強会/0N-WiFiモジュールその1]]で試したようなGET要求だけではエラーになることが分かりました。 調べたところ、以下の様にHTTPヘッダにHostとAcceptを追加すると上手くいきました。 ((以下はtestイベントで確認)) #pre{{ $ telnet 54.235.148.87 80 GET /trigger/test/with/key/SECRET_KEY HTTP/1.1 Host: maker.ifttt.com Accept: */* }} ** ArduinoからLM35イベントを送る [#jba6cd99] スイッチサイエンスからESP-WROOM-02ピッチ変換済みモジュール《シンプル版》 が届いたので、 これを使って温度センサLM35から取得した温度をIFTTTイベントとして送ってみます。 &ref(ESP_LM35_brd.png); *** ピッチ変換モジュールのハンダ付け [#y892289c] ESP-WROOM-02をピッチ変換モジュールにハンダ付けします。 裏面のジャンパーは、SJ1とSJ2をハンダでショートします。 &ref(esp_1line5a.png); *** ブレッドボードの組み立て [#sf2527ab] ブレッドボードにESP-WROOM-02とArduino Pro Mini(3.3V)とLM35を以下の様に配置します。 抵抗は10KΩを使いました。 &ref(brd.png); *** スケッチ [#bea3aef8] [[Arduino勉強会/0O-WiFiモジュールその2]]で作ったEspClientのatCipSendを 以下の様に修正し、シリアルもSoftwareシリアルでESP-WROOM-02で接続することに しました。この結果シリアルモニタの出力は文字化けしますが、この方が開発が簡単になります。 #pre{{ int EspClient::atCipSend(char *uri, char *host) { sprintf(buf, "GET %s HTTP/1.1\r\nHost: %s\r\nAccept: */*\r\n%s", uri, host, CRLF2); int len = strlen(buf); char tmp[32]; sprintf(tmp, "AT+CIPSEND=%d%s", len, CRLF); // uriを送る atCommand(tmp, 1000); esp.print(buf); // 応答を待つ waitForResponse(); } }} LM35の温度を送るテスト用スケッチは、以下の通りです。 #pre{{ #include "EspClient.h" #include <SoftwareSerial.h> #define ST_SSID "take-iPhone5s" #define ST_PASSWD "jpb67k42hgq5z" #define SERVER_ADDR "54.235.148.87" // maker.ifttt.comのIPアドレス #define SERVER_PORT 80 #define EVENT "LM35" #define SECRET_KEY "ここにSECRET_KEYを入れてください" int sw_pin = 10; int sTx_pin = 12; int sRx_pin = 11; int lm35_pin = A0; int lm35_value; char buf[128]; EspClient esp(sRx_pin, sTx_pin); void setup() { pinMode(sw_pin, INPUT); esp.begin(9600); esp.println("ESP8266IF3tTest"); esp.atCwMode(STATION_MODE); esp.atCwJap(ST_SSID, ST_PASSWD); } void loop() { if (digitalRead(sw_pin) == LOW) { esp.println("SW pressed"); // チャタリング防止 delay(500); lm35_value = analogRead(lm35_pin); // LM35から値を読み取る int temp10 = (int)((lm35_value*3.3)/1023.0*1000); // 温度を0.1度までの整数に変換 sprintf(buf, "temp=%d.%df", temp10/10, temp10%10); esp.println(buf); esp.atCipStart(SERVER_ADDR, SERVER_PORT); sprintf(buf, "/trigger/%s/with/key/%s?value1=%d.%d", EVENT, SECRET_KEY, temp10/10, temp10%10); esp.atCipSend(buf, "maker.ifttt.com"); } } }} *** 動作確認 [#f4bd0420] 起動後に、ボタンを押してイベントをIFTTTサーバに送ります。 シリアルモニタは以下の様に文字化けしますが、イベントはきちんと送られています。 #pre{{ ESP8266IF3tTest AT+CWMODE=1 OK AT+CWJAP="take-iPhone5s","jpb67k42hgq5z" WIFI DISCONNECT WIFDo wait onece WIFI GOT IP OK SW pressed temp=25.4f AT+CIPSTART="TCP","54.235.148.87",80CONNECT OK AT+CIPSEND=112 busy p... OK > GE@½ÑÉ¥½cªz½[½¹©Q]©Íå¥aY©-Ùµ±ý± ±ÕÅëªr¢BBEõ(rjõkÑéj ɹKÑÑѹ½µ5 ÁÑéRzRjÔÔ¨HHTÖ,¤¦L&H¬_]Y®Cá SEND OK }} &ref(IFTTT_Result.png); *** スケッチのダウンロード [#d941e00a] スケッチを以下からダウンロードできます。 - ESPClientスケッチ &ref(EspIFTClient.zip); ** 温度を記録する [#x820b7d5] つぎにGoogleのスプレッドシートに温度とイベントが発生時刻を記録してみましょう。 *** IFTTTの定義 [#n304e620] 以下の様にActionでspreadsheetに行を追加するRecordLM35イベントを作成します。 &ref(th_RecordLM35_Action.png); *** ブラウザーでテスト [#pcce8215] 以下のURLをブラウザー入力します。 #pre{{ http://maker.ifttt.com/trigger/RecordLM35/with/key/<<ここにSECRET_KEYを入れる>>?value1=18.0 }} *** Googleドライブにアクセスすると、IFTTT/Maker/RecordLM35のディレクトリが作られ、 [#lc89040a] IFTTT_MakerRecordLM35スプレッドシートに以下のような記録が作成されます。 &ref(IFTTT_MakerRecordLM35.png); ** コメント [#mfa875ee] #vote(おもしろかった[0],そうでもない[0],わかりずらい[0]) #vote(おもしろかった[1],そうでもない[0],わかりずらい[0]) 皆様のご意見、ご希望をお待ちしております。勉強会で分からなかったこと等、お気軽に問い合わせて下さい。 スパム防止に画像の文字列も入力してください。 #comment_kcaptcha