気の向くままに辿るIT/ICT/IoT
IoT・電子工作

ESP-01/12/ESP32でスマートコンセントを作る

ホーム前へ次へ
ESP8266って?

ESP-01/12/ESP32でスマートコンセントを作る

ESP-01/12/ESP32でスマートコンセントを作る

2018/08/11

 ESP8266/ESP-WROOM-02/ESP-WROOM-32でスマートコンセントを自作してみるページ。

 と言っても外観は検証用試作レベルですが、任意のAC 100V家電をコンセントに挿し込むことでスマホやタブレット、パソコンのブラウザからON/OFFできるので、これらを詰め込めば、それなりの立派なスマートコンセントになります。

 先日作ったESP-01/12/ESP32によるスマートリモコンと合わせれば、あらゆる家電がIoT家電に...。

 以前作ったArduinoとリレーによる100V家電制御回路でArduinoをESPチップ・ボードに代えたらWiFi越しに操作できて便利だよねと思って作ったのですが、前回のスマートリモコン同様、作ってみてから、これってスマートコンセントとか、スマートプラグって言うのか...と気づくという...。

 これなら、スマホなどで外から操作も可能、スマートスピーカーであるGoogle Home、各種Amazon Echo(Alexa)のスマートホームに対応していそうで[Routines/定型アクション]でも使えそう。(現時点カスタムは定型で使えないらしい。)

 一方、ESPチップ・モジュールでも設定次第で外からも操作可能だし、esp8266-alexa-wemo-emulatorを作って下さった強者もおり、おかげでAlexa定型アクションでも使えるし、ESPチップ・モジュールで作れば、スマホアプリ不要でパソコンのブラウザでもいける...。

 今回は、ESP-01を使いましたが、これでできるということは、上位機種のESP-02...、ESP-12...、ESP-WROOM-02、ESP32などESP-xxでも、これら開発ボードでもできるということで。

 と言いつつ、ESPシリーズの内、日本の技適を通っているのは、いまのところ、ESP-WROOM-02/ESP-WROOM-32(とこれらを搭載した開発ボード)のみですが。

 何れにしても最も手軽で手間がなく、限りなく悩みどころが少ないのは、開発ボードです。

前提

 Arduino IDEが利用できることは、もちろん、ESP8266やESP32をArduino IDEで使えるようにしておくこと。

 ESP-01やESP-02〜ESP14などのESP8266チップなら、Arduino IDEの[ツール] => [ボード]から[Generic ESP8266 Module]を選択、ESPモジュールにスケッチをアップロードできる状態であること。

 ESP32なら、[espressif/arduino-esp32]の要領でESPモジュールにスケッチをアップロードできる状態であること。

 ちなみにこれらArduino IDEの環境設定で追加する方法の場合、カンマ区切りで複数指定可能。

 参考までに自身の使用しているOSは、Debian(Linux)、Arduino IDEのバージョンは、1.8.5。

開発ボードの場合[2019/05/14追記]

 尚、ESP8266やESP32の開発ボードである場合、先のようにArduino IDEで利用可能にするとボード情報に様々な関連ボードが追加されるので、使うボードに適したものを選択することになるわけですが、例えば、次のようになります。

 ESP8266 NodeMCUボードなら、Arduino IDEの[ツール] => [ボード]から[NodeMCU 0.9 (ESP-12 Module)]や[NodeMCU 1.0 (ESP-12E Module)]などを選びます。

 ちなみにESP8266 NodeMCUボードについては、ボード上のピン番号(D0-D8)と実際のGPIOが異なるのでプログラム・スケッチを書く場合、標準でインクルードされる模様のpins_arduino.hの定義に沿って指定します。

 また、ESP32 DevKitCやDevKitボードなら、[ESP Dev Module]を選びます。

 開発ボードについては、あとは基本的にArduinoボードと同様にスケッチをアップロード、電源としてUSBケーブルをつなぐか、VIN(5V)/G(ND)に5Vを供給して組んだ回路を実行するだけです。

必要なモノ

 前述の通り、今回のケースでは、WiFiモジュールはどれでもよいですが、ESP-01を使いました。

