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

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

ウェブ造ホーム前へ次へ
サイト内検索
カスタム検索
ESP8266って?

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

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

2018/08/01

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

 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家電に...。

ラトックシステム スマート家電コントローラ スマホで家電コントロール [Works with Alexa認定製品] RS-WFIREX3

LinkJapan eRemote IoTリモコン 家でも外からでもいつでもスマホで自宅の家電を操作 【Works with Alexa認定製品】

LinkJapan eRemote mini IoTリモコン 家でも外からでもいつでもスマホで自宅の家電を操作【Works with Alexa認定製品】MINI

Nature Remo

スマートリモコン Nature Remo mini【Amazon Echo/Google Home対応】

OHM リモコンセント OCR-05

電機器具専用 リモコンコンセント [品番]07-8251 OCR-05W

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

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

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

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

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

 でも、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(とこれらを搭載した開発ボード)のみ。

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にスケッチをアップロードできる状態であること。

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

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

必要なモノ

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

必要な電子部品類

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

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

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

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

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

HiLetgo 赤外線発信管・赤外受信管(各5mm・各10個)

SODIAL(R)10pcs 5mm赤外線IR LED発光ダイオード

uxcell ユニバーサルレシーバモジュール TL1838 VS1838B VS1838 3ピン IR 赤外線

HiLetgo 赤外線IRワイヤレスリモコンモジュールキット for Arduino/AVR/PIC

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

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

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

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

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

KKHMF 600PCS 電子部品抵抗バッグ 1/4W金属膜 1%五色環 30種類各20pcs

ELEGOO 120pcs多色デュポンワイヤー、arduino用、オス-メス オス-オス メス ?メス ブレッドボードジャンパーワイヤー

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

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

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

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

 ESP-12の赤外線LED/フォトトランジスタ用GPIOは、GPIO05としているが、GPIO00/GPIO02/GPIO15以外のGPIOピンならどれでも可。

 運用・実行時、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/パスフレーズは適宜書き換えること。

...
#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でメモリにデータを書き込むこともでき、より増えてくれば、尚の事、その方が、スッキリするし、スケッチ自体のためにメモリを節約できる。

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

...
#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でアクセスすることもできる。

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

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

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

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

 ESP8266 Low-Power Solutionsによれば、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をサスペンドさせる為、信号に応答しないことから、周辺機器からの割り込みによる復帰のみとなる模様。

 その復帰コードの書式は、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については、結構奥が深いのでリンク先参照。

実行

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

 赤外線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ファイルをアップする際には、せめて、このくらいは書いておくとよいだろう。

関連リンク

ウェブ造ホーム前へ次へ