arrow-right hamburger logo-mark social-facebook social-github social-twitter
2018.11.01

【ハンズオン資料】NefryBTでハジメテノIoT開発やってみよう!

ちゃんとく

Nefry BT
    このエントリーをはてなブックマークに追加  

この記事は11/1のハジメテノIoTハンズオン向け資料です。記事を読んで試せる内容になっているので、終了後や参加されていない方もぜひ試してみてください!

■ハンズオンの進行について

ハンズオンはこのページに沿って進めます。進められる方は、どんどん進めていきましょう!リンクは別タブや別ウィンドウで開くのがオススメです。

■Nefry BTドキュメントについて

Nefry BTドキュメント: NefryBTの使い方に関するドキュメントページです。基本の動作や、調べ方、質問できる場所なども案内しています。

今回やってみること

湿度が高くなると自分のLINEに通知がくる仕組みを、Nefry BT、温湿度センサ、IFTTTというWebサービスを使って作ってみます。室内の状態が異常になったときに通知する仕組みのようなイメージです。

architecture

用意するもの

■Nefry BT&ディスプレイ

Nefry BTは「ESP-WROOM-32」というWi-Fi・BLE通信モジュールを搭載した、Arduinoと同じように開発できるマイコンボードです。

nefry

Groveという刺すだけで配線できるモジュール対応のコネクタを搭載していて、ハードウェアをあまり意識せずに開発できます。


■Grove 温湿度センサ

刺すだけで配線できるGroveシリーズの、温度と湿度を取得できるセンサです。

motion_sensor

安価で扱いやすいセンサですが、高い精度や細かいデータの取得には向きません。プロトタイプ向きなセンサです。


■Arduino IDE

開発(プログラムの書き込み)にはArduino IDEというフリーソフトウェアを利用します。

こちらの手順を見ながらご自身のPCにインストールしてください。


■Arduino IDE

開発(プログラムの書き込み)にはArduino IDEというフリーソフトウェアを利用します。

まだインストールしていない方は、こちらの手順を見ながら進めてください。


■IFTTTアカウント

IFTTT(いふと)は、モノとWebやWebサービス同士を簡単に連携できるサービスです。

ifttt

他の人が作ったアプレット(連携レシピ)を使ったり、自分で新たに作成したりできます。Nefry BTでは、簡単にIFTTT連携できるツールを用意しています。

ページトップの「Sign Up」からアカウントをご作成ください。

事前準備(セットアップ)

Nefry BTのWi-Fi設定

まずはNefry BTがインターネットにつながるよう、会場のWi-Fi情報をNefry BTに教えてあげます。スマホやPCを使う時と同じですね。

Nefry BTとPCを直接通信させ(アドホックモード)、立ち上がるNefryポータル(設定ウィンドウ)からSSIDとパスワードを入力する手順です。

■Nefry BTが接続できるWi-Fi

Nefry BTが接続できるWi-Fiは2.5GHz帯のWi-Fiのみです。新しい5GHz帯は利用できません(ほとんどのIoT機器が同様)。接続後にブラウザで再度ログインの必要なWi-Fiも、利用できません。


■ディスプレイを取り付け電源を入れる

Nefry BTにディスプレイを取り付けます。4本の足をNefryの4本のピンソケットにさします。

このような形でささります。

Nefry BTに、PCやモバイルバッテリーなどから給電を開始します。ディスプレイに表示荒れる「NefryBT-XXXX」という部分が、ご自身のNefry BTが出す無線の名称になります。

nefry


■PCをNefry BTの無線に接続する

PCのWi-Fi接続設定から、ディスプレイに表示されている「NefryBT-XXXX」という無線を選び接続します。 セットアップ中PCはインターネットに繋がらなくなるので、この説明ページは開いたまま進めるのがオススメです。

