無線スイッチ側新設ソース
無線新設チャイムスイッチ側説明
これは、玄関のスイッチを使って、arduinoだけでチャイムを動かすための設定です。
おおよそは、既設機器への増設と同じですが、スイッチが押された時の読み取り方法が違うほか、音楽回路が加わります。音楽回路の説明については、後述に譲ります。
使用arduino
私は、無線Lanを使って、初めにこのチャイムの増設計画を始めたので、それ用に用意したWemos D1ボードをそのまま使っています。
Wemos D1ボードは、かなり癖があり使いにくいので、WiFiの必要がない無線の場合は、UNO互換のボードを使う方がよいでしょう。
その場合は、同じピン位置を利用するなら、以下のように変更します。
GPIO16→2 GPIO12→6 GPIO13→7 GPIO15→10
スイッチが押された時の読み取り
増設では、analogReadでスイッチの電圧を読み取りましたが、新規設置ならarduinoから電流をスイッチに向かって流して、その値を直接読み取ればよいので、digitalReadが使えます。
ただこのデジタル入力端子は、Wemos D1ボードの場合、GPIO0やGPIO2では、コードをつないでいると、プログラムの書き込み時にエラーが出ました。警告音も、スイッチの如何にかかわらず、鳴りっぱなしになります。
基盤の表面にWiFiと書いてあるので、おそらく無線通信用に使っているのでしょうね。
GPIO12、GPIO0やGPIO15のあたりなら使えます。全部のデジタル端子を調べたわけではないので、他の端子でも使える所はあると思います。プログラムの書き込みができないとか、他にももしエラーが出るなら、その端子がほかの用途と干渉している可能性があります。
私は回路の組みやすさから、GPIO15を使いました。
スイッチにはプルダウン
3V端子からスイッチに行き、帰ってきたコードをGPIO15につなぎます。
スイッチが押されていないときの電圧を一定にさせるために、GPIO15から1KΩの抵抗経由でGNDにつないでプルダウンします。
アラーム電源
アラームの電源は、GPIO16から+がでます。ブザーぐらいなら、これとGNDとに接続するだけで鳴りますが、リレーを使うなど、もっと大きな電流が必要な場合には、音楽回路の説明のように、トランジスタで信号を増幅する必要があります。
無線送信モジュールの接続
無線送信モジュールの接続については、先に説明しました。
無線新設チャイムスイッチ側ソースコード
/*
* チャイムスイッチに直付けして
* 他の機器はつながずに
* 無線送信用 元
* 発信元でもチャイムを鳴らす
*/
#include <RH_ASK.h>
#include <SPI.h> // Not actually used but needed to compile
//*****************************************************
#define DIGITAL_SWITCH_SOCKET 15
//警告音出力接続ピン
int BEEP_SOCKET = 16;
#define BEEPTIME 25000 //1000分の1秒単位
const char *pass = "Chime1"; //判定用パスワード
//*****************************************************
// デバッグ設定
#define DEBUG // 有効にするとシリアル出力が有効になります。
#ifdef DEBUG
#define Serialbegin Serial.begin
#else
#define Serialbegin
#endif
static int switch1= 0;
RH_ASK driver;
void setup(){
Serial.begin(115200); // Debugging only
if (!driver.init()){
Serial.println("radio init failed");
}
pinMode(BEEP_SOCKET,OUTPUT);
pinMode(DIGITAL_SWITCH_SOCKET,INPUT);
}
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);
int i;
for(i=0;i<3;i++){
Serial.println((char*)pass);
Serial.print("strlen(pass)=");
Serial.println(strlen(pass));
driver.send((uint8_t *)pass, strlen(pass));
driver.waitPacketSent();
delay(500);
}
delay(BEEPTIME);
digitalWrite(BEEP_SOCKET, LOW);
}
void loop(){
voltagehantei();
}
