無線スイッチ側新設ソース

無線新設チャイムスイッチ側説明
これは、玄関のスイッチを使って、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(); }