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();
}