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

ESP-01/12/ESP32で赤外線リモコン家電をWiFi操作

ホーム前へ次へ
ESP8266って?

ESP-01/12/ESP32で赤外線リモコン家電をWiFi操作

ESP-01/12/ESP32で赤外線リモコン家電をWiFi操作

2018/08/01

 Wi-Fi(wifi)モジュールESP8266の内、ESP-01を使ってAC100V含む赤外線リモコン対応家電を無線でブラウザから遠隔操作できる装置を自作してみるページ。

 何をバカな、赤外線リモコンの時点で無線じゃないか...。

 それは尤もなのですが、その上にWi-Fiが使えることで赤外線LED回路さえ、当該家電のそばにあれば、無線が届く範囲なら家具があっても壁があっても、つまり、他の部屋でも、Blynkなんかを絡めれば、外からでも...遠隔操作ができるようになり、非IoT家電をIoT家電風にすることができる...よね?という話。

 スケッチは追記修正させて頂きましたが、ESPr IR赤外線リモコンの使い方をそのままに、ライブラリには、IRremoteESP8266を使わせて頂き、ESPボードには、ESP-01を使用しました。

 今回は、TV(Sharp AQUOS)の電源のON/OFFのみ試してみましたが、ESPチップのメモリの許す限り、様々な操作を追加することが可能...mDNS、SPIFFSも取り入れ、とりあえず、ESP-01でもAQUOSリモコンの主なボタン類(チャンネルやdボタン、番組表...など)28ボタンを登録・操作することができることは確認済み。

 ただ、これが勘違いでなければ、WiFi 2.4GHz帯は、近隣とチャンネルを分け合うのでIoTガジェットをSoftAPモードで多用すると回線混雑を招く恐れもあり、STAモードの利用が望ましいと思われる一方、STAモードで利用可能な数は、無線LANルーターやアクセスポイントの接続可能数の制約を受けるものと思われ、SoftAP/STAモードもAPモード多用は回避した方がよいでしょうが、仮にこれを使うとした場合でも、無線LANルーター/AP => STA/SoftAP => STA/SoftAP...のような接続が可能だったとして接続可能デバイス台数は、AP/SoftAPごとの接続可能数分だけ増えるのか、上流のAPやSoftAPの接続数制限が上限となり、そもそも下流に接続できるSTA/APが制約されるのか...、濃厚だと思われる後者だとすると、この方法だとそれ自体がスマートホーム実現の制約となり得、自由な拡張は望めない可能性があるということになりそう...。

 それとも、もしかしてIoTデバイス程度なら、2.4GHz帯も1人何十個SoftAPしたって、無線ルーターやアクセスポイントも接続数なんて気にしなくたって全然平気で大勢に影響なしなんて朗報があったりする!?それなら有り難いんだけど...。

 あ、気づいてみれば、巷では、これをスマートリモコンと呼んでいるらしい...商品化もされてるってことは、こういった心配は無用?

[2018/08/11追記] 今回作ったESP-01/12/ESP32によるスマートコンセントと合わせれば、あらゆる家電がIoT家電に...。

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

 でも、Bluetooth Low Energy(BLE)入門からすると、やはり、最適解は、BLEってことか...?使い分けされていくのか...?それとも、こういう用途にはWiFiか?

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

 もちろん、上位・後継機種のESP-02、...、ESP-07、...、ESP-12...ESP-14やリンク先モジュールに載っているESP-WROOM-02、この後継ESP-WROOM-32、これらの開発ボードなどでもできるということで。

 ただ、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の環境設定で追加する方法の場合、カンマ区切りで複数指定可能。

 markszabo/IRremoteESP8266などIRremoteESP8266ライブラリをzip、zip展開、gitなどでパスの通ったlibrariesディレクトリに用意しておき、サンプルコードが利用できる状態であること。

 参考までに自身の使用している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モジュールはどれでもよいですが、今回は、ESP8266の中からESP-01を使いました。