スマートコンセント側
家電側(任意)

 Amazonマーケットプレイス&100円ショップ相場で一部電子部品などは単価割したとして今回使った家電側込みで約2000円程度かと。

 今回、スマートコンセント側については、USBシリアル変換モジュールには、後述のFTDIモジュールを、昇圧モジュールには、MT3608を、リレーには、1チャンネルのオプトカプラ付きHigh/Lowレベルトリガー切り替え機械式タイプを使いました。

 また、家電側については、USB充電器は216円、電源タップの値段は長さによる、USB接続のLED電球は108円ながらあるか否かは店舗にもよりますが、3点ともダイソー(100均)で買うこともできるでしょう。

ESP-01/ESP-12Fへのスケッチのアップロード準備

 ESP-01や開発ボード以外のESP-12Fにプログラムをアップロードするには、USBポートを備えたCP2102やFTDI系のシリアルUSB変換モジュールを併用する必要があります。

 尚、USBポートを備えた開発ボードではないESP-01〜ESP-14単体及びブレイクアウトボード(≒ピッチ変換基板)との組み合わせは、全て同様にシリアルUSB変換モジュールを要します。

 ESP-01の定格電圧は3.3VなのでシリアルUSB変換モジュールも3.3V専用か3.3V/5V兼用なら3.3Vに切り替えて接続します。

 尚、ESP-01や開発ボード以外のESP-12Fは、プログラム書き込み時と実行時、ESP-01では、RSTとGPIO0のHIGH/LOWを巧みに切り替える、ESP-12では、GPIO00/GPIO15をLOWにする一方、実行時には、GPIO00はHIGHにしておく必要がありますが、RTS/DTRピン(ホール)のあるFTDIモジュールなら、これらにESP-01のRST/GPIO0をそれぞれ、ESP-12ではRESETを接続することで自動でアップロードできる為、これを使うことをおすすめします。

 ただ、これらRTS/DTR、ブレッドボード上でピンホールにジャンパワイヤを挿す場合、ピンヘッダや3.3V/5V切り替え用ジャンパピンのハンダ部が隆起しているのですが、ピンホールが、この付近にある為、USBシリアル変換モジュール並びに挿したジャンパワイヤを手でうまく押さえる必要はあるでしょう。

 なんなら、手で持った方が、安定するでしょう。

 ちなみにESP-01については、SPIFFSを使おうにもフラッシュメモリ容量の関係でArduinoOTAは難しい模様。

ESP-12FTDI別電源
RXTX-
TXRX-
RESETRTS-
GPIO00-マイナス
GPIO02-プラス
GPIO15-マイナス
CH_PC-3.3V
VCC-3.3V
GNDマイナス
ESP-01FTDI別電源
RXTX-
TXRX-
RSTRTS-
GPIO0DTR-
CH_PD-3.3V
VCC-3.3V
GNDマイナス

 また、パソコンのUSBは最大500mAと大丈夫そうに思えるし、実際、たいていの場合、書き込みできますが、往々にしてWiFiモジュールは多くの電流を必要とすることがあり、ESP8266も300mAを超えることもあるとのことなのでそれらが要する電流量不足やパソコンのUSBポートの損傷回避などを考慮し、実行時はもちろんのこと、書き込み時も念の為、別電源をとった方がよさ気。

 尚、検証・運用時には、元電源が3.3Vだと過電流により2V程度まで電圧降下し、ESP8266にリセットがかかり、WiFi接続が途切れるなどの状況になる可能性があるので5Vから降圧、更に電圧降下に耐え得るよう、より短時間で通常電圧に戻る負荷過渡応答特性に優れた電圧レギュレータを使う必要がありそう。

 全ての回路で同じとは限りませんが、とある回路を作って9V電池で動かしてみたところ、7V切ったあたりで動作が不安定になり、電池を交換したら正常になりました。

 ただし、これは、ESP-01やESP-xx+ピッチ変換基板での話であって、開発ボードについては、何らかの対策が講じられているようで、この必要はなさそうです。

回路

