気の向くままに辿るIT/ICT/IoT
webzoit.net
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家電に...。

【Amazon Alexa認定取得製品】 TP-Link WiFi スマートプラグ 遠隔操作 直差しコンセント Echo シリーズ Googleホーム対応 音声コントロール コンパクト ハブ不要 3年保証 HS105

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

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

Echo Plus (エコープラス)、 スマートホームハブ内蔵 - スマートスピーカー with Alexa、ブラック

Echo Spot (エコースポット) - スマートスピーカー with Alexa、ブラック

Echo (エコー) - スマートスピーカー with Alexa、チャコール (ファブリック)

Echo Dot (エコードット) - スマートスピーカー with Alexa、ブラック

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

Rasbee ESP8266 ESP-01 LWIP AP+STA シリアル WIFI無線モジュール

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

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

HiLetgo ESP32 ESP-32S NodeMCU開発ボード2.4GHz WiFi + Bluetoothデュアルモード

waves ESP32-DevKitC ESP-WROOM-32 ESP32 DevKitC V2 WiFi BLE 技適取得済 国内発送

waves ESP-WROOM-32 + 開発基盤 セット 国内発送

waves ESP8266 WiFiモジュール(技適取得済み) ESP-WROOM-02 キット 赤基盤

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《シンプル版》

[スイッチサイエンス] ESP-WROOM-02ピッチ変換済みモジュール《フル版》

HiLetgo 2個セット ESP8285 ESP-M2 CH340開発ボード WIFIシリアルポートモジュール CH340 ESP8266に対応

HiLetgo® 2個セット ESP8266 NodeMCU LUA CP2102 ESP-12E モノのインターネット開発ボード ESP8266 無線受信発信モジュール WIFIモジュール Arduinoに適用 [並行輸入品]

HiLetgo OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F Arduino IDE UNO R3に対応 

Rasbee WeMos D1 R3 簡易デザイン WiFi 開発ボード NODEMCU LUA ESP8266 Arduino UNO 適用 1個 [並行輸入品]

Rasbee OTA WeMos D1 CH340 WiFi 開発ボード ESP8266 ESP-12F For IDE UNO R3 Arduino用 1個 [並行輸入品]

Rasbee アップグレード版 WeMos D1 R2 WiFi UNO 開発板 ESP8266 Arduino 1個 [並行輸入品]

前提

 Arduino IDEの[ツール] => [ボード]から[Generic ESP8266 Module]を選択、ESPにスケッチをアップロードできる状態であること。

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

必要なモノ

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

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

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

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

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

Rasbee ESP8266 ESP-01 LWIP AP+STA シリアル WIFI無線モジュール

Rasbeeオリジナル FT232RL互換 3.3V/5V FTDI/USB/TTL変換アダプタ

iBUFFALO USB2.0ケーブル (A to miniB) スリムタイプ ホワイト 1m BSUAMNSM210WH

KKHMF 5PCS MT3608 DC-DC 2A Boost ステップアップ 転換モジュール 2V-24V to 5V-28V 9V 12V 24V

KKHMF G3MB-202P SSR/ソリッドステートリレーモジュール 5V 1チャネル(抵抗/ヒューズ付き)

SODIAL(R) DC24V 1チャネルオプトカプラドライバ リレーモジュールボード 赤

【ノーブランド 品】DC5V-5W パワード USB LED 電球 ポータブル ランプ ラップトップ アウトドア用

パナソニック スマートフォン対応USB出力ACアダプター QE-AP108-W

ヤザワコーポレーション 延長コード 1個口 1m ホワイト

Rasbee 400穴 ブレッドボード 8.5*5.5cm 1個

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 5個セット

HiLetgo 400穴 ブレッドボード 8.5*5.5cm 10個セット

KKHMF 3本 20CM セット ブレッドボード・ジャンパーワイヤー ジャンパー線/ケーブル オス-オス/オス-メス/メス-メス Arduino Raspberry pi 用

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に切り替えて接続する。

Rasbeeオリジナル FT232RL互換 3.3V/5V FTDI/USB/TTL変換アダプタ

 尚、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切ったあたりで動作が不安定になり、電池を交換したら正常になった。

EasyWordMall 3.3V 5V MB102ブレッドボード用 電源モジュール パワーモジュール

KKHMF MB102ブレッドボード電源モジュール3.3V 5V Arduino Boardハンダ無しブレッドボード用

9V 電池ボックス DCケース5.5*2.1  スイッチ&背面カバーとプラグイン

uxcell バッテリコネクタ 5.5x2.1mm 9Vバッテリー用 接続バッテリー 4個入り

アルカリ乾電池 9V 1本 6LR61/B1P/V

SUCCUL ACアダプター 12V 1A センタープラス スイッチング式 最大出力12W 出力プラグ外径5.5mm(内径2.1mm)PSE取得品

回路

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)モジュールを使った。

 5Vと3.3Vは、ブレッドボード用電源の両側を、それぞれ5Vと3.3Vとして使った。

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

 コンセント側の加工とリレーモジュールとの接続に関しては、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);
}
 
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を確認できるようにしておくとブラウザを開く前に接続が確立しているのか否かの確認などもでき、何かと都合が良いだろう。

電源

 本来、電源は、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とした。

実行

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電球に限らず、コンセントにつなげば電源が入るものなら、なんでもON/OFF可能。

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

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

備考

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

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

関連リンク

ウェブ造ホーム前へ次へ