必要な電子部品類

 実際に使っているリモコンからの信号受信用は、送信用と同じブレッドボード上でもよいですし、別回路としても可ですが、ESP-01はGPIOは4つあるものの、内3つは、プログラムアップロード時とシリアルモニタ確認・実行時で変更を要するし、残る1つ(GPIO2)も実行時に備えて配線しておくとプログラムのアップ時にエラーになったりするなど、後者の方がシンプルでよいかも。

 ESP8266は、入力電圧定格3.3Vであることを忘れずに。

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-01でもESP-12でも実行・運用時に使用するGPIOピンは、プログラムの書き込みが終わった後に配線しないと書き込みエラーになる場合があるので注意。

USB充電器の個体差に注意[2019/05/28追記]

 開発ボードでUSBポートから電源をとる場合、モバイルバッテリやACコンセント+ACアダプタUSB充電器を使うことになると思います。

 この時、ACアダプタUSB充電器については、同じ型のものでも電圧降下が著しいものもあるようなので個体差に注意が必要そうです。

 自身は、数種の家電用に赤外線発信回路を設置、ACコンセント+ACアダプタUSB充電器+USBケーブルでESP8266/ESP32開発ボードに給電、SPIFFSでそれぞれメニューを用意してある当初すんなり接続できていたはずの2つの内、1つが、稀につながることもあるものの、ほとんどが接続に失敗する状況に。

 原因を探りつつ、いろいろやってみた後、まさかと思い、ACアダプタUSB充電器を交換したところ、すんなり接続できるようになりました。

 試しにUSB電圧/電流計を介し、ケーブル100均の6LEDライトを接続してみたところ、複数あるUSB充電器(何れもダイソー200円商品/スマホ・Android用)が4.95V前後を示す中、接続が不調だったものは、4.65Vでした。

 そういえば、最初に試してから、何度か、USB充電器を他のものに差し替えたりしていました。

 この程度なら影響がないことも多いでしょうが、WiFiチップは、瞬間的にでも消費電力が高くなるため、不十分だったということでしょう。

回路

ESP-12FTDI赤外線LED
フォトトランジスタ
別電源
RXDTX--
TXDRX--
GPIO00--プラス
GPIO02--プラス
GPIO15--マイナス
GPIO05-プラス-
CH_PC--3.3V
VCC--3.3V
GNDマイナス
ESP-01FTDI赤外線LED
フォトトランジスタ
別電源
RXTX--
TXRX--
GPIO2-プラス-
CH_PD--3.3V
VCC--3.3V
GNDマイナス

 改めて書いておきますが、ESP-01のGPIO0/GPIO2、ESP-12のGPIO00/GPIO02/GPIO15については、スケッチで何らかの機能を割り当てる場合、注意が必要です。

 その場合、プログラムアップロード時には、プログラムの書き込みが終わった後、実行・運用時には、WiFi接続後に配線した方がよいでしょう(そうしないとスケッチは書き込み時にはエラーに、デバイスとして使用する際にはWiFiにつながらなくなります)。

 ESP-12を使う場合には、GPIO00をプログラム書き込み時とは異なり、プラスにしておきます。

 ESP-12の赤外線LED/フォトトランジスタ用GPIOは、GPIO05としていますが、GPIO00/GPIO02/GPIO15以外のGPIOピンなら、特に配慮することなく利用できるという理由で任意に選んだものなので他のピンでも構いません。

 信号線と赤外線LEDの間には、妥当な抵抗(ここでは220Ω)を入れ(ないと破裂することがあり)ます。

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

スケッチ/受信時

ESP8266でリモコン信号受信回路

 リモコン信号受信回路は、これで、なんでもよかったのですが、今回は、ESP-12Fを使いました。

 ここで使った3ピンのフォトトランジスタは、受光部から見て右からVCC/GND/GPIOピン(入力用デジタルピン)。

 電源投入時には、RESET(RST)ピンをマイナスに接続し、すぐに外してリセットする必要がありますが、この時、確実を期すため、受光部のGPIOピンを外して行ない(そうしないと、うまくリセットがかからず、受信待機状態にならないことがある)、そしてリセット後、GPIOピンを接続するのが賢明。