ESP-01FTDI昇圧モジュールリレーモジュール別電源
RXTX---
TXRX---
GPIO2-VIN+--
CH_PD---3.3V
VCC---3.3V
GNDVIN--マイナス
(3.3V側)
-VOUT+DATA-
-VOUT--マイナス
(5V側)
--DC/IN+5V
--DC/IN-マイナス
(5V側)

 ESP-01の信号出力用ピンには、GPIO2を使いました。

 昇圧モジュールやリレーモジュールの端子名などはモノによるかもしれませんが、適宜読み替えてください。

 今回、リレーには、電気的に絶縁したオプトカプラ付きでHIGH/LOWをジャンパピンで切り替えできる(High/Low level triger)で、かつ、NC(Normal Close)/COM(Common)/NO(Normal Open)の出力端子台のあるモジュールをHigh側(LOWからHIGHになった時ON)、かつ、COM/NO(通常OFF)として使いました。

 5Vと3.3Vは、ブレッドボード用電源の両側を、それぞれ5Vと3.3Vとして使いました(が、手持ちのリレーは3.3VでもON/OFFできたので逆流防止にダイオードを入れておけば電源を1系統にしてもよいかもしれません[2019/04/18追記])。

 運用・実行時、USBシリアル変換モジュールは、シリアルモニタで確認する場合には配線が必要ですが、そうでなければ外しても構いません。

 また、リレーモジュールの入力電圧が3V程度を許容し、かつ電圧降下がない、または影響がないくらいの入力電源であれば、昇圧モジュールも不要。

 その場合、ここで言うところのGPIO2をそのまま、リレーのDATAに、別電源の3.3V/GNDをリレーのIN+/IN-に接続すればよいでしょう。

 コンセント側の加工とリレーモジュールとの接続に関しては、Arduinoでリレーを使ったAC100V家電操作を参照。

スケッチ

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>
 
const char *ssid   = "XXXXX";
const char *password = "YYYYY";
 
const int power = 2;
 
ESP8266WebServer server ( 80 );
#define SOFTAP_SSID "ESP1B"
#define SOFTAP_PW "blackversion01"
 
void setup() {
 Serial.begin(115200);
 WiFi.begin(ssid, password);
 Serial.println("");
 // AP+STAモードの設定
 WiFi.mode(WIFI_AP_STA);
// WiFi.mode(WIFI_STA);
 // APとして振る舞うためのSSIDとPW情報
 WiFi.softAP(SOFTAP_SSID, SOFTAP_PW);
 Serial.print("Connecting to ");
 Serial.println(SOFTAP_SSID);
 Serial.println("----------");
 
 //wait for connection
 while( WiFi.status() != WL_CONNECTED){
  delay(500);
  Serial.print(".");
 }
 Serial.println("");
 Serial.print("Connected to ");
 Serial.println(ssid);
 Serial.print("IP address: ");
 Serial.println(WiFi.localIP());
 
 server.on("/",handleRoot);
 server.onNotFound(handleNotFound);
 
 if (!MDNS.begin("espsmartp")) {
  Serial.println("Error setting up MDNS responder!");
  while(1) {
   delay(1000);
  }
 }
 Serial.println("mDNS responder started");
 
 server.begin();
 Serial.println("HTTP server started");
 
 // Add service to MDNS-SD
 MDNS.addService("http", "tcp", 80);
 pinMode(power, OUTPUT);
 digitalWrite(power, HIGH);
}
 
void loop() {
 server.handleClient();
}
 
void handleRoot() {
 char temp[800];
 char message[20];
 String(server.arg(0)).toCharArray(message,20);
 
 if(server.arg(0).indexOf("ON") != -1){
  Serial.println("ON");
  digitalWrite(power, HIGH);
  delay(20);
 }
 else if(server.arg(0).indexOf("OFF") != -1){
  Serial.println("OFF");
  digitalWrite(power, LOW);
  delay(20);
 }
 
 snprintf ( temp, 800,
 
"<html>\
 <head>\
  <title>ESP8266 Smart Plug Demo</title>\
  <style>\
   body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
  </style>\
 </head>\
 <body>\
  <h1>ESP8266 Smart Plug DEMO</h1>\
  <form action=\"/\" method=\"post\" style=\"width:300px;\">\
   <input type=\"submit\" name=\"button1\" value=\"ON\" style=\"width:30%; height:100px;\">\
   <input type=\"submit\" name=\"button2\" value=\"OFF\" style=\"width:30%; height:100px;\">\
  </form>\
 </body>\
</html>",
 
  message
  
 );
 server.send ( 200, "text/html", temp );
}
 
