エアコンをスマホで遠隔操作できるようにリモコンを魔改造
我が家のエアコンにはスマホで操作する機能なんて付いてないので、後付けでスマホで操作できる機能を付けてみたいと思います。
今回やることをまとめると、
- ESP WROOM02をサーバー化
- スマホからESP内のhtmlページにアクセス
- ページ内のボタンをタップするとGPIOの出力が切り替わる
- GPIOでエアコンのリモコンのスイッチをオン / オフさせる
つまり、リモコンの魔改造ってことです!
ちなみに、以前赤外線でエアコンを操作する工作もやっていますが、リビングのリモコンが赤外線じゃなかったので対応できませんでした。
リモコンを分解
電源のオン / オフを切り替えるだけのサブのリモコンがあるので、これを改造してみたいと思います。
スイッチはオンとオフが別々です。
トグル式だと現在の状態の検出が面倒だったのですが、これならGPIO2つで制御するだけでいいので簡単です。
リモコンの改造
リモコンのオン/オフスイッチは、押した時にGNDにショートさせてLowを出力させています。
これをリモコン内のマイコンのGPIOで読み取って、オン/オフの信号をRFで本体に送っています。
なので、このスイッチ部分にESP WROOM02のGPIOを割り込ませることで、スイッチを押したのと同じ状態を作り出せば制御できるはずです。
改造後の回路図
ESPのGPIO14をオン信号、GPIO12をオフ信号としてプッシュスイッチに割り込ませます。
スイッチの代わりにするので、GPIOの出力はオープンドレインに設定しておく方が安心です。
リモコンは電池を電源としていましたが、ESPのV33から供給してしまって、電池なしにします。
実際に改造してみた
まずはスイッチのGNDと反対側の端子から線を引き出します。
これをESP WROOM02のGPIO端子に接続します。
また、リモコンの電源は単三電池✖️2シリだったので、ESPの3.3V電源から供給します。
Arduinoスケッチ
WiFi経由でESPを制御できるようにArduinoでスケッチを書いていきます。
#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#define WIFI_SSID "自分のWiFiのSSID"
#define WIFI_PWD "自分のWiFiのパスワード"
ESP8266WebServer server(80);
#define onPin 14
#define offPin 12
void switch_handler() {
String html;
html = "<!DOCTYPE html>";
html += "<html lang='ja'>";
html += "<meta charset=\"utf-8\">";
html += "<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">";
html += "<head>";
html += "<title>エアコンスイッチ</title>";
html += "</head>";
html += "<body>";
html += "<style>";
html += "section {max-width: 480px; margin: 0 auto;}";
html += "h1 {font-size: 32px; text-align: center;}";
html += ".btn-on {background:#5582ff; width: 60%; height: 80px; display:block; margin: 50px auto; padding: 0;}";
html += ".btn-on a, .btn-off a {color:#fff; text-decoration:none; font-size: 22px; width: 100%; display: block; line-height: 80px;}";
html += ".btn-off {background:#d00080; width: 60%; height: 80px; display:block; margin: 0 auto; padding: 0;}";
html += "</style>";
html += "<section>";
html += "<h1>エアコンスイッチ</h1>";
html += "<button class='btn-on'><a href=\"/?switch=on\">オン</a></button>"; //パラメータの送信
html += "<button class='btn-off'><a href=\"/?switch=off\">オフ</a></button>"; //パラメータの送信
html += "</section>";
html += "</body>";
html += "</html>";
html += "";
if (server.hasArg("switch"))
{
if (server.arg("switch").equals("on"))
{
digitalWrite(onPin, LOW);
delay(500);
digitalWrite(onPin, HIGH);
}
else if (server.arg("switch").equals("off"))
{
digitalWrite(offPin, LOW);
delay(500);
digitalWrite(offPin, HIGH);
}
}
server.send(200, "text/html", html);
}
void NotFound(void) {
server.send(404, "text/plain", "Not Found");
}
void setup() {
Serial.begin(115200);
pinMode(onPin, OUTPUT_OPEN_DRAIN);
pinMode(offPin, OUTPUT_OPEN_DRAIN);
digitalWrite(onPin, HIGH);
digitalWrite(offPin, LOW);
delay(1000);
digitalWrite(offPin, HIGH);
WiFi.begin(WIFI_SSID, WIFI_PWD);
Serial.println("");
while(WiFi.status() != WL_CONNECTED){
delay(1000);
Serial.print(".");
}
Serial.println("");
Serial.println("Connected!");
Serial.print("IP Address: ");
Serial.println(WiFi.localIP());
server.on("/", switch_handler);
server.onNotFound(NotFound);
server.begin();
}
void loop() {
server.handleClient();
}
このコードの詳細解説については、こちらの記事でしています。
動作確認
プログラムを実行し、接続が確立されるとIPアドレスがコンソールに出力されます。
このIPアドレスにブラウザでアクセスしてみましょう。
このようにスマホのブラウザ上にhtmlで作成したスイッチが表示されました。
スイッチをタップした時の動作を確認します。
オシロスコープでESPのGPIO出力をモニタしています。
エアコン本体もオン/オフが切り替わることを確認しています。
外出先から操作するには
外出先からESP8266を操作するためには、外のネットワークからESP8266に接続できるようにする必要があります。
そのためにはポートを解放する必要がありますが、そうすると誰でもアクセスできるようになってしまい、セキュリティ面での不安があります。
もちろん、安全にアクセスできるようにする方法もありますが少し面倒です。
MQTTを使ってESP8266を制御することでポートを解放せずに制御できるようになるので、こちらの方が簡単だと思います。
BeebotteというMQTTブローカーを使ってやってみたので、こちらの記事も見てみてください。