ESP32とAmazon Alexaを連携して物理スイッチを制御する

はじめに

前回の記事でESP32をAmazon Alexa(以下、Alexa)のスマートホームのデバイスに登録する方法をご紹介しました。

kuracux.hatenablog.jp


記事内では動作確認のためにLEDの点灯・消灯を制御していましたが、SwitchBotのような物理スイッチの制御を実現してみましたのでご紹介します。

完成品

AlexaアプリからESP32に接続されたサーボモータを制御しています。また、Amazon Echoに話しかけても動作可能です。

見た目は残念ですが、物理スイッチの制御を実現しています。

また、通常のように物理スイッチを指で押すことも可能となっています。


開発環境

準備物

  • Alexaアプリ
  • ESP32-DevKitC

akizukidenshi.com

  • ブレッドボードとジャンパーワイヤ(オス-オス)

akizukidenshi.com

前提

前回の記事を参考にESP32とAlexaとの連携がすでに済んでいる方を対象としています。

1 スケッチ例

Arduino IDEから下記のスケッチを書き込みます。前回の記事のスケッチをもとに作成しています。

#include <Arduino.h>
#include <WiFi.h>
#include "fauxmoESP.h"
#define SERIAL_BAUDRATE                 115200
#define SERVO                           15

fauxmoESP fauxmo;

char ssid[] = "";
char password[] = "";
bool inputState = true; //オンオフ記録用

// -----------------------------------------------------------------------------
// Wifi
// -----------------------------------------------------------------------------

void wifiSetup() {

    // Set WIFI module to STA mode
    WiFi.mode(WIFI_STA);

    // Connect
    Serial.printf("[WIFI] Connecting to %s ",ssid);
    WiFi.begin(ssid, password);

    // Wait
    while (WiFi.status() != WL_CONNECTED) {
        Serial.print(".");
        delay(100);
    }
    Serial.println();

    // Connected!
    Serial.printf("[WIFI] STATION Mode, SSID: %s, IP address: %s\n", WiFi.SSID().c_str(), WiFi.localIP().toString().c_str());

}

void setup() {

    // Init serial port and clean garbage
    Serial.begin(SERIAL_BAUDRATE);
    Serial.println();
    Serial.println();

    // Wifi
    wifiSetup();

    // You have to call enable(true) once you have a WiFi connection
    // You can enable or disable the library at any moment
    // Disabling it will prevent the devices from being discovered and switched
    fauxmo.enable(true);

    // Add virtual devices
    fauxmo.addDevice("照明");

    // fauxmoESP 2.0.0 has changed the callback signature to add the device_id,
    // this way it's easier to match devices to action without having to compare strings.
    fauxmo.onSetState([](unsigned char device_id, const char * device_name, bool state) {
        Serial.printf("[MAIN] Device #%d (%s) state: %s\n", device_id, device_name, state ? "ON" : "OFF");
        inputState = state;
        if(inputState){
          //オンのときのサーボの挙動を記述
          ledcWrite(0,60);
          delay(500);
          ledcWrite(0,40);
        }else{
          //オフのときのサーボの挙動を記述
          ledcWrite(0,25);
          delay(500);
          ledcWrite(0,40);
        }
    });

    // Callback to retrieve current state (for GetBinaryState queries)
    fauxmo.onGetState([](unsigned char device_id, const char * device_name) {
        return inputState == HIGH;
    });
    
    ledcSetup(0, 50, 10);  // 0ch 50 Hz 10bit resolution
    ledcAttachPin(SERVO, 0); // 15pin, 0ch
    ledcWrite(0,40);
}

void loop() {

    // Since fauxmoESP 2.0 the library uses the "compatibility" mode by
    // default, this means that it uses WiFiUdp class instead of AsyncUDP.
    // The later requires the Arduino Core for ESP8266 staging version
    // whilst the former works fine with current stable 2.3.0 version.
    // But, since it's not "async" anymore we have to manually poll for UDP
    // packets
    fauxmo.handle();

    static unsigned long last = millis();
    if (millis() - last > 5000) {
        last = millis();
        Serial.printf("[MAIN] Free heap: %d bytes\n", ESP.getFreeHeap());
    }

}

2 ESP32の接続例

スケッチにて指定したピンと電源とGNDのところに挿します。

f:id:kuracux:20180923224038p:plain:w300

3 Alexaアプリとの接続

前回の記事と同様に接続します。今回はボタンを押すとオン・オフに応じてサーボモータが指定した動きをします。

おわりに

ESP32とAlexaを連携して物理スイッチを制御する方法をご紹介しました。

かなり強引な方法ではありますが、音声やアプリから物理スイッチを制御できるようになると生活が便利になって良いですね。

おまけ

Amazon Echoのミュートボタンを音声でオンにする方法が分からなかったため、サーボモータを利用して音声操作で無理矢理押すようにしました。