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();
}