Decoded PANASONIC - Address: 555A Value: 555AF148688B (48 bits)
Raw (100): {3418, 1690452, 388448, 1232452, 388450, 1230450, 390452, 1228452, 388448, 1232452, 390450, 1228454, 388452, 1226452, 1228454, 388450, 1230452, 390450, 1230454, 1226454, 1228452, 1230450, 390448, 392450, 392448, 1230448, 392450, 1230450, 390450, 390476, 1204452, 390450, 390448, 392452, 388448, 1232450, 1232448, 392450, 1230450, 392448, 392448, 390448, 1232452, 390422, 418448, 392448, 1230452, 390450, 1230450, 1232450};
DEPRECATED: Please use IRrecvDumpV2.ino instead!
Decoded PANASONIC - Address: 555A Value: 555AF148688B (48 bits)
Raw (100): {3416, 1688450, 392450, 1230450, 392450, 1230452, 390448, 1232452, 390450, 1230452, 388450, 1232450, 390452, 1228448, 1232448, 394448, 1232452, 390448, 1230452, 1228450, 1230450, 1230450, 390452, 390450, 390450, 1230450, 390450, 1230450, 392450, 390450, 1228450, 390448, 392448, 392448, 392448, 1230452, 1230450, 392450, 1230450, 392450, 390448, 392446, 1234450, 390446, 394426, 414452, 1228448, 392450, 1230450, 1230452};
DEPRECATED: Please use IRrecvDumpV2.ino instead!

 リモコンからの信号受信時は、IRremoteESP8266ライブラリのサンプルスケッチ[IRrecvDump]をそのまま使う。([IRrecvDumpV2]も確認済み、SHARP AQUOSに関してはどちらも同様に認識されました。)

 アップロード後、シリアルモニタを開き、リモコンボタンを押して送信信号を確認、後で使うので、とりあえず、テキストエディタにでも貼り付けておくとベター。

 リンク先同様、2018/08/01現在もSharp AQUOSは、PANASONICとして認識されました。(IRrecvDumpV2.inoもSHARP AQUOSに関しては同様。)

 尚、今回のSHARP AQUOS(サンプルスケッチIRrecvDumpで何らかのフォーマットとして認識された場合)では、RAWデータを使うまでもなく、実行時のスケッチには、Address値:555AとValue値:555AF148688Bを書くだけで信号送信でき、TVのON/OFFができました。

 RAWデータしか得られない場合、データ量が増える分、メモリ量にもよりますが、書き込むことができる送信データ量は、きっと減るものと思われます。

スケッチ/実行時

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <IRremoteESP8266.h>
#include <IRsend.h>
 
const char *ssid   = "XXXXX";
const char *password = "YYYYY";
 
ESP8266WebServer server ( 80 );
IRsend irsend(2);
#define SOFTAP_SSID "ESP1B"
#define SOFTAP_PW "blackversion01"
 
void setup() {
 Serial.begin(115200);
 WiFi.begin(ssid, password);
 irsend.begin();
 Serial.println("");
 
 WiFi.mode(WIFI_AP_STA);
 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);
 server.begin();
 Serial.println("HTTP server started");
}
 
void loop() {
 server.handleClient();
}
 
void handleRoot() {
 char temp[800];
 int sec = millis() / 1000;
 int min = sec / 60;
 int hr = min / 60;
 
 char message[20];
 String(server.arg(0)).toCharArray(message,20);
 
 if(server.arg(0).indexOf("Power") != -1){
  Serial.println("Power");
  irsend.sendPanasonic(0x555A,0x555AF148688B);
  delay(10);
  irsend.sendPanasonic(0x555A,0x555AF148688B);
  delay(2000);
 }
 
 snprintf ( temp, 800,
 
"<html>\
 <head>\
  <title>ESP-01 IR Demo</title>\
  <style>\
   body { background-color: #cccccc; font-family: Arial, Helvetica, Sans-Serif; Color: #000088; }\
   form { width: 90% ; }\
  </style>\
 </head>\
 <body>\
  <h1>ESP-01 IR DEMO</h1>\
  <p>Uptime: %02d:%02d:%02d</p>\
  <p>BUTTON :%s</p>\
  <form action=\"/\" method=\"post\">\
   <input type=\"submit\" name=\"button1\" value=\"Power\" style=\"width:30%; height:100px\">\
  </form>\
 </body>\
</html>",
 
  hr, min % 60, sec % 60 ,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 );
 
}
 

 スケッチは、基本、リンク先のものを利用させて頂きましたが、未指定だからか、そのままだと、Soft_APモードだかSoft_AP/STAモードだかになり、Soft_APが無防備な状態で公開されてしまう為、また、ESP-01を使うこともあってGPIOピンを2に変更、信号送信後、delay(2000);を入れるなど、太字の部分を追記・修正しました。

 社内・宅内無線LANのSSID/パスフレーズ、Soft_APのSSID/パスフレーズは適宜書き換えること。

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

