気の向くままに辿るIT/ICT
webzoit.netウェブサイトホームページ
IoT・電子工作

ESP8266を2つ使ったWiFi玄関チャイム・呼び出しベル

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

ESP8266を2つ使ったWiFi玄関チャイム・呼び出しベル

ESP8266を2つ使ったWiFi玄関チャイム・呼び出しベル

2018/07/29

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

 Wi-Fi(wifi)モジュールESP8266の内、ESP-01とESP-12F+ピッチ変換基板(ブレイクアウトボード)の2つを使ったドアベルを作ってみるページ。

 ただし、当然、WiFiが切断されると機能しないし、降圧前の電池電圧が7V切ったあたりで動作しなくなったりと、そもそもWiFi機能は、瞬間的にではあっても往々にして消費電力が高くなる、その際に著しい電圧降下を起こすことがあり、安定したレギュレータを要す他、一般に電池駆動には不向きとされ、双方共にコンセントから電源をとることができる場合は別としても、少なくとも電池駆動にするなら、他の方法(BLE)を選ぶのが賢明と思われる。

 一方、ドアフォン(音声通話や静止画、リアルタイム映像含む)となると主目的が超低消費電力であるBLEにおいては想定の範囲外なのでWiFiも選択肢としてはありかも。

 尚、ここでは、ESP-01とESP-12Fを使っているが、このドアベルはGPIOを1本ずつしか必要としない為、ESP-01同士でも、上位機種のESP-02...、ESP-07...、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-12F、クライアント側にESP-01を使った。

サーバ側
クライアント側

 Amazonマーケットプレイス相場で一部電子部品などは単価割したとしてクライアント・サーバ込みで約2000円程度かと。

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-12FTDIブザー別電源
RXDTX--
TXDRX--
GPIO00--プラス
GPIO02--プラス
GPIO15--マイナス
GPIO05-プラス-
CH_PC--3.3V
VCC--3.3V
GNDマイナス
ESP-01FTDIタクトスイッチ別電源
RXTX--
TXRX--
GPIO2-プラス-
CH_PD--3.3V
VCC--3.3V
GNDマイナス

 ESP-12(サーバ側)では、GPIO00をプログラム書き込み時とは異なり、プラスにしておく。

 サーバ側(ESP-12)のブザー用GPIOには、GPIO05を使い、クライアント側(ESP-01)のタクタイルスイッチ用には、GPIO2を使った。

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

スケッチ(Webサーバー側)

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
 
/* Set these to your desired credentials. */
const char *ssid = "ESPap";
const char *password = "thereisnospoon";
 
//ESP8266WebServer server(80);
WiFiServer server(80);
 
#define BEAT 500  // 音の長さを指定
#define BUZZER 5  // 圧電スピーカを接続したピン番号
 
void melody()
{
Serial.println("Link Requested from one of the device");
tone(BUZZER,131,BEAT); // ド
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,175,BEAT); // ファ
tone(BUZZER,196,BEAT); // ソ
delay(BEAT);
 
tone(BUZZER,131,BEAT); // ド
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,175,BEAT); // ファ
tone(BUZZER,196,BEAT); // ソ
delay(BEAT);
 
tone(BUZZER,131,BEAT); // ド
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,175,BEAT); // ファ
tone(BUZZER,196,BEAT); // ソ
delay(BEAT);
tone(BUZZER,165,BEAT); // ミ
delay(BEAT);
tone(BUZZER,131,BEAT); // ド
delay(BEAT);
tone(BUZZER,165,BEAT); // ミ
delay(BEAT);
tone(BUZZER,147,BEAT); // レ
delay(BEAT);
 
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,147,BEAT); // レ
tone(BUZZER,131,BEAT); // ド
delay(BEAT);
tone(BUZZER,131,BEAT); // ド
tone(BUZZER,165,BEAT); // ミ
delay(BEAT);
tone(BUZZER,196,BEAT); // ソ
delay(BEAT);
tone(BUZZER,196,BEAT); // ソ
tone(BUZZER,175,BEAT); // ファ
delay(BEAT);
 