ちなみにSSIDは自由に変更することができます。(参照:SSIDを変更する


■Nefryポータルで設定する

Nefry BTのWi-Fiに接続すると、自動でNefryポータルのウィンドウが立ち上がります(立ち上がらない場合はブラウザでhttp://192.168.4.1 にアクセスします)。

「お探しのページは…」と表示された場合は、「Move to main page」を洗濯してください。「Setup WiFi」をクリックし、利用するWi-FiのSSIDとパスワードを入力して「Save」で保存します。 保存すると、Nefry BTは自動で再起動します。緑の点滅が終了し再起動が完了したら、Wi-Fiのセットアップは完了です。

一度設定したら、同じWi-Fiを使っている間は起動するだけで接続されます。Wi-Fi情報は5つまで保存でき、消去もできます。

開発環境(Arduino IDE)にボードを追加

Nefty BTの開発にはフリーソフトウェアのArduino IDEを利用します。インストールがまだの方は「Arduino IDEのインストール」を見ながら進めてください。

Arduino IDEには、Nefry BTのボード情報の追加が必要です。「環境構築(Arduino IDE)」を見ながら追加してください。

はじめてのプログラムを書き込んでみる

まずはNefry BTに簡単なプログラムを書き込んでみましょう。Nefry BTは、最初から下記の機能が搭載されています。

Nefry BTを起動

一度Nefry BTを電源から外し、ディスプレイを外します(内蔵LEDが隠れてしまうため)。マイコンボードに配線する時は、常に電源OFFの状態で操作してください。

off
マイコンボードは基本的に、給電によって電源のON/OFFを制御します。再起動時には最後に書き込んだプログラムが実行されます。プログラムは書き込むたびに上書きされます。

再度給電します。

on

緑色のLEDが点滅したあと、ランダムに光ります。

まずはLチカ

最初のプログラムとして、Lチカをやってみます。LEDチカチカの略で、入門向けのプログラムとして汎用的に紹介されています。

簡単なプログラムを書き込むことで、ボードが正常に動くか試す際に利用することも多いです。


■Arduino IDEでプログラムを書く

Arduino IDEを立ち上げ、メニューからファイル > 新規ファイルを選択します。下記のような画面が開きます。

ide

エディタ部分に、下記のプログラムをコピーして貼り付けましょう(行番号までコピーしてしまわないようご注意ください)。

#include <Nefry.h>

void setup() {
}

void loop() {
  Nefry.setLed(0, 0, 255); //色合いをRGBで指定
  Nefry.ndelay(1000); //1秒待つ
  Nefry.setLed(0, 0, 0); //LEDをオフにする
  Nefry.ndelay(1000); //1秒待つ
}

下記でプログラムの内容を解説しています。


■ボードを選択

メニューのツール > ボード > Nefry BT R2 / R3を選択します。この際、ボードは使っているリビジョンに合わせて選択してください。(参照:リビジョンを確認

例えば、使っている基板がR3の場合はツール > ボード > Nefry BT R2 / R3を選択します(ハンズオンでは全てR3を使用しています)。

select_board
select_board2


■シリアルポートを選択

Nefry BTをPCのUSBポートにさします。プログラムはこのポートを介して、シリアル通信でNefry BTに流し込まれます。

Macの場合は、メニューのツール > シリアルポート > /dev/cu.usbserial-xxxxxxを選択します。環境によっては/dev/tty.usbserial-xxxxxxなどの場合もあります。

select_port

Windowsの場合は、ツール > シリアルポート > /dev/COM-XXを選択します。

※Nefry BTを抜き差しすると、シリアルポートの選択が解除される場合があります。適宜確認しましょう。

■シリアルポートが選択できない方

USBドライバのインストールが必要な場合があります。「Arduino IDEでシリアルポートが見つからない・書き込めない」を参照して、USBを認識させるためのドライバをインストールしてください。また、Arduino IDEの再起動やUSBの抜き差しで認識する場合があります。

■PCにUSB接続できない方

セキュリティやポートの問題でPCにUSB接続できない方は、Wi-Fi経由でプログラムのアップロードが可能です。その場合、下記の書き込み手順は不要です。給電はコンセントやモバイルバッテリーから直接行ってください。


■名前をつけて保存

ファイル>名前をつけて保存を選択して保存します。「NefryLedBlink」など、後からみてわかりやすい名前がオススメです。


■プログラムを書き込む

「✔️」を押してプログラムをコンパイルします。コンパイルとは、プログラムを機械が理解できる(人間には読みづらい)形式に変換することです。

compile
この手順は省略しても大丈夫ですが、シンタックス(文法)チェックをしてくれるので実施するのがオススメです。

左上の「→」ボタンを押してNefry BTにプログラムを書き込みます。

write

ESP32モジュールの特性上、書き込みに1分ほどかかります。エラーが出てしまうときは、「コンパイルは成功するのに書き込みが失敗する」を参照してください。

3分以上かかる場合、Nefry BTの不良の可能性があるので申し出てください。


■動作を確認

起動したら、「青いLEDが1秒ごとに光る」ことを確認しましょう。

Image from Gyazo

LEDがチカチカしました!


■プログラムの解説

プログラムの要所を説明していきます。

#include <Nefry.h>

冒頭でライブラリを読み込んでいます。Nefry BTのライブラリでできることは「Nefryのライブラリ」を参照してください。

void setup() {
}

起動時に処理される部分です。今回はなにもしません。

void loop() {
  Nefry.setLed(0, 0, 255); //色合いをRGBで指定
  Nefry.ndelay(1000); //1秒待つ
  Nefry.setLed(0, 0, 0); //LEDをオフにする
  Nefry.ndelay(1000); //1秒待つ
}

起動時に繰り返し実行する部分です。//の後ろには任意のコメントを記入することができます。

Nefry.setLed()という関数で、光らせる色合いをRGBの順で指定します。始めにR=0, G=0, B=255を渡しているので、青く光ります。

続いてNefry.ndelay()という関数で次の処理まで指定した時間待ちます。Arduinoでは時間はミリ秒で指定するので、1000は1秒です。

Nefry.setLed()に0, 0, 0を渡すことで、LEDはオフになります。オンとオフのあと1秒ずつ待つことで、点滅を表現しています。

このように、マイコンボードは①起動時に行う処理②起動中に繰り返される処理をプログラムして扱います。意外と簡単ではないですか……?

スイッチを押したらLチカ

■Arduino IDEでプログラムを書く

同様の手順で新規ファイルを作成し、下記のプログラムをNefry BTに書き込みます。おさらいがてら、やってみましょう。

#include <Nefry.h>

void setup() {
   // スイッチを有効化
   Nefry.enableSW();
}

void loop() {
    // スイッチが押されたら
    if (Nefry.readSW()) {
        Nefry.setLed(255, 0, 0); //色合いをRGBで指定
        Nefry.ndelay(1000); //1秒待つ
    }
    // 青色に戻す
    Nefry.setLed(0, 0, 255);
}

下記でプログラムの内容を解説しています。


■動作を確認

スイッチ(RSTではない方)を押したら、LEDが赤く光ることを確認します。

Image from Gyazo


■プログラムの解説

プログラムの要所を説明します。

void setup() {
   // スイッチを有効化
   Nefry.enableSW();
}

起動時の処理では、Nefry.enableSW()という関数でスイッチを有効化しています。マイコンボードでは、入力・出力に使うピンなどはsetup()関数内で有効化します。

void loop() {
    // スイッチが押されたら
    if (Nefry.readSW()) {
        Nefry.setLed(255, 0, 0);//色合いをRGBで指定
        Nefry.ndelay(1000); //1秒待つ
    }
    // 青色に戻す
    Nefry.setLed(0, 0, 255);
}

if(){}という条件式で、なにか動作させたいときの条件を決めます。Nefry.readSW()でスイッチが押されたことを取得し、スイッチが押されたら{}内を実行します。

{}内ではLEDを赤く光らせ、1秒間待つ処理をしています。1秒後はまたvoid loop()内を実行し、スイッチが押されているかどうか判定します。

スイッチが押されている以外のときは、青色のLEDを光らせます。

オフラインでGroveセンサを試す

次は、配線してセンサのデータを取得してみます。まずはインターネットに繋がらない電子工作、です。

エラーの切り分け(どこでエラーが起こっているか)を特定するために、自分で開発するときもステップバイステップでできているか確認しつつ進めるのがオススメです。

Grove 温湿度センサを接続

Groveは刺すだけで配線できるのでGNDや信号線などの確認は必要ありませんが、デジタル・アナログ・I2Cなどの通信方法はGroveモジュールによって違います。

seeed_wiki

通信方式は温湿度センサの製造元・SeeedStudioのWikiページを見て確認しましょう。

connect

今回は「A0」というソケットに差し込みます。少し硬いですが、カチッと言うまで押し込めます。配線作業は常に電源オフの状態 で行います。

温湿度センサを扱うライブラリを読み込む

温湿度センサを扱うためのライブラリ(※)を追加でダウンロードします。リンク先のページで「Clone or Download」から「Download ZIP」を選択します(2つのページから両方ダウンロードしてください)。

download

Arduino IDEのスケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストールから、ダウンロードされたZIPファイルを2つとも追加して完了です。

library

■ライブラリとは

センサや外部サービスを使うために、あらかじめプログラムを書きパッケージ化したものです。既に誰かが作ってくれているものを取り込んだり、自作したりできます。

プログラムを書き込む

新規ファイルを作成し、下記のプログラムをNefry BTに書き込みます。書き込み手順は、上記の「まずはLチカ」を参照してくださいね。

#include "DHT.h"
#include <Nefry.h>

#define DHTPIN A0
#define DHTTYPE DHT11

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Nefry.println("温度・湿度をチェック");
  dht.begin();
}

void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Nefry.println("読み取りに失敗しました…");
    return;
  }

  if (h > 70) {
    Nefry.println("すっごく湿度が高いよ!");
  }

  if (t > 30) {
    Nefry.println("すっごく部屋が暑いよ!");
  }

  Nefry.print("湿度: ");
  Nefry.print(h);
  Nefry.print(" %\t");
  Nefry.print("温度: ");
  Nefry.print(t);
  Nefry.println(" *C ");
}