[2019/05/28 訂正・追記:]
 ESP32の場合、赤外線送信に対応したライブラリがなさそうなので独自に実装するか、そうしたものを探すか、IFFFT、MQTTなどを介す処理が必要となると思われますが、それはさておき、ESP8266WebServer.h、ESP8266WiFi.hの代わりにESP32WebServer.h、WiFi.hをinclude、ESP8266WebServer server ( 80 );は、ESP32WebServer server(80);とします。

[2019/06/14 訂正・追記:]
 ESP32でも赤外線送信できました

...
#include <Arduino.h>
#include <FS.h>
...
const char* path_root = "/index.html";
...
#define BUFFER_SIZE 16384
uint8_t buf[BUFFER_SIZE];
...
boolean readHTML() {
 File htmlFile = SPIFFS.open(path_root, "r");
 if (!htmlFile) {
  Serial.println("Failed to open index.html");
  return false;
 }
 size_t size = htmlFile.size();
 if (size >= BUFFER_SIZE) {
  Serial.print("File Size Error:");
  Serial.println((int)size);
 } else {
  Serial.print("File Size OK:");
  Serial.println((int)size);
 }
 htmlFile.read(buf, size);
 htmlFile.close();
 return true;
}
...
void handleRoot() {
 ...
 server.send(200, "text/html", (char *)buf);
}
...
void setup() {
 Serial.begin(115200);
 SPIFFS.begin();
 if (!readHTML()) {
  Serial.println("Read HTML error!!");
 }
 WiFi.begin(ssid, password);
 irsend.begin();
 ...
}
...

 尚、ここでは、HTMLを直書きしましたが、ESP-01/12/ESP32でブラウザ(スマホ/タブレット/PC)越しLED制御でもやったようにSPIFFSでメモリにデータを書き込むこともでき、より増えてくれば、尚の事、その方が、スッキリするし、スケッチ自体のためにメモリを節約できます。

 その場合には、太字部分をその位置に追記するだけでよい(はず)。

[2019/05/28 訂正・追記:]
 ESP32の場合、これに加え、SPIFFS.hをインクルードします。

...
#include <ESP8266mDNS.h>
...
void setup() {
...
 Serial.println(WiFi.localIP());
 
 if (!MDNS.begin("ANY_HOST_NAME")) {
  Serial.println("Error setting up MDNS responder!");
  while (1) {
   delay(1000);
  }
 }
 Serial.println("mDNS responder started");
 
 server.on("/",handleRoot);
 server.onNotFound(handleNotFound);
 server.begin();
 Serial.println("HTTP server started");
 
 // Add service to MDNS-SD
 MDNS.addService("http", "tcp", 80);
}
...

 また、今回は、ブラウザから操作を行なうということでAvahiやBonjourをインストールできる余地があるのでESP-01/12/ESP32でmDNSのように常時IPではなくホスト名.localでアクセスすることもできます。

 その場合には、太字部分をその位置に追記するだけでよい(はず)。

[2019/05/28 訂正・追記:]
 ESP32の場合、ESP8266mDNS.hの代わりにESPmDNS.hをincludeします。

 IPアドレスをDHCP任せにするにしてもESP8266でWiFiドアベルの通り、WiFi.softAPConfig()関数を使えば固定することもできます。

 IPアドレスを固定するか、mDNSを使えば、いちいちシリアルモニタなどでIPアドレスを確認する手間を省くことができます。

