11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

ATOM LiteをAlexa対応デバイス化

Last updated at Posted at 2020-06-07

ATOM MatrixをいろいろいじっていくうちにシンプルなATOM Liteも欲しいなと思って、購入しました。

購入したのはとATOM Matrixと同じくスイッチサイエンスです。

image.png

中身はほぼ一緒ですが、ATOM Martixと比べて、LEDが25個から1個になったのと6軸センサが付いていません。
高さが半分近くになっています。

image.png

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してるので、お試しの場合はリレーが無くても大丈夫です。)

image.png

ライブラリの追加

見つけたライブラリはFauxmoESPというものです。
ArduinoIDEのライブラリマネージャで検索すればインストールできます。
image.png

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」という名前のデバイスが追加されます。

image.png
(Royal Philips Electronicsスマートデバイスと出てくるので、そのデバイスを模擬しているかんじですかね)

あとはAmazon EchoもしくはスマホのAlexaアプリに向かって、「ライトを点けて」or「ライトを消して」という風に言えばライトをON/OFFします。
unnamed.gif
youtube

もちろん中身は同じなので、ATOM Matrixでも同じことができます。

11
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?