我有一台英特尔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传感器数据表解释:
我似乎只能存储结果的第一位而不是整个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);
答案 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);