省電力化・スリープモード

 https://www.espressif.com/sites/default/files/documentation/9b-esp8266-low_power_solutions_en.pdf => ESP8266 Low-Power Solutions(...パスは同じ、ファイル名末尾のsolutionsとen.pdfの間のアンスコが1つ増えただけ...)によれば、ESP8266/ESP-WROOM-02/ESP-WROOM-32には、3種類のスリープモードがあり、数μAの最も省電力なモードは、復帰=リセットであり、いくつかの手順を要しますが、他2つは、自動化か強制かを選択でき、簡単に記述できるとのこと。

 それぞれのモードで何が機能するかはリンク先を参照するとして自動化できる2つのモードは、下記の記述を加えるだけでよさ気。

...
// Modem-sleepモード設定(自動復帰)
wifi_set_sleep_type(MODEM_SLEEP_T);
...

 1つは、主にCPUパワーを必要とするアプリケーション用で安定期の平均電流?15mA程度のModem-sleepモード。

 自動化させるコードは、これ。

 Modem-sleepモードに関しては、復帰も自動でユーザーは何もする必要がないとのこと。

 つまり、スリープも復帰も自動。

 強制モードについては、リンク先参照。

...
// Light-sleepモード設定(復帰は別途コーディング)
wifi_set_sleep_type(LIGHT_SLEEP_T);
...

 もう1つは、Modem_Sleepモードと似ていますが、加えてクロック回路とWiFi回路をOFF、CPUをサスペンド状態とした安定期の平均電流?0.4mA程度のLight-sleepモード。

 スリープを自動化させるコードは、これ、強制モードは、リンク先参照、復帰方法は、後述。

...
// Light-sleepモードの復帰例
GPIO_DIS_OUTPIT(12);
PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U, FUNC_GPIO12);
wifi_enable_gpio_wakeup(12, GPIO_PIN_INTR_LOLEVEL);
...

 Light-sleepモードについては、CPUをサスペンドさせる為、信号に応答しないことから、周辺機器からの割り込みによる復帰のみとなる模様。

2020/03/21

 ドキュメントファイル名が変更になる前にはなかったような...気はしますが、[Light-sleep mode can be used in cases where certain applications need to stay connected to the router, so that they can respond to the data being sent by the router in real time.]とあります。

 よってESP8266のLight sleepモードについては、周辺機器からの割り込みだけでなく、WiFi経由のアクセスでも復帰可能ということになります。

 試してみたところ、何れも自作のIoTハウス集中コントロールパネル、自作電動ロールスクリーン、テレビ操作用赤外線信号発信機、ダイニング・キッチン照明壁スイッチなどWiFi経由のIoTガジェットでも自動復帰のLight Sleepモードが使える(スケッチに追加、コンパイルしてもエラーにならない)ことを確認しました。

 その復帰コードの書式は、void wifi_enable_gpio_wakeup(uint32 i, GPIO_INT_TYPE intr_state);で、GPIO 12ピンを復帰用に使う場合、例えば、こんな風に書くとのこと。

 そして安定期の平均電流?20μA以下と最も省電力なDeep-sleepモード。

 ESPでは、Deep Sleep時、GPIO16がLOWからHIGH、復帰時、HIGHからLOWになるので回路上、RST/RESETとGPIO16を接続しておくとタイマーでスリープと復帰を繰り返すESP.deepSleep(マイクロ秒, WAKE_RF_DEFAULT);などを入れるだけで、特に何をすることなく、復帰もして機能するらしいですが、Deep sleepについては、結構奥が深いのでリンク先参照。

2020/03/21

 今更ながら、ESP32のスリープモードは、ESP32 Series Datasheetの3.7RTC and Low-Power Managementにある当初は、Sleepモードの1つであった模様も今は通常モードなのか?微妙でよくわからないActive modeは別としてHibernation mode含む4つあり、他の3つは、ESP8266と同じ(ような)名称ですが、コードの書き方や設定方法は、異なります。

実行

