【ハンズオン資料】NefryBTでハジメテノIoT開発やってみよう!
この記事は11/1のハジメテノIoTハンズオン向け資料です。記事を読んで試せる内容になっているので、終了後や参加されていない方もぜひ試してみてください!
■ハンズオンの進行について
ハンズオンはこのページに沿って進めます。進められる方は、どんどん進めていきましょう!リンクは別タブや別ウィンドウで開くのがオススメです。■Nefry BTドキュメントについて
Nefry BTドキュメント: NefryBTの使い方に関するドキュメントページです。基本の動作や、調べ方、質問できる場所なども案内しています。今回やってみること
湿度が高くなると自分のLINEに通知がくる仕組みを、Nefry BT、温湿度センサ、IFTTTというWebサービスを使って作ってみます。室内の状態が異常になったときに通知する仕組みのようなイメージです。
用意するもの
■Nefry BT&ディスプレイ
Nefry BTは「ESP-WROOM-32」というWi-Fi・BLE通信モジュールを搭載した、Arduinoと同じように開発できるマイコンボードです。
Groveという刺すだけで配線できるモジュール対応のコネクタを搭載していて、ハードウェアをあまり意識せずに開発できます。
■Grove 温湿度センサ
刺すだけで配線できるGroveシリーズの、温度と湿度を取得できるセンサです。
安価で扱いやすいセンサですが、高い精度や細かいデータの取得には向きません。プロトタイプ向きなセンサです。
■Arduino IDE
開発(プログラムの書き込み)にはArduino IDEというフリーソフトウェアを利用します。
こちらの手順を見ながらご自身のPCにインストールしてください。
■Arduino IDE
開発(プログラムの書き込み)にはArduino IDEというフリーソフトウェアを利用します。
まだインストールしていない方は、こちらの手順を見ながら進めてください。
■IFTTTアカウント
IFTTT(いふと)は、モノとWebやWebサービス同士を簡単に連携できるサービスです。
他の人が作ったアプレット(連携レシピ)を使ったり、自分で新たに作成したりできます。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が出す無線の名称になります。
■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は、最初から下記の機能が搭載されています。
- 内蔵フルカラーLED
- スイッチ(SW/RST)
Nefry BTを起動
一度Nefry BTを電源から外し、ディスプレイを外します(内蔵LEDが隠れてしまうため)。マイコンボードに配線する時は、常に電源OFFの状態で操作してください。
マイコンボードは基本的に、給電によって電源のON/OFFを制御します。再起動時には最後に書き込んだプログラムが実行されます。プログラムは書き込むたびに上書きされます。
再度給電します。
緑色のLEDが点滅したあと、ランダムに光ります。
まずはLチカ
最初のプログラムとして、Lチカをやってみます。LEDチカチカの略で、入門向けのプログラムとして汎用的に紹介されています。
簡単なプログラムを書き込むことで、ボードが正常に動くか試す際に利用することも多いです。
■Arduino IDEでプログラムを書く
Arduino 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を使用しています)。
■シリアルポートを選択
Nefry BTをPCのUSBポートにさします。プログラムはこのポートを介して、シリアル通信でNefry BTに流し込まれます。
Macの場合は、メニューのツール > シリアルポート > /dev/cu.usbserial-xxxxxx
を選択します。環境によっては/dev/tty.usbserial-xxxxxx
などの場合もあります。
Windowsの場合は、ツール > シリアルポート > /dev/COM-XX
を選択します。
※Nefry BTを抜き差しすると、シリアルポートの選択が解除される場合があります。適宜確認しましょう。
■シリアルポートが選択できない方
USBドライバのインストールが必要な場合があります。「Arduino IDEでシリアルポートが見つからない・書き込めない」を参照して、USBを認識させるためのドライバをインストールしてください。また、Arduino IDEの再起動やUSBの抜き差しで認識する場合があります。■PCにUSB接続できない方
セキュリティやポートの問題でPCにUSB接続できない方は、Wi-Fi経由でプログラムのアップロードが可能です。その場合、下記の書き込み手順は不要です。給電はコンセントやモバイルバッテリーから直接行ってください。■名前をつけて保存
ファイル>名前をつけて保存
を選択して保存します。「NefryLedBlink」など、後からみてわかりやすい名前がオススメです。
■プログラムを書き込む
「✔️」を押してプログラムをコンパイルします。コンパイルとは、プログラムを機械が理解できる(人間には読みづらい)形式に変換することです。
この手順は省略しても大丈夫ですが、シンタックス(文法)チェックをしてくれるので実施するのがオススメです。
左上の「→」ボタンを押してNefry BTにプログラムを書き込みます。
ESP32モジュールの特性上、書き込みに1分ほどかかります。エラーが出てしまうときは、「コンパイルは成功するのに書き込みが失敗する」を参照してください。
3分以上かかる場合、Nefry BTの不良の可能性があるので申し出てください。
■動作を確認
起動したら、「青いLEDが1秒ごとに光る」ことを確認しましょう。
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が赤く光ることを確認します。
■プログラムの解説
プログラムの要所を説明します。
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モジュールによって違います。
通信方式は温湿度センサの製造元・SeeedStudioのWikiページを見て確認しましょう。
今回は「A0」というソケットに差し込みます。少し硬いですが、カチッと言うまで押し込めます。配線作業は常に電源オフの状態 で行います。
温湿度センサを扱うライブラリを読み込む
温湿度センサを扱うためのライブラリ(※)を追加でダウンロードします。リンク先のページで「Clone or Download」から「Download ZIP」を選択します(2つのページから両方ダウンロードしてください)。
Arduino IDEのスケッチ > ライブラリをインクルード > .ZIP形式のライブラリをインストール
から、ダウンロードされたZIPファイルを2つとも追加して完了です。
■ライブラリとは
センサや外部サービスを使うために、あらかじめプログラムを書きパッケージ化したものです。既に誰かが作ってくれているものを取り込んだり、自作したりできます。プログラムを書き込む
新規ファイルを作成し、下記のプログラムを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 ");
}
動作を確認
メニューのツール>シリアルモニタ
を選択して開きます。
右下のbps設定を「115200bps」に変更します。
2秒ごとに、シリアルモニタに温度と湿度が表示されて行きます。
あまり動きがないですが、息を吹きかけると湿度が上がることを確認できます。湿度や温度が上がるとアラートメッセージが出ることを確認できたでしょうか?
■プログラムの解説
プログラムの要所を解説します。
#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
関数で湿度と温度の値を読み取っていて、値をh
とt
という変数にそれぞれ入れています。
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で提供されているサービスであれば、LINE、メール、SMS、Twitter、Facebookなどなど、自由に通知先を設定することができます。この記事では、例としてLINEへの通知方法を紹介します。
余裕のある方は好きな通知先を選択してみてください!
IFTTTにアプレットを作成
まずはIFTTTにアプレット(レシピ)を作成します。IFTTTのアカウントを持っていない場合はアカウント取得から進めてください。
IFTTTのアプレットは「〇〇が起きたら△△する」というようにトリガー(〇〇)とアクション(△△)に分けられます。
今回は自作のサービスを利用できる「Webhooks」という機能を使い、「Webhooksを受け取ったらLINEに通知する」というアプレットを作ってみます。
■トリガーの作成
IFTTTのアプレット作成ページから「+this」部分をクリックし、トリガーの作成をします。
「Webhooks」を検索しましょう。
「Receive a web request」を選択します。
任意のイベント名をつけます。後ほどNefry BTにも登録するのでメモ帳などにコピーしておきましょう(大文字・小文字の区別があるのでコピー&ペーストがオススメです)。
■アクションの作成
続いてアクションを作成します。「+that」から進めましょう。
Nefry BTからの送信を受け取ったら実行したいWebサービスを自由に選びます。今回はサンプルとしてLINEを連携してみますが、Twitter、Slack、Gmail、Googleカレンダー、Facebookなどなど、たぶん思いつく有名Webサービスはだいたいあります。
起こしたいアクションを選びます。LINEは「メッセージを送る」機能のみですが、サービスによってはさまざまなアクションが起こせます。
クリックすると、初回はアカウント認証を求められる気がします。LINEのログインメールアドレスがわからない、という方は、スマホのLINEアプリの設定から確認できます(友だちタブ > 設定(歯車)ボタン > アカウント>メールアドレス・パスワード
)。
メッセージを送るルーム、メッセージ内容を設定します。「1:1で〜」を選択すると自分個人宛てにメッセージが届きます。メッセージは「LINE Notify」というアカウントから送られる仕組みです。
通知先は自分個人の他に、グループも選択できます。
メッセージを自由に作成します。Nefry BTから値を送信し受け取りたい場合は、「Add Ingredient」からValue1
を選択します。下記のような場合は、NefryBT側のプログラムで1つ目の値に湿度を送るよう設定します。
このような感じで設定したら、「Create action」で作成します。
最終確認がされるので「Finish」で登録しましょう。
■WebhooksのSecretKeyを取得
Nefry BTとWebhooksと紐付けるための「Secret Key」を取得します。パスワードのようなものです。上部の検索欄からWebhooksを検索しましょう。
Webhooksのページに移動します(初回は認証画面が表示されるので「Connect」で開始しましょう)。
右上の「Setting」に移動します。
「URL」の末尾に自身のSecret Keyが記載されているのでコピーし、メモしておきます。このKeyは漏れると他人が自分にLINEを送れるようになってしまうので、Web上に公開しないよう注意してください。
プログラムを書き込む
■プログラム
以下のプログラムを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/
。人によって違います。 )。
「Data Store」に移動します。
先ほど取得したWebhooksの「Secret Key」と「Event Name」をそれぞれ入力し保存します。Event Nameは大文字・小文字の区別があります。
「Save」で保存するとNefry BTが再起動し、準備は完了です。
動作を確認
さっそく完成したものを動かしてみましょう。
湿度の値が高くなると……
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種類以上あり、いろいろなデータを手軽に扱うことができます。下記ではモジュールと利用例を紹介します。
磁気スイッチ
磁石がくっついているか否か、を検知するセンサです。ドアの開閉検知によく使われ、市販の開閉検知装置も磁気センサを使っていることが多いです。
ドアが閉まっているときは磁石とセンサが接着、開いたときは離れるように設置することで開閉を検知できます。
- 例: 開閉検知
- 参考: 磁気スイッチを使ってポストの開閉をメールで通知
人感センサ
人が近くにいることを検知するセンサです。防犯用の近づくと光るなどに使われます。
- 例: 防犯灯
- 参考: Nefry BTと人感センサで防犯LINE BOTを作ってみよう
光センサ
照度(光の度合い)を検知します。暗くなったら明かりをつける仕組みや、異常のときに光るパトランプの近くに起き通知するなど、異常検知にも利用できます。
- 例: 異常検知
- 参考: NefryでGrove Luminance Sensor(照度センサ)を触るメモ
超音波距離センサ
センサからモノへの距離を測るセンサです。超音波をぶつけて跳ね返りを調べる仕組みです。
サーボモータ
角度を指定して回転させることができるアクチュエータです。
カメラ
- 例: 機械学習で画像認識
- Node.jsとNefry BTで監視システムを作ろう! for Pepper #iotlt
関連情報
Nefry BTはこちらから購入できます(送料無料)。その他にも千石電商、ツクモ、若松通商、共立電子などの実店舗やECサイトで購入できます。
Nefry BTでは、IFTTTを使ったWebサービスとの連携や、その他のクラウドサービスとの連携も簡単です。ディスプレイを使ったイラスト描画や、100以上あるGroveモジュールの活用なども、ぜひ試してみてください。
Nefryユーザ同士が交流するページです。質問を投稿して解決した事例もたくさんありますので、困った際などはぜひお気軽にご利用ください。開発者もよく登場します。
Nefryユーザによる開催イベントです。ハンズオンやLT会、もくもく会などを実施しています。
dotstudioによる開催イベントです。Nefry BT以外の題材を扱うことも多いです。