shuzo-kino.hateblo.jp
の続きです。
今回は送受信用のスクリプトを書いてみます。
実際のところ
送信側
#include <SoftwareSerial.h> SoftwareSerial IM315Serial(8, 9); // ソフトウエアシリアル int busy; unsigned char cnt = 0; String inputstr = ""; char sendPacket[24] = ""; void setup() { IM315Serial.begin(19200); // ソフトウエアシリアル 初期化 Serial.begin(19200); pinMode(10, INPUT);// Busy 信号 Pin10 入力 while (!IM315Serial & !Serial ) { ; } delay(1000); Serial.print("ID:"); IM315Serial.println("RDID"); while (IM315Serial.available()) { readPacket(); }; delay(1000); } void loop() { do { busy = digitalRead(10); // Busy 信号 読み取り } while (busy != 0); // Busy なら Loop IM315Serial.print("TXDT "); // 送信コマンド cnt = (0x00ff & (cnt + 1)); //カウンター。0xffで0x00に戻る sprintf(sendPacket, "%02x%s", cnt, "0203"); IM315Serial.println(sendPacket); // アナログ値を HEX フォーマットで送信 // Serial.println(sendPacket); //デバッグ用 // 受信成功時にでる"OK"を拾いたい場合、以下を有効に //while (IM315Serial.available()) { // Serial.write(IM315Serial.read()); //} delay(5000); } void readPacket() { inputstr += (char)IM315Serial.read();; }
受信側
先程わかった固有IDを設定します。
今回は"9E46"だったので、これを直接。
公式によると以下の仕様とのことなので、あまり書き込みしすぎない方がいいでしょう。
私は力技のコメントアウトで対処してますが……場合によっては、初期設定用の別ルーチンを用意したほうがいいかも。
電源投入直後は、不揮発メモリへの書込みは禁止状態です。
不揮発メモリへの書込み回数は最大1万回ですので、頻繁にパラメータ変更をする場合は書込み禁止状
態にしてください。
通信対象となる送信モジュールの固有 ID は、最大 64 個まで登録することができます。
#include <SoftwareSerial.h> SoftwareSerial IM315Serial(8, 9); // ソフトウエアシリアル int busy = 0; String inputstr = ""; void setup() { Serial.begin(19200); IM315Serial.begin(19200); // ソフトウエアシリアル 初期化 pinMode(10, INPUT); // Busy 信号 Pin10 入力 while (!IM315Serial & !Serial ) { ; } delay(500); //デバイス登録機能。不揮発領域に書き込むので、あまり使わない //device_reg_process(); } void loop() { do { busy = digitalRead(10); // Busy 信号 読み取り } while (busy != 0); // Busy なら Loop while (IM315Serial.available()) { readPacket(); }; if (inputstr[-1] = '\n' && inputstr != "") { //sample:AB,0001,7C:13,57,9B,DF,02,46,8A,CE Serial.println(inputstr); inputstr = ""; } delay(100); } void readPacket() { inputstr += (char)IM315Serial.read();; } void sendPacket(String packet) { Serial.println("Send" + packet); IM315Serial.println(packet); delay(3000); while (IM315Serial.available() > 0) { readPacket(); }; delay(3000); } void device_reg_process(){ sendPacket("ENWR"); //不揮発領域に書き込みを可能に sendPacket("SRID 9E46"); //受信対象の固有ID(この例では9E46)を設定 sendPacket("DSWR"); //書き込みを再度禁止 }