ESP8266 ESP-01でリモコン信号送信回路
ESP8266開発ボードNodeMCUでリモコン信号送信回路

 赤外線LEDの配線は、VCC、抵抗220Ω、赤外線LEDアノード、カソード、GND。

 受信回路で確認してもよいですが、家電で試す場合なら、下記の通り。

  1. スケッチをアップロードしたら、社内、宅内無線LANルーターまたは、アクセスポイントにアクセスできるよう準備・確認します。
  2. テレビなどリモコン家電をリモコンからON/OFFできる状態にしつつ、赤外線LEDを載せた回路を当該家電のリモコン操作可能範囲に置きます。
  3. 信号出力用GPIOピンを抜いた状態で送信回路の電源を入れ、RESETピンをマイナスに挿して、抜き、リセットします。
  4. mDNSを使った場合、ホスト名(ここではESP1B).local、IPアドレスを固定にした場合には、そのIPを、DHCPに任せた場合には、一度、シリアルモニタなどでIPアドレスを確認後、社内・宅内無線LANに接続したスマホ・タブレット・パソコンなどのブラウザのURL入力欄に入力し、開くとボタンが表示されます。
  5. 信号出力用GPIOピンを挿します。
  6. ブラウザ上のPowerボタンをタップ・クリックすれば、家電の電源をON/OFFできます。

 尚、なぜか、ボタン幅がおかしいですが、面倒だし、わかればよいので気にしない...と思いましたが、head内のstyle内に例えば、[form { width: 90% ; }\]のように追記してSPIFFSでメモリ内にHTMLファイルを置けば改善されますが、スケッチにこれを書いても、なぜか改善されない...。

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge, chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
...

 また、IE対策、そのままだとエンコーディング指定がないため、文字化けしたり、モバイル対応していない為、スマホだとレイアウトが崩れるかもしれないので、SPIFFSを使ってHTMLファイルをアップする際には、せめて、このくらいは書いておくとよいでしょう。

リモコンとしてのESP8266

2019/02/05

 ESP8266とリモコン参照。

2019/06/14

 詳細は02/05付け前掲のリンク先に追記したので譲りますが、z3t0/Arduino-IRremoteライブラリに当該ライブラリにあるパッチESP32 Support #540をあてることで少なくともUNKNOWNとなったSHARP AQUOS TVのON/OFFをirsend.sendRaw(...)し、ESP32でも赤外線操作できることを確認しました。

専用コンセントがあった方がよいかも?[2019/05/19追記]

 よく考えてみるとESPモジュールの電源(USBなら100Vコンセント+AC接続USB充電器)が別途必要となるのは、微妙というケースもあると思われ、(リレーを使う)スマートコンセント/スマートプラグとは似て非なる赤外線リモコン用兼100V家電用コンセントがあった方が良い気がしてきました。

 その場合、スマートコンセント同様、AC-DCアダプタ(変換モジュール)を使うのが妥当でしょう。

AC/DCコンバータを使ったESP8266スマートリモコン+100V家電共用電源コンセント例

 っぽいものの、実際に配線はしていませんが、この写真のような感じで。

 ここでは、部品取りしたプラグ付きコードと別途買ったコードコネクタボディ(平型?コンセント)を使っていますが、たぶん、コンセントは、角型の方が、より挿抜に耐え得るつくりにするのも容易でしょう。

 尚、AC/DCコンバータの100V側のケーブルは、相応のものを使う必要があるでしょう。

 尚、何らかのケースに入れる場合、WiFiチップは熱を持つので誤動作回避のためにも適度な通気口を設けたり、冷却手段を講じることができるなら尚良いでしょう。

タイマー付けるのもよいかも?[2021/06/15追記]

 よく考えてみるとスマートリモコンやスマートプラグには、自作スマートカーテン/自動開閉タイマー付き無線電動カーテンのようにタイマーがあっても良いかもしれませんね。

 市販のスマートリモコンは、1台でまとめてというものが多いですが、この自作スマートリモコンは、まとめることもできるものの、基本、家電1つに赤外線送信機も1つを想定しており、家電を特定できますし、既定タイマーと言うより、任意の時・分設定かな、もちろん必要なものだけ。

 他方、スマートプラグの方は、利用する家電は様々ですが、それはそれで任意設定のオン/オフタイマーかな、時分設定でも、何時間後でも。

ホーム前へ次へ