インテルEdison + BLEで、konashi/SBBLEを動かしてみた。
こちらの記事を参考にさせていただいてI2Cを動かしてみました。
koshianで動作を確認しましたが、UUIDを変えればkonashiでも動くと思います
(持ってるんだから確認しろよって話ですが…)。
I2Cの通信相手(スレーブ)はUzukiセンサーシールド上のSi7013(温湿度センサ)とし、温度を取得しています。
以下サンプルです(ほぼ初めてのjs)。
15行目くらいまでは、上記のコードそのままです。
サンプルコード
koshian_i2c.js
var noble = require('./index');
const ADDR_Si7013 = 0x40
const CMD_TEMP = 0xE3
const KOSHIAN_I2C_MODE_ENABLE_100K = 0x01
const KOSHIAN_I2C_CONDITION_STOP = 0x00
const KOSHIAN_I2C_CONDITION_START = 0x01
const KOSHIAN_I2C_CONDITION_RESTART = 0x02
function calculateTemperature(data){
return (data[0]*256 + data[1])*175.72/65536 - 46.85
}
noble.on('stateChange', function(state){
if (state === 'poweredOn') noble.startScanning();
else noble.stopScanning();
});
noble.on('discover', function(peripheral){
noble.stopScanning();
console.log('peripheral with UUID ' + peripheral.uuid + ' found');
var advertisement = peripheral.advertisement;
var localName = advertisement.localName;
if (localName){
console.log('Local Name = ' + localName);
}
peripheral.connect(function(error){
if (error) console.log('connect error: ' + error);
console.log('connected to ' + peripheral.uuid);
peripheral.discoverServices(['229bff0003fb40da98a7b0def65c2d4b'], // KONASHI_SERVICE_UUID
function (error, services){
if (error) console.log('discoverServices error: ' + error);
console.log('services.length: ' + services.length);
var konashiService = services[0];
konashiService.discoverCharacteristics(
['229b300b03fb40da98a7b0def65c2d4b', // KONASHI_I2C_CONFIG_UUID
'229b300c03fb40da98a7b0def65c2d4b', // KONASHI_I2C_START_STOP_UUID
'229b300d03fb40da98a7b0def65c2d4b', // KONASHI_I2C_WRITE_UUID
'229b300e03fb40da98a7b0def65c2d4b', // KONASHI_I2C_READ_PARAM_UUID
'229b300f03fb40da98a7b0def65c2d4b'], // KONASHI_I2C_READ_UUID
function(error, characteristics){
if (error) console.log('discoverCharacteristics error: ' + error);
console.log('characteristics.length: ' + characteristics.length);
// enable I2C
characteristics[0].write(new Buffer([KOSHIAN_I2C_MODE_ENABLE_100K]), false);
var i = 0;
setInterval(function(){
// send StartCondition
characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_START]), false, function(error){
// send register-address/command
characteristics[2].write(new Buffer([2, (ADDR_Si7013 << 1) & 0xFE, CMD_TEMP]), false, function(error){
// send RestartCondition
characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_RESTART]), false, function(error){
// request data read
characteristics[3].write(new Buffer([2, (ADDR_Si7013 << 1) | 0x01]), false, function(error){
// send StopCondition
characteristics[1].write(new Buffer([KOSHIAN_I2C_CONDITION_STOP]), false);
// read received data
characteristics[4].read(function(error, data){
if (data){
console.log( i++ + ' - temperature : ' + calculateTemperature(data) + ' degC');
}
});
});
});
});
});
}, 1000);
}
);
}
);
});
});
Callback Hell ?
流れとしては、
スタートコンディション→
スレーブアドレス+W+コマンド→
リスタートコンディション→
スレーブアドレス+R→
(データ受信)→
ストップコンディション
という流れになっていますが、
これをコールバックで呼び出さずにツラツラと並べただけでは、
何回かループが回ったところで止まってしまいました。
発行したリクエストが前後してしまうのでしょうかね?
今日は温かい1日でしたね、室温が21度ありました。