xtelのmoxaを使う。

moxaのzigbee無線で距離を測るから距離情報を削って、少しフォーマットを変えただけだが
たくさんあるセンサ付きノードの状態を、zigbee無線で一カ所に集めるのが簡単にできる。
8ビットマイコンなのにclassが作れて(厳密にはJavaScript互換なのでクラスではないが)文字列が可変長でString.splitなども使えてArrayもあるので、こういう無線通信プロトコルは簡単に作れる



ノードのプログラム
定義したsensor_send()関数でデバイス名,センサ名,センサ値を送信する
あまり頻繁に送ると受信側が困るので、適度にsleepを入れる

var debugMode = false; // trueの時、無線データなどをシリアルポートで確認できる

var radio = new Object();
radio.id = 2;  
radio.channel = 15;

radioInit(0xDEAD, radio.id, radio.channel, 31);
serialInit(9600);

pinMode(0, true);

function loop() {
    var an = analogRead(0);
    send_sensor("sampleDevice", "lightSensor", an); // デバイス名,センサ名,センサ値
    sleep(100);    // 約1秒停止
    
    var button = digitalRead(0);
    send_sensor("sampleDevice", "pushButton", button);
    sleep(100);
}

// デバイス名,センサ名,センサ値を送信
function send_sensor(deviceName, sensorName, sensorValue){
    message = deviceName + ":" + sensorName + "=" + sensorValue;
    radioSend(0xFFFF, message);
    if(debugMode) serialSend(message + "¥r¥n"); // 無線データ確認用
}


function sleep(count){
    for(var i = 0; i < count*10; i++){
    }
}

while(true){
    loop();
}




ルートのプログラム
センサ群を集約するroot。
センサのデバイス名、センサ名、値をSensorListクラス内に複数保持して、定期的にシリアル通信でPCに渡す。

var radio = new Object();
radio.id = 1;  
radio.channel = 15;

// class定義
function Sensor(){
    this.deviceName = "";
    this.name = "";
    this.value = null;
    this.toString = function(){
        return this.deviceName + ":" + this.name + "=" + this.value;
    };
}

function SensorList(){
    this.sensors = new Array();
    this.store = function(sensor){ // sensor値を保持する
        // 上書き保存
        for(s in this.sensors){
            if(s.name == sensor.name &&
                s.deviceName == sensor.deviceName){
                s.value = sensor.value;
                return;
            }
        }
        // 新規保存
        this.sensors.push(sensor);
    };
    this.toString = function(){
        var result = "";
        for(s in this.sensors){
            result += s.toString() + "&";
        }
        return result;
    };
    this.length = function(){
        return this.sensors.length;
    };
}

// class定義終わり

sensors = new SensorList();

radioInit(0xDEAD, radio.id, radio.channel, 31);
serialInit(9600);

function loop() {
    var str = "";
    serialSend(sensors.toString() + "¥r¥n");
    sleep(10);/**/
}

function onRadioReceive(seq,id,pan,data,rss) {
    var sensor = new Sensor();
    tmp = data.split(":");
    sensor.deviceName = tmp[0];
    tmp2 = tmp[1].split("=");
    sensor.name = tmp2[0];
    sensor.value = tmp2[1];
    sensors.store(sensor);
    //serialSend(sensors.length() + "," + sensor.toString() + "¥r¥n");
}

function sleep(count){
    for(var i = 0; i < count*10; i++){
    }
}

while(true){
    loop();
}