動作を確認

メニューのツール>シリアルモニタ を選択して開きます。

serial_monitor

右下のbps設定を「115200bps」に変更します。

bps

2秒ごとに、シリアルモニタに温度と湿度が表示されて行きます。

Image from Gyazo

あまり動きがないですが、息を吹きかけると湿度が上がることを確認できます。湿度や温度が上がるとアラートメッセージが出ることを確認できたでしょうか?


■プログラムの解説

プログラムの要所を解説します。

#include "DHT.h"
#include <Nefry.h>

ライブラリの読み込み部分です。

#define DHTPIN A0
#define DHTTYPE DHT11

#defineで、配線したピンの場所を定義しています。「DHTPIN」という名前の箱に「A0」という値を入れているイメージです。

こうしておくことで、あとでピンの場所を変えても、ここの値だけ変更すればOKになります。DHTTYPEの値はWikiを参考に入れているだけなので、覚えなくて大丈夫です。

void setup()
{
    Nefry.println("温度・湿度をチェック");
    dht.begin();
}

setup関数内ではセンサの読み込みの開始と、シリアルモニタへの表示メッセージを指定しています。

void loop()
{
    delay(2000);

    float h = dht.readHumidity();
    float t = dht.readTemperature();

    // 省略
}

loop関数では、まず2秒ごとにループすることを指定しています。

