IoTlt
OriginalIoTLTDay 6

ありあわせのものでIoTぽいことしてみる

はじめまして。Qiita初投稿します!
IoTLT Advent Calendar 2017(neo)の6日目を担当させて頂きます!よろしくお願いします。

このアドベントカレンダー書くと決まってから何するか考えていたものの、気付いたら3日前でした。。。なので、何か買いに行く余裕もなかったため、家にあったものだけでIoTぽいことしよう!という内容になります。(初心者向けです!)

筆者のスペック

  • Lチカはしたことある
  • でも、よく考えたら実際にネット介して何かするようなことは未経験
  • C系言語は好き
  • MacBook AirのOSを上げていなさすぎて諸々の弊害がある
  • 3日前という現実

目標

IoTはInternet of Thingsなので、ちゃんと"ネットを介して"何かすることを今回の目標にします。

ということで、家にあるマイコンを使ってスマホに何か通知しようと思います!

用意したもの

  • 以前IoTLTで頂いたGR-SAKURA FULL
  • 家にあったLANケーブル

はい。 WiFiモジュールなんて高尚なものは家にはありませんでしたので、有線を使います。
Arduino uno等も持っているのですが、GR-SAKURA FULLは最初からLANコネクタがついているので、これにしました。また、Webコンパイラが使えるので何か新規にインストールする必要もなく、非常に便利です。がじぇるねさんありがとうございます。

いざ!!

テンプレートを用意して下さっているのでこちらを使用しました。
V2.20の方はArduinoのライブラリを使用できるようになっているので、情報も多く使いやすそうな印象を受けました。
プロジェクト名を入力してプロジェクトを作成します。

スクリーンショット 2017-12-06 1.17.31.png

今回は難しいことは考えず、gr_sketch.cppファイルのみ変更していきます。

Ethernet接続する

まず、Ethernet接続できることをIPアドレスを表示することで確認したいと思います。
macアドレスは任意のようです。

gr_sketch.cpp
#include <Ethernet.h>

byte mac[] = {  
  0x00, 0xAA, 0xBB, 0xCD, 0xDE, 0x12 };
// Initialize the Ethernet client library
// with the IP address and port of the server 
// that you want to connect to (port 80 is default for HTTP):
EthernetClient client;

setup関数内でDHCPで接続をします。
ちなみにsetup関数は初回に一度だけ呼ばれます。
これでシリアル接続するとIPアドレスが表示されるようになります。
(macからだとUSBでマイコンと接続してターミナルで $ ls /dev/tty.* として接続中のシリアルデバイスを確認。 $ screen デバイス名 ボーレート(今回は9600) としたら接続できました。Serial.println()の内容が表示されます。詳細は割愛します。)

gr_sketch.cpp
void setup()
{
    ...

    Serial.begin(9600);

    while(!Serial.available()); // wait to press key.
    Serial.read(); 

    // start the Ethernet connection:
    if (Ethernet.begin(mac) == 0) {
        Serial.println("Failed to configure Ethernet using DHCP");
        while(1);
    }

    // print your local IP address:
    Serial.println(Ethernet.localIP());
}

Ethernet接続できることを確認できたら、while(!Serial.available()); はコメントアウトしておきます。

IFTTTで、通知の準備をする

LTとかでも使っている方がよくいた気がしたので、何年も前に登録だけしてあったIFTTTを初めて使ってみることにしました。一番よく使うアプリなので、LINEに通知してみます。

IFTTTのサイトでApletを作成します。
thisのところにwebhooksを選択して任意のイベント名を指定し、トリガーを作成します。
スクリーンショット 2017-12-06 1.57.06.png

thatの方はLINEを選択して送信するメッセージを入力します。
value1〜3を使用して内容を可変にすることも可能なようです。

スクリーンショット 2017-12-06 2.00.57.png

これで、設定は終わりです。LINEに通知するようになります。
自分のキーはWebhooksのDocumentationのページにいくと書いてあるので、確認しておく必要があります。

ソースを書く

GR-SAKURAにもともとついている青いボタンを押下したら、LINEに通知するようにします。
WebhooksのところのDocumentationを参考にして、POSTまたはGETのリクエストを投げます。

gr_sketch.cpp
void loop()
{
    ...
    if (digitalRead(PIN_SW) == LOW)
    {
        char json[] = "{\"value1\":\"Hello World!!\",\"value2\":\"ボタン押したよ!!\"}";
        char size[2];

        // if you get a connection, report back via serial:
        if ( client.connect(host, 80) )
        {
            Serial.println("connected to IFTTT server"); // for debug

            // Make a HTTP request:
            sprintf(s, "POST /trigger/(イベント名)/with/key/(キー) HTTP/1.1");
            Serial.println(s); // for debug

            client.println(s);
            client.println("Host: maker.ifttt.com");
            client.println("Cache-Control: no-cache");
            client.println("Content-Type: application/JSON");
            client.print("Content-Length: ");
            sprintf(size, "%d", strlen(json));
            client.println(size);
            client.println();
            client.println(json);
            delay(500);
        }
    }
    ...
}

確認!!

image.png

はい、こんな感じでLINEに通知が来ることが確認できました!わーい!

まとめ

ということで、初めてちゃんとIoTぽいことをしてみました。
GR-SAKURA FULLにLANコネクタついていてよかったです。。。実はこの後、センサーを使ってトリガーにしてみたりもしました!楽しかったので実用的なものとかおうちハック的なこともやってみたいと思いました。(本当はアプリ作って何かするようなことがしたかったので、まずはOSのアップグレードから始めたいと思います。)