ATOM MatrixをいろいろいじっていくうちにシンプルなATOM Liteも欲しいなと思って、購入しました。
購入したのはとATOM Matrixと同じくスイッチサイエンスです。
中身はほぼ一緒ですが、ATOM Martixと比べて、LEDが25個から1個になったのと6軸センサが付いていません。
高さが半分近くになっています。
Alexa(Amazon Echo)とデバイスの連携について
私のうちの中では、Amazon Echoを部屋ごとに配置していて、リビングの照明などはAlexaでコントロールできるようにしています。
以前に書いた新しくなったenebularを使ってみる Vol.2 ~Amazon EchoとMbedを繋げて照明をコントロール~では、Node-REDとWebサービスを組んで行っていましたが、大掛かりなので、ローカルネットで完結できないかと思って、調べてみるとESPシリーズ向けにデバイスをAlexa対応デバイスにできるライブラリを見つけたので、ATOM Liteを使って試してみます。
ATOM LiteをAlexa対応デバイス化
ATOM Liteのセットアップ方法はATOM Matrixと同様なので、ATOM Matrixを触ってみたを参照してください。
照明をON/OFFできるようにGrove リレーを繋げています。(プログラムではATOM LiteのLEDもON/OFFしてるので、お試しの場合はリレーが無くても大丈夫です。)
ライブラリの追加
見つけたライブラリはFauxmoESPというものです。
ArduinoIDEのライブラリマネージャで検索すればインストールできます。
FauxmoESPの中でAsyncTCPというライブラリも使っているようなので、こちらもインストールします。こちらはGitubからZIP形式でダウンロードして、インストールします。
プログラム
FauxmoESPのexampleを参考にプログラムを作りました。
FauxmoESPに対して、デバイス名とコールバックを設定すれば動作したので、基本的には簡単に応用できると思います。
コールバック関数の中身は軽くしてねとコメントがあったので、コールバック関数の中で変数を変更して、loop関数の中でそれを検出して、処理するようにしています。
ATOM Lite上のスイッチでもON/OFFできるようにしています。
# include "M5Atom.h"
# include <WiFi.h>
# include "fauxmoESP.h"
const int RelayPin = 32;
const char DEVICE_NAME[] = "light";
typedef enum {
NO_EVENT = 0,
LIGHT_ON,
LIGHT_OFF
} EVENT;
fauxmoESP fauxmo;
// Wi-FiのSSID
const char* ssid = "ssid";
// Wi-Fiのパスワード
const char* password = "pass";
volatile EVENT event = NO_EVENT;
// コールバック関数 登録したデバイスにAlexaからイベント来ると呼ばれる
void AlexaCallback(unsigned char device_id, const char *device_name, bool state, unsigned char value) {
Serial.printf("Device #%d (%s) state: %s value: %d\n", device_id, device_name, state ? "ON" : "OFF", value);
if (strcmp(device_name, DEVICE_NAME) == 0) {
if(state) {
event = LIGHT_ON;
} else {
event = LIGHT_OFF;
}
}
}
// コントロールON / OFF
void LightControl(bool value) {
if(value){
Serial.println("ON");
M5.dis.drawpix(0, 0xf00000);
digitalWrite(RelayPin, HIGH);
} else {
Serial.println("OFF");
M5.dis.drawpix(0, 0x000000);
digitalWrite(RelayPin, LOW);
}
}
void setup() {
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, LOW);
M5.begin(true, false, true);
delay(50);
M5.dis.drawpix(0, 0x000000);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.print("WiFi connected\r\nIP address: ");
Serial.println(WiFi.localIP());
fauxmo.createServer(true);
fauxmo.setPort(80);
fauxmo.enable(true);
// デバイス名を登録
fauxmo.addDevice(DEVICE_NAME);
// コールバック関数を登録
fauxmo.onSetState(AlexaCallback);
}
void loop() {
static bool state =false;
if (M5.Btn.wasPressed()) {
if(state) {
event = LIGHT_OFF;
} else {
event = LIGHT_ON;
}
}
switch (event) {
case LIGHT_ON:
LightControl(true);
state = true;
event = NO_EVENT;
break;
case LIGHT_OFF:
LightControl(false);
state = false;
event = NO_EVENT;
break;
default:
break;
}
fauxmo.handle();
delay(50);
M5.update();
}
結果
Amazon EchoもしくはスマホのAlexaアプリで、「デバイスを探して」というとデバイスの検出が始まります。「新しいデバイスが見つかりました」となれば、成功です。
Alexaアプリの「すべてのデバイス」に「light」という名前のデバイスが追加されます。
(Royal Philips Electronicsスマートデバイスと出てくるので、そのデバイスを模擬しているかんじですかね)
あとはAmazon EchoもしくはスマホのAlexaアプリに向かって、「ライトを点けて」or「ライトを消して」という風に言えばライトをON/OFFします。
youtube
もちろん中身は同じなので、ATOM Matrixでも同じことができます。