無線スイッチ側増設ソース
無線増設チャイムスイッチ側説明
私は、家に元々ついていたチャイムに増設する形で、ブザーを設置しました。
私の使っているチャイムEC730は、スイッチの端子にいつも1Vほどの電流が流れていて、ボタンを押したときだけ一瞬0Vに近くなります。
arduinoのA0とGND端子にこのスイッチ端子からの電流を並列で受け取って、アナログリードで電圧測定をします。
A0端子への入力はそのまま受け取っても支障はないのかもしれませんが、あまり電流を流したくはないので、適当な抵抗を挟んでおきました。
それで、スイッチが押されたときに、増設側の受信機を呼び出して、回路をONにします。
電源はDCACコンバーターから取り、arduinoはタッパーに入れて、コンバーターごとチャイムの裏の壁に隠しました。
100V電源は、元のチャイムに来ていた線を、コンセントを付けて二股にしてつないでいます。壁裏で塵が積もることによる自然発火が怖いので、コンセントの差し込み部分は、ビニールテープでしっかりふさいでおきました。
無線送信モジュールの接続
433mhz無線モジュールのアンテナ付きを用意しました。写真上側の本体と、下側のアンテナが受信用、下側の本体と上側のアンテナが送信用です。
受信モジュールは、裏から見て、左から、-、data,data、+で、中の二つのデータ線は、どちらにつないでも同じことです。
送信モジュールは、裏から見て、左から-、+、data、enで、enには何もつなぎません。
電圧は3Vで駆動します。
Driverは、RadioHeadのものを使いました。
ダウンロードがめちゃくちゃ分かりにくいですが、このページの3行目にあるzipファイルをクリックするとダウンロードが始まります。
これを解凍してarduinoの文書ファイルが置かれているフォルダ内のlibrariesの下に置きます。
これを使う上での注意点として、RH_ASK.h内に、送信や受信に使うポート番号が指定してあります。ディフォルトでは、受信がD11、送信がD12に設定されています。そのまま使うならいいのですが、Wemos D1では不都合なので、以下の部分を変更します。
arduino UNOの場合のピン配置は、リンク参照。
//*********************************** #define RXPIN uint8_t rxPin = 13 // 受信ポート #define TXPIN uint8_t txPin = 12 // 送信ポート //*********************************** class RH_ASK : public RHGenericDriver { public: /// Constructor. /// At present only one instance of RH_ASK per sketch is supported. /// param[in] speed The desired bit rate in bits per second /// param[in] rxPin The pin that is used to get data from the receiver /// param[in] txPin The pin that is used to send data to the transmitter /// param[in] pttPin The pin that is connected to the transmitter controller. It will be set HIGH to enable the transmitter (unless pttInverted is true). /// param[in] pttInverted true if you desire the pttin to be inverted so that LOW wil enable the transmitter. RH_ASK(uint16_t speed = 2000, RXPIN , TXPIN , uint8_t pttPin = 10, bool pttInverted = false); //*************************************************************
無線増設チャイムスイッチ側ソースコード
/* * チャイムスイッチから無線送信用 元 * 元付けチャイム機器への増設用 * 送信元では警告を鳴らさない */ #include <RH_ASK.h> #include <SPI.h> // Not actually used but needed to compile //***************************************************** //警告音出力接続ピン 送信機電源兼用 int BEEP_SOCKET = 16; #define ANALOG_SWITCH_SOCKET A0 // #define DIGITAL_SWITCH_SOCKET 15 const char *pass = "Chime1"; //判定用パスワード //***************************************************** static int switch1= 0; RH_ASK driver; // デバッグ設定 #define DEBUG // 有効にするとシリアル出力が有効になります。 #ifdef DEBUG #define Serialbegin Serial.begin #else #define Serialbegin #endif void setup() { pinMode(ANALOG_SWITCH_SOCKET,INPUT); pinMode(BEEP_SOCKET,OUTPUT); Serialbegin(115200); if (!driver.init()){ Serial.println("radio init failed"); } } void voltagehantei(){ int v1; static int vt = -2; int sensorValue = analogRead(ANALOG_SWITCH_SOCKET); // delay(500); // Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 3.2V): float voltage = sensorValue * ( 3.2 / 1023.0); if(voltage>=0.6){ v1 = 3; switch1=0; }else{ v1 = 0; switch1=1; } if(v1 != vt){ Serial.print(F("Voltage=")); Serial.println(voltage); vt = v1; if(switch1==1){ on(); } } } void on(){ int i; // digitalWrite(BEEP_SOCKET, HIGH); 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); } // digitalWrite(BEEP_SOCKET, LOW); } void loop() { voltagehantei(); }
スイッチが押された時だけ通電で無線は失敗
スイッチが押された時だけ、送信モジュールに電源を入れればよいと思っていたのだけれど、実際にやってみるとうまくいきませんでした。通信距離がとても短くなってしまいます。
通信前に数秒だけ時間を取ってやればいいのか、もっと長い時間モジュールを温めていた方がいいのかよくはわかりませんが、壁の裏の足が届かないところに設置し直すのにくたびれてきたので、ずっと電源を流す式で組み立ててしまいました。
無線送信はおそらく1回でいいのでしょうが、エラーが起こっても通信を確立したいので、3回同じデータを送ってみました。
これが果たして有効なのかどうなのか、よくはわかりませんが。