WiFiスイッチ側新設ソース

WiFi新設チャイムスイッチ側Client説明

増設チャイム

 これは、玄関のスイッチを使って、arduinoだけでチャイムを動かすための設定です。
 おおよそは、既設機器への増設と同じですが、スイッチが押された時の読み取り方法が違うほか、音楽回路が加わります。音楽回路の説明については、後述に譲ります。

 今のやり方では、子機のServerに個別に通信をしているので、最後の接続機器のチャイムが鳴りだすまでに、かなりなタイムラグがあります。
 今の私の技術力では、これは如何ともしがたいところです。

スイッチが押された時の読み取り

 増設では、analogReadでスイッチの電圧を読み取りましたが、新規設置ならarduinoから3Vをスイッチに向かって流して、その値を直接読み取ればよいので、digitalReadが使えます。
 ただこのデジタル入力端子は、GPIO0やGPIO2では、コードをつないでいると、プログラムの書き込み時にエラーが出ました。警告音も、スイッチの如何にかかわらず、鳴りっぱなしになります。
 基盤の表面にWiFiと書いてあるので、おそらく無線通信用に使っているのでしょうね。
 GPIO12、GPIO0やGPIO15のあたりなら使えます。全部のデジタル端子を調べたわけではないので、他の端子でも使える所はあると思います。プログラムの書き込みができないとか、他にももしエラーが出るなら、その端子がほかの用途と干渉している可能性があります。
 私は回路の組みやすさから、GPIO15を使いました。

スイッチにはプルダウン

 3V端子からスイッチに行き、帰ってきたコードをGPIO15につなぎます。
 スイッチが押されていないときの電圧を一定にさせるために、GPIO15から1KΩの抵抗経由でGNDにつないでプルダウンします。

アラーム電源

 アラームの電源は、GPIO16から+がでます。ブザーぐらいなら、これとGNDとに接続するだけで鳴りますが、リレーを使うなど、もっと大きな電流が必要な場合には、音楽回路の説明のように、トランジスタで信号を増幅する必要があります。

WiFiのアクセスポイントを用意

 私の母の家のように、インターネット接続がないような家でも、無線LANのアクセスポイントを置きさえすれば、家庭内では無線通信ができるので、このチャイムも使用できます。
 ただ、このアクセスポイントの設定が、一筋縄ではいかず、とっても面倒くさいですが。

WiFi新設チャイムスイッチ側ソースコード

/*
 * チャイムスイッチに直付けして
 * 他の機器はつながずに
 * 無線送信用 元
 * 発信元でもチャイムを鳴らす
*/
#include <ESP8266WiFi.h>
//*****************************************************
const  char*  ssid      =  "Your  ID";
const  char*  password  =  "Your  Password";
// 接続サーバーの数ホストアドレスを指定
const  char*  host1  =  "192.168.***.***";
const  char*  host2  =  "192.168.***.***";
#define DIGITAL_SWITCH_SOCKET 15
//警告音出力接続ピン
int  BEEP_SOCKET = 16;
#define BEEPTIME 5000  //1000分の1秒単位
//*****************************************************
static int switch1= 0; 

// デバッグ設定
#define DEBUG  // 有効にするとシリアル出力が有効になります。
#ifdef DEBUG
  #define Serialbegin Serial.begin
#else
  #define Serialbegin
#endif

void setup() {
  pinMode(BEEP_SOCKET,OUTPUT);
  pinMode(DIGITAL_SWITCH_SOCKET,INPUT);
  Serialbegin(115200);
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.println();
  Serial.print(F("Connecting to "));
  Serial.println(ssid);
  
  /* Explicitly set the ESP8266 to be a WiFi-client, otherwise, it by default,
     would try to act as both a client and an access-point and could cause
     network-issues with your other WiFi-devices on your WiFi-network. */
  WiFi.mode(WIFI_STA);
  WiFi.begin(ssid, password);
  
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(F("."));
  }

  Serial.println(F(""));
  Serial.println(F("WiFi connected"));  
  Serial.println(F("IP address: "));
  Serial.println(WiFi.localIP());
}

void voltagehantei(){
  int v1;
  static int switcht = -2;

  int sensorValue = digitalRead(DIGITAL_SWITCH_SOCKET);

  if(sensorValue==LOW){
     switch1=0;
  }else{
     switch1=1;
  }
  // Serial.println(sensorValue);
  if(switch1 != switcht){
    switcht = switch1;
      if(switch1==1){
        Serial.println("ON");
        on();
      }
  }
}
void on(){
  Serial.println(F("BEEP!!"));
  digitalWrite(BEEP_SOCKET, HIGH);
  
  // 接続サーバーの数 送信する
  //*****************************
  send_server(host1);
//  send_server(host2);
  //*****************************
  
  delay(BEEPTIME);
  digitalWrite(BEEP_SOCKET, LOW);
}

void send_server(const char* host){
  int value = 0;
  ++value;
  Serial.println(F("On"));
  Serial.print(F("connecting to "));
  Serial.println(host);
  
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println(F("connection failed"));
    return;
  }
  
  // We now create a URI for the request
  String url ="/"; 
 
  Serial.print(F("Requesting URL: "));
  Serial.println(url);
  
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" + 
               "Connection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (client.available() == 0) {
    if (millis() - timeout > 5000) {
      Serial.println(F(">>> Client Timeout !"));
      client.stop();
      return;
    }
  }
  
   // Read all the lines of the reply from server and print them to Serial
  int i=1;
  while (client.available()) {
    String line = client.readStringUntil('\r');
    if(i==6){ // 6行目にテキスト内容が表示される
      Serial.println(line);
    }
    ++i;
  }
  Serial.println("");
  Serial.println(F("closing connection"));  
}

void loop() {
  voltagehantei();
}

        
タイトルとURLをコピーしました