英特尔Edison Arduino分线板:我如何收到所有i2c结果字节?(Node JS)

时间:2014-12-25 04:36:43

标签: node.js intel-edison

我有一台英特尔Edison Arduino分线板,Atlas Scientific EZO PH传感器和Atlas Scientific电源隔离器。

我在英特尔Edison Arduino分线板i2c总线(A4 / A5)和ph传感器之间有电源隔离器。

Atlas Scientific数据表可在此处找到:
EZO Ph传感器:PH Data-sheet
电源隔离器:Power Isolator Data-sheet

NodeJS代码:

var m = require('mraa');  
var i2c = new m.I2c(1);  

i2c.address(0x63);  
i2c.write("R,56.26");  

console.log("Reading I2C..");  

function readPH() {  
    var data = i2c.read();  
    console.log( ">> I2C value: " + data);  
}  
setTimeout(function (e) { readPH(); }, 1000);

我将命令R,56.26发送到ph传感器,等待1秒然后执行i2c.read();

我看到灯光闪烁并且在发送命令时以及执行i2c.read()时的颜色会改变颜色,因此我知道我正在请求读取并获得结果。

EZO PH传感器数据表解释:
EZO PH Sensor Result response
enter image description here

我似乎只能存储结果的第一位而不是整个7字节。我似乎总是返回1.我收到的1对应于“成功”。为了进一步排除故障,我将R,34.53发送到ph传感器,然后过早地执行i2c.read();并收到254,其对应于“待定”。所以,我相信我收到了EZO PH传感器的结果或部分结果。

我对如何存储7字节结果感到很茫然。我不知道mraa nodejs库API的内部工作原理。所以,我不确定是否应该使用对象,数组或变量来存储结果,或者我是否在i2c.read();

中缺少参数

更新

我通读了mraa github示例部分,其中解释说,“没有明确的nodejs API文档,请参阅示例.API本身与python类似,但具有js语法。”所以我写了一个相当简单的python脚本,成功获得了Ph Sensor值。

Python代码:

import time
import mraa

i2c = mraa.I2c(1)
i2c.address(0x63)

i2c.write("R,23.5")

time.sleep(1.3)
d = "       "
i2c.read(d)
print(d)

python代码输出:2.974获得结果证明我的电路设计有效,现在我需要弄清楚NodeJS API是什么来获得成功的i2c读数。有没有人知道NodeJS API获取i2c读数?

更新
工作示例代码:

var m = require('mraa');
var i2c = new m.I2c(1);
i2c.address(0x63);
i2c.write("R,56.26");
console.log("Reading I2C..");
function readPH() {
    var d = i2c.read(7);
    console.log(">> " + d);
}
setTimeout(function (e) { readPH(); }, 1000);

2 个答案:

答案 0 :(得分:1)

'i2c.read();'不会读取一系列数据,而只读取一个字节的数据。 您的代码使用'i2c.read();'一次,所以你只有一个字节。

要读取所有数据直到NULL,readPH函数可能需要修改如下。 (此代码未经过测试,因为我没有arduino)

function readPH() {  
    char readout[7]; //
    char aChar;
    int i;
    for (i=0; i<7; i++) {
        aChar = i2c.read();
        readout[i]=aChar;
        if (aChar== NULL){ // all data have been read.
            console.log( ">> I2C value: " + readout);  
        }
    }
 }

答案 1 :(得分:0)

正如@Fumu 7所解释的那样,i2c.read()不读取一系列数据,而只读取一个字节的数据。 i2c.read(7)将读取7个字节的流 工作示例代码:

var m = require('mraa');
var i2c = new m.I2c(1);
i2c.address(0x63);
i2c.write("R,56.26");
console.log("Reading I2C..");
function readPH() {
    var d = i2c.read(7);
    console.log(">> " + d);
}
setTimeout(function (e) { readPH(); }, 1000);