我试图使用Tessel 2从CO2传感器读取数据,但没有取得多大成功。
来自传感器的数据表:
要从传感器读取当前的CO2浓度,我们需要阅读 存储单元0x08(高字节)和0x09(低字节)。
要做到这一点,我们 需要发送一个两个I2C帧的序列:首先我们发送一个I2C写 包含传感器地址,命令编号和多少字节的帧 读取,读取RAM地址和校验和。然后我们发送一个I2C 读取帧以读取状态,数据和校验和。
在我们的例子中,我们想从地址开始读取2个字节 0x08的。这将为我们提供地址0x08和0x09的数据 包含当前的CO2读数。传感器地址为0x68(默认值 出厂设置,可在EEPROM中配置)。
所以,第一帧应该是这样的:
开始| 0xD0 | 0x22 | 0x00 | 0x08 | 0x2A |停止
- 一个。 0xD0是传感器地址和读/写位。 0x68向左移一位,R / W位为0(写入)。
- B。 0x22是命令编号2(读取RAM),读取2个字节
- ℃。校验和0x2A计算为字节2,3和4的总和。
下一帧将读取实际数据:
开始| 0xD1 | <从传感器读取的4个字节> |停止
- d。传感器的1:st字节将包含操作状态,其中位0告诉我们读命令是否成功执行。
- 即2:nd和3:rd字节将包含CO2值hi字节和CO2值低字节。
- F。第4个字节包含校验和
所以,我的代码看起来像这样:
'use strict';
// Require
var async = require('async');
var tessel = require('tessel');
var port = tessel.port.B;
// Vars
var i2c;
// Process
async.waterfall([
function(callback) {
i2c = new port.I2C(0xD0);
callback(null,new Buffer([0xD0, 0x22, 0x00, 0x08, 0x2A]));
},
function(data, callback) {
i2c.send(data, function (error) {
console.log("Done sending the data");
callback(null,null);
})
},
function(data, callback) {
i2c = new port.I2C(0xD1);
callback(null,null);
}
], function (err, result) {
i2c.read(4, function (error, buffer) {
console.log(`I2C Slave (0x${address.toString(16)} response: `, buffer);
});
});
代码一直执行,直到i2c.read代码块,并且从未从传感器接收到缓冲区。
我决定不使用传输方法,因为地址会改变。
我做错了什么?
答案 0 :(得分:0)
我看了一眼Arduino草图,给了我一些最终消失的想法,这让我有点作弊。
i2c.send的Buffer不应该包含地址,因为i2c已经在实例化时在帧中添加了地址。所以缓冲区应该如下所示:
回调(null,new Buffer([0x22,0x00,0x08,0x2A]));
在发送1000ms的读数之间添加超时