スポンサーリンク

AmazonEchoのAlexaとESP32を使って声で照明の明るさを調節することができるか基礎実験をしてみました

スポンサーリンク

ESP32を使って、Amazon EchoのAlexaに、声で照明をつけたり消したり、明るさを調節したりできるか基礎実験をしてみました。「アレクサ、電気をつけて」「アレクサ、電気を消して」みたいなことができるでしょうか。

スポンサーリンク

Espalexa

ESP32をAlexaのデバイスとして利用することができる、とっても便利なEspalexaというライブラリを使います。

ライブラリの追加

[スケッチ]→[ライブラリをインクルード]→[ライブラリを管理]

ライブラリマネージャで、「Espalexa」と検索するとライブラリが表示されるのでインストールします。

サンプルを修正

[ファイル]→[スケッチ例]→[Espalexa]→[EspalexaBasic]のサンプルプログラムをちょっと修正します。

今回は、明るさに応じて光るLEDの数が増えるプログラムに修正し、動作を確認します。

#include <WiFi.h>
#include <Espalexa.h>

// prototypes
boolean connectWifi();

//callback functions
void firstLightChanged(uint8_t brightness);

// Change this!!
const char* ssid = "ssid";
const char* password = "password";

boolean wifiConnected = false;

Espalexa espalexa;

const int LED_1 = 12;
const int LED_2 = 27;
const int LED_3 = 26;
const int LED_4 = 25;
const int LED_5 = 33;

void setup()
{
  Serial.begin(115200);

  pinMode(LED_1, OUTPUT);
  digitalWrite(LED_1, LOW);
  pinMode(LED_2, OUTPUT);
  digitalWrite(LED_2, LOW);
  pinMode(LED_3, OUTPUT);
  digitalWrite(LED_3, LOW);
  pinMode(LED_4, OUTPUT);
  digitalWrite(LED_4, LOW);
  pinMode(LED_5, OUTPUT);
  digitalWrite(LED_5, LOW);

  
  // Initialise wifi connection
  wifiConnected = connectWifi();
  
  if(wifiConnected){
    
    // Define your devices here.
    espalexa.addDevice("でんき", firstLightChanged,0); //simplest definition, default state off

    espalexa.begin();
    
  } else
  {
    while (1) {
      Serial.println("Cannot connect to WiFi. Please check data and reset the ESP.");
      delay(2500);
    }
  }
}
 
void loop()
{
   espalexa.loop();
   delay(1);
}

//our callback functions
void firstLightChanged(uint8_t brightness) {
    Serial.print("Device 1 changed to ");
    
    //do what you need to do here
    showLED( brightness );

    //EXAMPLE
    if (brightness) {
      Serial.print("ON, brightness ");
      Serial.print(brightness);
    }
    else  {
      Serial.println("OFF");
    }
}

// connect to wifi – returns true if successful or false if not
boolean connectWifi(){
  boolean state = true;
  int i = 0;
  
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  Serial.println("");
  Serial.println("Connecting to WiFi");

  // Wait for connection
  Serial.print("Connecting...");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
    if (i > 20){
      state = false; break;
    }
    i++;
  }
  Serial.println("");
  if (state){
    Serial.print("Connected to ");
    Serial.println(ssid);
    Serial.print("IP address: ");
    Serial.println(WiFi.localIP());
  }
  else {
    Serial.println("Connection failed.");
  }
  return state;
}

void showLED( int value )
{
  if( value == 0 )
  {
      digitalWrite(LED_1, LOW);
      digitalWrite(LED_2, LOW);
      digitalWrite(LED_3, LOW);
      digitalWrite(LED_4, LOW);
      digitalWrite(LED_5, LOW);
      return;
  }
  
  int num = (value-3)/63;
  switch( num ){
    case 0 :
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, LOW);
      digitalWrite(LED_3, LOW);
      digitalWrite(LED_4, LOW);
      digitalWrite(LED_5, LOW);
      break;
            
    case 1 :
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, HIGH);
      digitalWrite(LED_3, LOW);
      digitalWrite(LED_4, LOW);
      digitalWrite(LED_5, LOW);
      break;
            
    case 2 :
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, HIGH);
      digitalWrite(LED_3, HIGH);
      digitalWrite(LED_4, LOW);
      digitalWrite(LED_5, LOW);
      break;
            
    case 3 :
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, HIGH);
      digitalWrite(LED_3, HIGH);
      digitalWrite(LED_4, HIGH);
      digitalWrite(LED_5, LOW);
      break;
            
    case 4 :
      digitalWrite(LED_1, HIGH);
      digitalWrite(LED_2, HIGH);
      digitalWrite(LED_3, HIGH);
      digitalWrite(LED_4, HIGH);
      digitalWrite(LED_5, HIGH);
      break;

    default :
      digitalWrite(LED_1, LOW);
      digitalWrite(LED_2, LOW);
      digitalWrite(LED_3, LOW);
      digitalWrite(LED_4, LOW);
      digitalWrite(LED_5, LOW);
      break;
  }
  return;
}

スポンサーリンク

ESP32とLED

用意する物
・ESP32-DevKitC
・ブレッドボード
・LED 5個
・抵抗 1kΩ

LEDのプラス極をESP32のポート12,27,26,25,33 に接続し、マイナス極をブレッドボードの左側の青いラインに刺します。

青いラインと、ESP32のGNDの間に、抵抗1kΩを接続し、配線は終了です。今回は実験として、LEDの点灯が確認できればよいので、抵抗はまとめて1個だけと回路を簡略化しています。

Arduinoのプログラムを書き込めば、回路側の準備は完了です。

スポンサーリンク

Alexaアプリの設定

デバイスの追加

Alexaのアプリを開き、右上の+マークをタップします。

一番下までスライドして、「その他」をタップします。

「デバイスを検出」をタップします。

しばらく、周辺にあるデバイスを検索しています。

デバイス名が文字化けしてしまっていますが、ESP32のデバイスが検出されます。

とりあえず、「終了」をタップ。

名称の変更

「照明」が追加されているので、「照明」をタップ。

文字化けしているデバイスをタップ。

右上の歯車マークをタップ。

「名前の編集」をタップ。

「でんき」に変更します。これで設定は全て完了です。今回は「でんき」ですが、呼びたい名称を設定すれば、その名称で照明をつけたり消したりできます。

スポンサーリンク

Alexaに声をかける

点灯と消灯

これで準備は全て完了です。Alexaに話しかけてみましょう。

「アレクサ、電気をつけて」

LEDが点灯します。

「アレクサ、電気を消して」

LEDが消えます。

どうでしょう。声に反応してLEDが点灯したり、消灯したりできました。

明るさを変えてみる

続いて、明るさを変える実験です。

「アレクサ、電気を暗くして」「アレクサ、電気を明るくして」

「暗くして」と言うとLEDの光が一つ減り、「明るくして」と言うとLEDの光が一つ増えます。明るさの調節もできることがわかりました。

スポンサーリンク

実験は大成功

Alexaに声をかけることで、ESP32に接続したLEDをオンオフしたり明るさを調節したりできることがわかりました。

これで、Alexaでコントロールできるオリジナルの照明を作ることができます。

電子工作
スポンサーリンク
スポンサーリンク

関連記事

kohacraftのblog

コメント