この記事は、NIFTY Advent Calendar 2017の19日目の記事です
ニフティのエンジニア2年目の @5_21maimai と @sbyh52moc1 です。
入社した去年から、週に1回同期数人で集まって技術勉強会をしたり、開発合宿をしたりしています。(新入社員の間でRuby勉強会をやっている話参照)
今年は、1年目エンジニアや3年目の先輩も交えて、会社近くの会議室を借りて行っています。
先日、その勉強会メンバーでIoTがテーマの開発合宿を行いました。
各チーム2~3人でひとつのものを開発するのですが、私たちのチームはNefryというデバイスを使って開発したので、そのことについて2人でまとめていこうと思います。
IoT初挑戦の2人で開発したため、拙い内容ですがご容赦ください。
Nefryとは?
Nefryとは、手のひらサイズの小さなIoTデバイスです。
Wi-Fiモジュールが標準搭載されているので、Wi-Fiモジュールを追加せずにインターネットに接続できます。
また、ArduinoIDEが使えたり、スイッチやLEDライトが標準でついていたり、ドキュメントが豊富(しかも日本語!)なので、デバイス初挑戦の人でも挑戦しやすいデバイスです。
MilkcocoaやIFTTTなどとも連携可能です!
Nefryv2.0とNefryBTの2つのバージョンが発売されており、NefryBTの方が新しいバージョンです。
作ったもの
雨お知らせくん
スイッチを押すと、今雨が降っているかどうかをLEDライトで通知してくれます。
玄関に置いて、出かけるときに傘が必要か簡単に調べることができます。
使ったもの
-
NefryBT
-
WeatherAPI
- OpenWeatherMapのAPI「Current weather data」を利用
実装
NefryはArduinoIDEで開発していきます。
以下、実装内容をソースコードから抜粋して紹介します。
現在の天気を判定する
Weather APIから、現在の天気を取得します。
取得したい地域のIDを事前に調べておき、Nefry環境変数として設定しておきます。
ライブラリは HTTPClient.h
ArduinoJson.h
を利用しました。
// Nefry環境変数から、地域IDやAPI keyを取得
String id = Nefry.getStoreStr(0);
String appid = Nefry.getStoreStr(1);
String body = "";
HTTPClient http;
// APIを叩く
http.begin(String("http://") + host + url + String("?id=") + id + String("&APPID=") + appid);
int httpCode = http.GET();
Nefry.ndelay(100);
if (httpCode < 0) {
body = http.errorToString(httpCode);
} else {
body = http.getString();
}
http.end();
// jsonデコード
const int BUFFER_SIZE = JSON_OBJECT_SIZE(50) + JSON_ARRAY_SIZE(1);
StaticJsonBuffer<BUFFER_SIZE> jsonBuffer;
int len = body.length()+1;
char* json = new char[len];
body.toCharArray(json, len);
JsonObject& root = jsonBuffer.parseObject(json);
if (!root.success()) {
Nefry.println("parseObject() failed");
}
// 現在の天気を取得
String weather = root["weather"][0]["main"];
NefryのLEDを制御する
天気が雨かどうかによって、NefryのLEDの挙動を変化させます。
Nefry関数を利用することで、簡単に付属のLEDを制御することができます。
フルカラーLEDなので、RGB値で様々な色を指定できます。
void turnOnLed(int isRain){
// 雨かどうかの引数によって、LEDの色が変わる
if(isRain){
// isRain = 1(true)の時、青色で点滅
Nefry.setLed(0,0,255);
Nefry.ndelay(100);
Nefry.setLed(0,0,0);
Nefry.ndelay(100);
}else{
// isRain = 0(false)の時、オレンジで点灯
Nefry.setLed(255,165,0);
Nefry.ndelay(100);
}
}
Nefry関数やライブラリが充実しているため、
外部サービスとの連携、LEDや各種センサー等の制御を簡単に実現することができます。
また、上記の通り外部APIも比較的簡単に利用できるため、多くのアイディアをNefryで実現できそうだと感じました。
詰まったこと
- Nefryv2.0を壊してしまった
- オンライン上でバイナリファイルをアップロードする時に接続が切れてしまい、その後電源が入らなくなってしまった
- 急遽別メンバーのNefryBTを借りることに
- NefryのWi-fi接続がうまくいかない
- バイナリファイルをNefryに書き込むたびに、Wi-fi接続が切れてしまい、セットアップからやり直さないといけなかった
- 会議室のWi-fiからテザリングに変更すると安定したが、原因は最後まで謎のまま...
- 会議室のWi-fi接続数が多すぎた?
最後に
IoT初心者でしたが、調べれば割と簡単にAPIを叩いて処理をすることができました。
NefryはGroveセンサの規格に対応しているようなので、今後は人感センサーなどの別のセンサーも使ってみたいです。
明日は @RPcat さんです。お楽しみに!