dht関数で湿度と温度の値を読み取っていて、値をhtという変数にそれぞれ入れています。

void loop()
{
    // 省略

    if (h > 70) {
      Nefry.println("すっごく湿度が高いよ!");
    }
    if (t > 30) {
      Nefry.println("すっごく部屋が暑いよ!");
    }
}

if() {} の条件式で、湿度が70を超えた時、温度が30を超えたときの処理をそれぞれ指定しています。

Nefry.print("湿度: ");
Nefry.print(h);
Nefry.print(" %\t");
Nefry.print("温度: ");
Nefry.print(t);
Nefry.println(" *C ");

それ以外のときは温度・湿度を表示させます。

Webサービスと連携してみる

それでは、湿度が70%を超えたら自分のメールやチャットに通知がくるようにしてみましょう。

ifttt_action

IFTTTで提供されているサービスであれば、LINE、メール、SMS、Twitter、Facebookなどなど、自由に通知先を設定することができます。この記事では、例としてLINEへの通知方法を紹介します。

余裕のある方は好きな通知先を選択してみてください!

IFTTTにアプレットを作成

まずはIFTTTにアプレット(レシピ)を作成します。IFTTTのアカウントを持っていない場合はアカウント取得から進めてください。

IFTTTのアプレットは「〇〇が起きたら△△する」というようにトリガー(〇〇)とアクション(△△)に分けられます。

