エンジニア風味 (Engineer-taste)

電子系エンジニアのメモ帳

ESP-WROOM-02で無線LANチャイムをつくる(Server編)

ということで、先週に引き続き、ESP-WROOM-02無線LANチャイムをつくる、を書きます。
まず、チャイム本体は朝日無線(ELPA)の「お知らせチャイムCDS-100」
http://www.elpa.co.jp/product/page_img/cr05/1311-1.jpg
というのものを使いました。
(お約束ですが、改造したことにより、メーカー保証は受けられなくなります。また、何らかの損害をこうむった場合に、当方では責任は負いませんので、自己責任でお願いします。常時通電するものは、安全面を考えられる知識と技能を要します)

さて、このチャイムは単3電池3本で動くもので、今回はこの電池ボックス部分にESP-WROOM-02基板を埋めてしまいます。電源はUSBから取ります。

f:id:engineer-paju:20190420104207j:plain
電池ケースに収めたところ

サーバ側の回路図は下記のようにしました。

f:id:engineer-paju:20190420104300p:plain
サーバー側回路図

クライアント側とあまり変わりませんね。

チャイム内部ですが、配線が下記のようになっています。

f:id:engineer-paju:20190420104400p:plain
チャイムの内部配線

つまり、ボタン端子は1)プラス電源、2)センサ端子、の2本であり、センサ端子の電圧が上がるとチャイムが鳴るようになっています。
センサ端子の電圧をどこまで引き上げるとチャイムが動作するかの実験をやってみました。2Vでは作動せず、2.5Vならば作動するようです。電流は1mA以下しか流れないようです。
したがって、センサ端子にESP8266の出力を接続し、普段はLow、チャイムを鳴らすときはHighにすればよいことになります。
・USBの電源端子から+5VとGNDをチャイムの電源(電池ケースの+側、-側)に接続する。
・同じくUSB電源端子からESP-WROOM-02基板の+5V入力とGND端子に接続する。
ESP-WROOM-02の端子(ここでは13番を使いました)をチャイムのセンサ端子に接続する(チャイムの端子の電源側に接続するとESP-WROOM-02が破壊されますので、十分に注意してください)

サーバ側のESP-WROOM-02のプログラムは下記のようになります。

#include <ESP8266WiFi.h>
#include <WebSocketsServer.h>

//LED
#define chime 13 //チャイムのGPIO
#define led1 4 //LEDのGPIO
int b; //LED出力

//IP
IPAddress ip(192, 168, 1, xx); //サーバーに割り当てるアドレス
IPAddress gateway(192,168, 1, 1);
IPAddress subnet(255, 255, 255, 0);
IPAddress DNS(192, 168, 1, 1);
int port = 8000;

//SSID, pass
const char* Ssid = "xxxx"; //ルータのID
const char* Password = "xxxx"; //ルータのpassword



WebSocketsServer webSocket = WebSocketsServer(port);


void webSocketEvent(uint8_t num, WStype_t type, uint8_t * payload, size_t length) {
    const char * SendMessage = "Server-Message";

    switch(type) {
        case WStype_DISCONNECTED:
            Serial.printf("[%u] Disconnected!\n", num);
            break;

        case WStype_CONNECTED:
            {
                IPAddress ip = webSocket.remoteIP(num);
                Serial.printf("[%u] Connected from %d.%d.%d.%d url: %s\n", num, ip[0], ip[1], ip[2], ip[3], payload);
            }
            break;

        case WStype_TEXT:
            Serial.printf("[%u] get Text: %s\n", num, payload);
            // 1が送られてきたらチャイムを鳴らす
            if(*payload == '1') { 
              digitalWrite(chime, HIGH);
              Serial.print("\n LED High \n");
              } else { 
                digitalWrite(chime, LOW); }

            // echo data back to browser
            webSocket.sendTXT(num, SendMessage, strlen(SendMessage));
            break;

        case WStype_BIN:
            Serial.printf("[%u] get binary length: %u\n", num, length);
            hexdump(payload, length);
            // echo data back to browser
            webSocket.sendBIN(num, payload, length);
            break;

        case WStype_ERROR:
            break;

        default:
            break;
    }

}

void setup() {
    pinMode(chime, OUTPUT);
    pinMode(led1, OUTPUT);
    b=0;
  
    Serial.begin(115200);
    Serial.print("\n\nStart\n");

    WiFi.config(ip, gateway, subnet, DNS); //static ip
    delay(100);

    WiFi.begin(Ssid, Password);
    while(WiFi.status() != WL_CONNECTED) {
        Serial.print('.');
        delay(500);
    }
    Serial.println();
    Serial.printf("Connected, IP address: ");
    Serial.println(WiFi.localIP());


    webSocket.begin();
    webSocket.onEvent(webSocketEvent);
    Serial.printf("Server Started\n");
    // サーバーが無事にスタートしたときにLED点灯
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
    delay(1000);
    digitalWrite(led1, HIGH);
    delay(1000);
    digitalWrite(led1, LOW);
}

void loop() {
    webSocket.loop();
}

これで、通電し、ルータに接続できると、ESP-WROOM-02に接続したLEDが2回点灯します。