もよいめも

不定期更新ものづくりブログ

【Arduino】ESP32でスイッチボット兼学習リモコンを自作する!

皆さま、スマートホームやってますか?


とは言っても、スマートホームで電気をつけたり消したりするには、対応する機器を買わなくてはいけないので、どうしてもお金がかかってしまいます

そこで使えるのが


SwitchBot !


でもたけぇ!

一個セール中で3600円ってなかなか厳しいですよね

ついでにテレビとかエアコンとかを操作できるようにする「学習リモコンも」一緒に買うと…

なんと7000!

あれ、意外と安いな

いやまあそんなことはどうでもいいのでさっさと自作していきましょう!

今回満たしたいスペック

・照明のスイッチを二つ操作
 部屋の照明とロフトの照明のスイッチを押させる

・赤外線リモコン機能
 以前作った自動カーテンを操作したい

・USB給電
 設置場所のちょうど下にパソコンがあるのでそこから給電したい

3Dプリンターでケースつくる

主に使った部品

・ESP32
https://www.amazon.co.jp/gp/product/B0718T232Z/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1
なんかプログラムの自動書き込み機能が、色々しないとうまくいかないので、心配な人は秋月とかのちゃんとした奴のほうがおすすめです。

サーボモータ

・赤外線LED
akizukidenshi.com

・2SC1815 GR

その他、USBケーブルとか基板とかピンヘッダとかコネクターとかケーブルなどなど

ケース設計

本体は、ちょうどスイッチの隣についていたエアコンの、リモコンホルダーを固定していたネジを利用して固定するので

それに合うように、なるべくシンプルにケースを作って3Dプリンターでプリントしようと思います。

とりあえず設計したのがこちら
www.thingiverse.com

基板を置くスペースの上にエアコンのリモコンケースを取り付けられるようにし、その隣にサーボモーターを保持する感じになっています

あまり見た目はよくないですが、動けばOKです

なお、設計はFusion360、プリントはEnder-3 Proで行いました。

配線

f:id:moyoi:20200505185457p:plain
回路図
今回は何かと電流がいるので、電源は外部からのものを直接使います。

JP1、JP2はそれぞれサーボモーターへ、

赤外線LEDは電圧約1.35~1.6V、電流50~100mAのものを使うので

R1は2kΩ、R2は10Ωのものを使いました

スイッチングに使ったトランジスタは2SC1815 GRです

プログラム

今回は3個のライブラリを使います

作ってくれた方に感謝!

github.com

github.com

github.com

#include <WiFi.h>
#include <Arduino.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
#include <Servo.h>

#include "WemoSwitch.h"
#include "WemoManager.h"
#include "CallbackFunction.h"

//送信する赤外線信号
uint16_t openData[99] = {3488, 1720,  454, 412,  454, 1278,  454, 412,  454, 412,  452, 412,  454, 412,  454, 412,  454, 412,  456, 412,  452, 412,  454, 412,  454, 412,  454, 412,  454, 1278,  454, 414,  452, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 410,  454, 412,  454, 1278,  456, 410,  456, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 412,  454, 1276,  454, 410,  456, 1278,  456, 412,  454, 412,  452, 1278,  454, 412,  454, 412,  452, 1280,  454, 412,  454, 1278,  454, 412,  454, 412,  454, 1278,  454, 1278,  454};  // PANASONIC 400401005253
uint16_t closeData[99] = {3508, 1700,  476, 390,  474, 1258,  474, 392,  474, 392,  472, 394,  474, 392,  472, 392,  474, 392,  474, 392,  474, 392,  476, 390,  476, 390,  474, 390,  474, 1258,  474, 390,  474, 392,  474, 390,  474, 392,  474, 392,  474, 392,  474, 392,  474, 392,  472, 394,  474, 1258,  476, 390,  474, 392,  472, 392,  474, 392,  474, 392,  476, 392,  474, 390,  474, 392,  474, 1258,  474, 1258,  476, 390,  474, 1258,  476, 390,  474, 392,  472, 1258,  472, 394,  472, 1258,  474, 1258,  472, 394,  472, 1260,  472, 394,  474, 392,  474, 1258,  474, 1258,  474};  // PANASONIC 40040100D2D3