今回は自作のサービスを利用できる「Webhooks」という機能を使い、「Webhooksを受け取ったらLINEに通知する」というアプレットを作ってみます。


■トリガーの作成

IFTTTのアプレット作成ページから「+this」部分をクリックし、トリガーの作成をします。

1

「Webhooks」を検索しましょう。

2

「Receive a web request」を選択します。

3

任意のイベント名をつけます。後ほどNefry BTにも登録するのでメモ帳などにコピーしておきましょう(大文字・小文字の区別があるのでコピー&ペーストがオススメです)。

4


■アクションの作成

続いてアクションを作成します。「+that」から進めましょう。

5

Nefry BTからの送信を受け取ったら実行したいWebサービスを自由に選びます。今回はサンプルとしてLINEを連携してみますが、Twitter、Slack、Gmail、Googleカレンダー、Facebookなどなど、たぶん思いつく有名Webサービスはだいたいあります。

6

起こしたいアクションを選びます。LINEは「メッセージを送る」機能のみですが、サービスによってはさまざまなアクションが起こせます。

7

クリックすると、初回はアカウント認証を求められる気がします。LINEのログインメールアドレスがわからない、という方は、スマホのLINEアプリの設定から確認できます(友だちタブ > 設定(歯車)ボタン > アカウント>メールアドレス・パスワード)。

8

メッセージを送るルーム、メッセージ内容を設定します。「1:1で〜」を選択すると自分個人宛てにメッセージが届きます。メッセージは「LINE Notify」というアカウントから送られる仕組みです。

9
通知先は自分個人の他に、グループも選択できます。

メッセージを自由に作成します。Nefry BTから値を送信し受け取りたい場合は、「Add Ingredient」からValue1を選択します。下記のような場合は、NefryBT側のプログラムで1つ目の値に湿度を送るよう設定します。

10

このような感じで設定したら、「Create action」で作成します。

11

最終確認がされるので「Finish」で登録しましょう。

12


■WebhooksのSecretKeyを取得

Nefry BTとWebhooksと紐付けるための「Secret Key」を取得します。パスワードのようなものです。上部の検索欄からWebhooksを検索しましょう。

13

Webhooksのページに移動します(初回は認証画面が表示されるので「Connect」で開始しましょう)。

14

右上の「Setting」に移動します。

15

「URL」の末尾に自身のSecret Keyが記載されているのでコピーし、メモしておきます。このKeyは漏れると他人が自分にLINEを送れるようになってしまうので、Web上に公開しないよう注意してください。

16

プログラムを書き込む

■プログラム

以下のプログラムをNefry BTに書き込みます。

#include "DHT.h"
#include <Nefry.h>
#include <NefryIFTTT.h>

#define DHTPIN A0
#define DHTTYPE DHT11

String Event, SecretKey;
DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Nefry.println("温度・湿度をチェック");
  Nefry.setStoreTitle("SecretKey", 0); //Nefry DataStoreのタイトルを指定
  Nefry.setStoreTitle("Event", 1);
  SecretKey = Nefry.getStoreStr(0);   //Nefry DataStoreからデータを取得
  Event = Nefry.getStoreStr(1);       //Nefry DataStoreからデータを取得
  dht.begin();
}

void loop() {
  delay(2000);

  float h = dht.readHumidity();
  float t = dht.readTemperature();

  if (isnan(h) || isnan(t)) {
    Nefry.println("読み取りに失敗しました…");
    return;
  }
  if (h > 70) {
    Nefry.println("すっごく湿度が高いよ!");
    bool sendData = IFTTT.send(Event, SecretKey, (String)h);
    if (!sendData) { //IFTTTにデータ送信が成功したかの判定
      Nefry.setLed(255, 0, 0); //エラーの時、赤色点灯
      delay(3000);
    } else {
      Nefry.setLed(0, 255, 0); //成功の時、緑色点灯
      delay(3000);
    }
    Nefry.ndelay(1000 * 30);
  }

  Nefry.print("湿度: ");
  Nefry.print(h);
  Nefry.print(" %\t");
  Nefry.print("温度: ");
  Nefry.print(t);
  Nefry.println(" *C ");
}

Nefry BTにIFTTTのアカウント情報を設定