tone(BUZZER,165,BEAT); // ミ
tone(BUZZER,175,BEAT); // ファ
tone(BUZZER,196,BEAT); // ソ
delay(BEAT);
tone(BUZZER,165,BEAT); // ミ
delay(BEAT);
tone(BUZZER,131,BEAT); // ド
delay(BEAT);
tone(BUZZER,147,BEAT); // レ
delay(BEAT);
tone(BUZZER,131,BEAT); // ド
delay(BEAT);
}
void setup() {
 delay(1000);
 Serial.begin(115200);
 
 Serial.println();
 Serial.print("Configuring access point...");
 
 WiFi.softAPConfig(IPAddress(192, 168, 4, 2), IPAddress(192, 168, 4, 1), IPAddress(255, 255, 255, 0));
 WiFi.softAP(ssid, password);
 
 pinMode(BUZZER, OUTPUT);
 digitalWrite(BUZZER, LOW);
 
 IPAddress myIP = WiFi.softAPIP();
 Serial.print("AP IP address: ");
 Serial.println(myIP);
 
 server.begin();
 Serial.println("Server started");
 
 Serial.println(WiFi.localIP());
}
 
void loop() {
 WiFiClient client = server.available(); 
 if (!client) {
  return;
 }
 
 Serial.println("new client");
 while(!client.available()){
  delay(1);
 }
 Serial.printf("Client conenct Access Point: %dn", WiFi.softAPgetStationNum());
 
 String line = client.readStringUntil('r');
 Serial.println(line);
 client.flush();
 
 if (line.indexOf('/MELODY') != -1) {
  digitalWrite(BUZZER, HIGH);
  melody();
  line ="";
  digitalWrite(BUZZER, LOW);
 
  client.println("HTTP/1.1 200 OK");
  client.println("");                 
  client.println("<!DOCTYPE HTML>");
  client.println("<meta charset='UTF-8'>");
  client.println("<html>");
 
  client.print("<h1>Good Job!</h1>");        
 
  
  
  client.println("</html>");
  delay(1);
  Serial.println("line finish.");
 /*
  Serial.println("Waiting for the link");
  server.handleClient();
 */
 }
}
 

 今回、Webサーバー側は、SOFT_APモードとした。

 STAモードでもWebサーバーを立てることはできるようだが、未確認。

 尚、サーバ側のIPアドレスは、WiFi.softAPConfig()関数を使って固定としたが、ESP8266とArduinoでは引数が一部異なるという情報を見かけたのでArduinoで使う場合には要注意。

 あれ、メロディは、『聖者の行進』にしたつもりだったが...、まぁ気にしないことにしておこう。

スケッチ(クライアント側)

#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
 
#define PUSHbtn 2 //GPIO 2
const char* ssid = "ESPap";
const char* password = "thereisnospoon";
 
void setup() {
 Serial.begin(115200);
 // Serial.setDebugOutput(true);
 Serial.println();
 Serial.println();
 Serial.println();
 
 for (uint8_t t = 4; t > 0; t--) {
  Serial.printf("[SETUP] WAIT %d...\n", t);
  Serial.flush();
  delay(1000);
 }
 
 WiFi.mode(WIFI_STA);
 WiFi.disconnect(true);
 WiFi.begin(ssid, password);
 
 pinMode(PUSHbtn, INPUT_PULLUP);
 while (WiFi.status() != WL_CONNECTED) {
  delay(500);
  Serial.print(".");
 
  delay(15000);
  Serial.println("Connected");
 }
}
 
void loop() {
 if ((WiFi.status() == WL_CONNECTED)) {
 
  HTTPClient http;
 
  if (digitalRead(PUSHbtn) == LOW) {
   Serial.print("[HTTP] begin...\n");
   // requesting required link
   http.begin("http://192.168.4.2/MELODY"); //HTTP
 
   Serial.print("[HTTP] GET...\n");
   // start connection and send HTTP header
   int httpCode = http.GET();
 
   http.end();
  }
 }
}
 

 今回、クライアント側は、STAモードとした。

ネットワークアドレス

 インターネットにつなぐ必要がなく、ESP8266間だけで通信できればよいのであれば、社内や宅内のWiFiルーターやアクセスポイントにつなぐ必要はなく、2つのESP8266間でSSID/パスフレーズとアクセスするIPアドレスさえわかっていれば、SSID/パスフレーズやネットワークドメインは任意でよい。

関連リンク