void handleNotFound() {
 
 String message = "File Not Found\n\n";
 message += "URI: ";
 message += server.uri();
 message += "\nMethod: ";
 message += ( server.method() == HTTP_GET ) ? "GET" : "POST";
 message += "\nArguments: ";
 message += server.args();
 message += "\n";
 
 for ( uint8_t i = 0; i < server.args(); i++ ) {
  message += " " + server.argName ( i ) + ": " + server.arg ( i ) + "\n";
 }
 server.send ( 404, "text/plain", message );
 
}
 

 少なくともssid/passwordは、社内・宅内のものに変更のこと。

 ESP-8266/ESP-WROOM-02/ESP-WROOM-32は、Arduinoの代わりにも使え、Arduino IDEも使えるから、今回もスケッチは、ESP-01にのみ書いてアップロードするだけでよいでしょう。

 SoftAP/STAモードとし、社内・宅内の無線LANに接続、ESP-01にWebサーバーを立て、DHCPでIPアドレスを払い出してもらいつつ、mDNSで常にホスト名(ここでは[espsmartp]).localでアクセスできるようにしました。

 よって何らかのシリアルモニタ、ifconfig、ipconfig、nmapなどのIP探索コマンド、pingコマンドなどの疎通確認コマンド、GUIの有線・無線LAN一覧取得ソフトウェアなどでIPアドレスやSSIDを確認できるようにしておくとブラウザを開く前に接続が確立しているのか否かの確認などもでき、何かと都合が良いでしょう。

[2019/04/30 訂正・追記:]
 勘違い...、APモードにする(Soft_APを立てる)必要はありませんでした。

[2019/05/12 訂正・追記:]
 スケッチのsetup(){}にdigitalWrite(power, HIGH);を入れ忘れてました...。
 必要な理由は、HIGH/LOW不定だと(リレーのタイプによってコンセント挿したらずっとONになるなど)困るから、HIGHとしたのは、使用したリレーモジュールがLow Level Triger(HIGH => LOWでON)だった為でHigh Level Trigerだった場合には、ここはLOWにします。

電源

 本来、電源は、2系統個別に用意した方がよいようにも思いますが、今回は、一応2系統ですが、MB102ブレッドボード用電源の両側2系統をそれぞれジャンパピンを3.3V、5Vに挿し使いました。

リレーモジュールのNC/COM/NO出力

 リレーモジュールには、NC(Normarlly Close・通常ON・回路閉)/COM(Common・共通)/NO(Normarlly Open・通常OFF・回路開)でNC/COM、NO/COM何れも使えるタイプのものがあり、今回のリレーモジュールもこのタイプでNO/COMとしました。

リレーモジュールのHIGH Level TrigerとLow Level Triger

 リレーモジュールには、HIGH Level Triger(信号がLOWからHIGHに切り替わるとON)とLow Level Triger(信号がHIGHからLOWに切り替わるとON)、または、これらを切り替えられるタイプがあります。

 スケッチ上のHIGH/LOWは、これらに合わせておく必要があります。

実行

ESP8266スマートプラグ/スマートコンセントDEMOブラウザ画面

 ホスト名等を変更していなければ、社内・宅内WiFiに接続したスマホ、タブレット、パソコンのブラウザのURL入力欄に[espsmartp.local]と入れると[ESP8266 Smart Plug DEMO]というタイトルに加え、ON/OFFのボタンが表示されます。(ボタンがつぶれてるけど気にしない。)

 やはり、SPIFFSでメモリ上にHTMLファイルを置いたほうが、よいでしょう。

ESP8266スマートプラグ/スマートコンセントON

 ブラウザ上のONボタンをタップ・クリックすると今回、AC100V家電側に使ったLED電球が点灯します。

ESP8266スマートプラグ/スマートコンセントOFF

 ブラウザ上のOFFボタンをタップ・クリックするとLED電球が消えます。

 これで当該無線LANの電波が届く範囲なら、どこでも無線でON/OFFできます。

 もちろん、LED電球に限らず、AC100Vのコンセントにつないで使うON/OFFスイッチやこれに相当するスイッチがあるものなら、なんでもON/OFF可能(リレーでON/OFFするので家電の方は、ON状態にしておきます)。

AC/DCコンバータ

[2019/04/18]

 よく考えたら、このままだと家電用のコンセントの他にESP8266用の電源が必要になることに気づき、発注済みで今日届いたAC/DCコンバータの動作確認も完了しました。

 また、先日、数種のコンセントも買っておきましたし、部品取りしたACプラグ付きコンセントケーブルも数本あります。

 たぶん、これで壁面などのコンセントからとるAC 100Vでコンセント側とESP8266側の電源を賄うことができるはず。

 要は、USBポートも備えたコンセントと同じような構成になると思います。

 というわけで何か適当なケースを見繕って近い内に組み込んでみたいと思います。

 尚、ESP8266/ESP32は、チップやピッチ変換基板との併用ではなく、若干場所はとるにしてもNodeMCUやDevKit/DevKitCなどの開発ボードを使った方が、面倒がなく、遥かに簡単にできると思います。