Nefry BTにディスプレイを取り付けてから起動し、表示されているIPアドレスにアクセスします(画像の場合はhttp://192.168.4.1/。人によって違います。 )。

ip

「Data Store」に移動します。

先ほど取得したWebhooksの「Secret Key」と「Event Name」をそれぞれ入力し保存します。Event Nameは大文字・小文字の区別があります。

console

「Save」で保存するとNefry BTが再起動し、準備は完了です。


動作を確認

さっそく完成したものを動かしてみましょう。

湿度の値が高くなると……

Image from Gyazo

LINEに通知されました!

お疲れ様でした〜!

プログラムの解説

要所を説明します。大事なところはちょっとだけです。

void setup() {
  Nefry.setStoreTitle("SecretKey", 0); //Nefry DataStoreのタイトルを指定
  Nefry.setStoreTitle("Event", 1);
  SecretKey = Nefry.getStoreStr(0);   //Nefry DataStoreからデータを取得
  Event = Nefry.getStoreStr(1);       //Nefry DataStoreからデータを取得
}

Nefry.setStoreTitle({タイトル}, {チャンネル番号})関数を使い、Nefry BTのDataStore機能に場所を作っています。この値はNefryポータル側から入力でき、変更があってもプログラムを書き換える必要はありません。

また値をgetStoreStr({チャンネル番号})で、ポータル側で設定した値を受け取っています。

void loop() {
  // 省略
  if (h > 70) {
    Nefry.println("すっごく湿度が高いよ!");
    bool sendData = IFTTT.send(Event, SecretKey, (String)h);
    if (!sendData) { //IFTTTにデータ送信が成功したかの判定
      Nefry.setLed(255, 0, 0); //エラーの時、赤色点灯
      delay(3000);
    } else {
      Nefry.setLed(0, 255, 0); //成功の時、緑色点灯
      delay(3000);
    }
    Nefry.ndelay(1000 * 30);
  }
}

先ほど同様湿度が70%を超えたとき、という条件文を作っています。IFTTT.send()関数を使い、もし送れなかったときは赤いLEDを光らせるという処理をしています(!!==と同義で、FALSEが返ったときに実行されます)。

何度も連続して通知が来るとウザいので、一度送ったあとは30秒(1000ミリ秒×30)待ちます。場合によっては30分待つ、1日待つ、などに変更します。

応用: いろいろなセンサを試してみる

刺すだけで配線できるGroveモジュールは100種類以上あり、いろいろなデータを手軽に扱うことができます。下記ではモジュールと利用例を紹介します。

磁気スイッチ

magnetic
磁石がくっついているか否か、を検知するセンサです。ドアの開閉検知によく使われ、市販の開閉検知装置も磁気センサを使っていることが多いです。

ドアが閉まっているときは磁石とセンサが接着、開いたときは離れるように設置することで開閉を検知できます。

人感センサ

pir
人が近くにいることを検知するセンサです。防犯用の近づくと光るなどに使われます。

光センサ

luminance
照度(光の度合い)を検知します。暗くなったら明かりをつける仕組みや、異常のときに光るパトランプの近くに起き通知するなど、異常検知にも利用できます。

超音波距離センサ

wave
センサからモノへの距離を測るセンサです。超音波をぶつけて跳ね返りを調べる仕組みです。

サーボモータ

servo
角度を指定して回転させることができるアクチュエータです。

カメラ

camera

関連情報

Nefry BTはこちらから購入できます(送料無料)。その他にも千石電商、ツクモ、若松通商、共立電子などの実店舗やECサイトで購入できます。

Nefry BTでは、IFTTTを使ったWebサービスとの連携や、その他のクラウドサービスとの連携も簡単です。ディスプレイを使ったイラスト描画や、100以上あるGroveモジュールの活用なども、ぜひ試してみてください。

Nefryユーザ同士が交流するページです。質問を投稿して解決した事例もたくさんありますので、困った際などはぜひお気軽にご利用ください。開発者もよく登場します。

Nefryユーザによる開催イベントです。ハンズオンやLT会、もくもく会などを実施しています。

dotstudioによる開催イベントです。Nefry BT以外の題材を扱うことも多いです。

    このエントリーをはてなブックマークに追加