//オン、オフの指示が来た時に呼ばれる関数を定義
void curtain_open();
void curtain_close();
void light_sw1();
void light_sw2();

char ssid[] = "abcd-1234";       // WiFiのSSIDを入力
char password[] = "1234abcd";  // WiFiのパスワードを入力

//wifi接続の確認用LEDピン(オンボードLED)と赤外線LED用の信号ピンを指定
const int ledPin = 2;
IRsend irsend(19);

//サーボ
Servo servo1;
Servo servo2;

WemoManager wemoManager;

//変数を初期化
WemoSwitch *curtain = NULL;
WemoSwitch *light = NULL;

void setup()
{
  //wifiに接続
  WiFi.mode(WIFI_STA);
  WiFi.disconnect();
  delay(100);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
  IPAddress ip = WiFi.localIP();

  //サーボモーターの信号ピンを指定
  servo1.attach(16);
  servo2.attach(4);

  irsend.begin();
  wemoManager.begin();

  //new WemoSwitch(表示されるデバイス名, ポート, オンになったとき呼び出される関数名, オフになったとき呼び出される関数名);
  curtain = new WemoSwitch("カーテン", 80, curtain_open, curtain_close);
  light = new WemoSwitch("ライト", 81, light_sw1, light_sw2);

  wemoManager.addDevice(*curtain);
  wemoManager.addDevice(*light);

  //セットアップ処理が終わったらledを点灯
  pinMode(ledPin, OUTPUT);
  delay(10);
  digitalWrite(ledPin, HIGH);
}

void loop()
{
  wemoManager.serverLoop();
}

void curtain_open() {
  //関数実行中は確認のためledを消して念のため5回信号を送信
  digitalWrite(ledPin, LOW);
  for (int i = 0; i <= 5; i++) {
    irsend.sendRaw(openData, 99, 38);
    delay(50);
  };
  digitalWrite(ledPin, HIGH);
}

void curtain_close() {
  //関数実行中は確認のためledを消して念のため5回信号を送信
  digitalWrite(ledPin, LOW);
  for (int i = 0; i <= 5; i++) {
    irsend.sendRaw(closeData, 99, 38);
    delay(50);
  }
  digitalWrite(ledPin, HIGH);
}

void light_sw1() {
  //関数実行中は確認のためledを消してサーボを動かす
  digitalWrite(ledPin, LOW);
  servo1.write(0);
  delay(500);
  servo1.write(90);
  digitalWrite(ledPin, HIGH);
}

void light_sw2() {
  //関数実行中は確認のためledを消してサーボを動かす
  digitalWrite(ledPin, LOW);
  servo2.write(0);
  delay(500);
  servo2.write(90);
  digitalWrite(ledPin, HIGH);
}

完成

設置したらこんな感じです。

結構いい感じじゃないですか?

f:id:moyoi:20200506095622j:plain
完成図1
ちなみに上の4ピンコネクタが赤外線LEDにつながってます
f:id:moyoi:20200506100347j:plain
なんだかかわいそうな赤外線LED
なぜ4ピンなのかというと2ピンの在庫が全然なかったからです。

蓋をつけるとこんな感じ(ネジなかったので両面テープで固定してます)

f:id:moyoi:20200506095735j:plain
完成図2

エアコンのリモコンケースをつけるとこんな感じ

f:id:moyoi:20200506095906j:plain
完成図3
なんか異様に飛び出してて少し違和感ありますが、まあしょうがない


ということで、なかなか満足できる出来に仕上がったと思います!

しかしながら赤外線LEDとかは基板丸出しですので気が向いたらケースを作ってあげましょう


ちなみにかかった値段は、新しく買ったもので

ESP32 1000円

サーボ 1200円

赤外線LED 300円

合計2500円でした!