AC/DCコンバータを使ったESP8266スマートプラグ/スマートコンセント
[2019/04/20]

 想定通り、AC/DCコンバータを使えば、AC100V1回線の入力でESP8266/ESP32と家電側に電源供給でき、スマートプラグとして機能することは確認できました。

 以前、WiFiだけは、最初にUSBケーブルを...WiFi接続後は、USBケーブルを抜いても機能するといった情報を見かけたのですが、情報が古かったのか、電池駆動などの場合だったのか、その必要はありませんでした。

 迂闊にも今回は、5V駆動のリレーモジュールしか手持ちがなく、これを使ってしまった関係でAC/DCコンバータからの5VをリレーとESP8266/ESP32に分岐したり、ESP8266/ESP32の信号線用に昇圧回路が必要となったのですが、そもそも3V駆動のリレーにすれば、これが要らないので構成もシンプルでこじんまり収めることができるでしょう。

 あ、赤いブレッドボードの手前にあるESP開発ボード、立ってて見づらかった...。

 サーキュレーターなどをしばらく動かしていると電圧降下なのか、配線上の接触不良なのか、100V側で使った配線が細いのか、不安定な感じがしなくもありません。

 何れにせよ、100Vは感電すると怖いので、やってみるにしても十分注意の上、自己責任でお願いします。

はんだ付けでよりコンパクトになった自作ESP8266スマートプラグ/スマートコンセント
[2019/04/29]

 ユニバーサルボードすら使わず、はんだ付けしてみたところ、こんな感じになりました。

 100均セリアのトレカケースに入ればと思いましたが、ちょっと微妙なのでケースは再考。

 ただ、リレーが3.3V版であれば、昇圧モジュールも要らず、ESPボードもピンヘッダなしなら、配線の長さも考慮すれば、コンセントにプラスアルファ程度のサイズに収まりそうでトレカケースより小ぶりでもよさそうです。

 ちなみにWiFiチップは、結構熱をもつので誤動作回避のためにもケースに入れるのであれば、適度な通気口が必要でしょう。

 尚、このESP8266/ESP32スマートコンセントは、なぜか、初回起動時、リセット直後のみ、一時的に電源がONになりますが、数秒でOFFになります。

 この回路の概要は次の通りです。

 今回、コンセントプラグ付きのケーブルは、壊れた家電から部品取り(切断)したものを使いましたが、100均の延長コードを切って使ってもよいでしょう。

 ケースなしでAmazon/Amazonマーケットプレイス価格で開発ボードがESP8266 NodeMCUなら2500円前後、ESP32なら3000円前後、というか、AC/DCコンバータが高い...Aliexpressだとこれの3〜4割といったところでしょうか。

 というか、Amazonマーケットプレイス、電子工作部品を扱う店が、かなり増えてる気が...自身が買ったことのない店なら安いものも。

 あとケーブル・配線コードは極々少量なのでともかく、角型コンセント(1口)ですが、Amazonだと高い...メーカーにこだわらなければ、近所のホームセンターですら、もっと安かったです。

ESP+サーボモータでON/OFF

 視点を変えれば、Arduinoとサーボモータで物理スイッチをON/OFFという方法もあり、ArduinoをESPに代えれば、無線で操作でき、信号線は1本あれば良いため、ESP-01でもOK。

備考

 スリープモードについては、ESP-01/12/ESP32でスマートリモコンを参照。

 ただ、ESPがやたらリセットがかかることがあったりして、やや不安定...電流不足...独立した別電源にすれば解消するか...?

[2019/04/18追記]
 電源問題もNodeMCUやDevKit/DevKitCなどの開発ボードなら心配には及ばないと思います。

[2019/02/15]

 スマートリモコンにしてもスマートプラグにしても、ここでやったようにESP8266をWebサーバとしても兼ね、特定のURLにアクセスすることである機能を実行するように作ってあると自作スマートスピーカーでテレビを音声操作のように簡単なスクリプトを作ってスマートスピーカーから音声操作することも容易にできます。

ホーム前へ次へ