Разделительная плата Intel Edison Arduino: как получить все байты результата i2c? (NodeJS)

У меня есть коммутационная плата Intel Edison Arduino, датчик Atlas Scientific EZO PH и изолятор питания Atlas Scientific.

У меня есть изолятор питания между шиной i2c платы Intel Edison Arduino (A4/A5) и датчиком ph.

Спецификации Atlas Scientific можно найти здесь:
Датчик EZO Ph: Технический паспорт PH
Изолятор питания: Техническое описание изолятора питания

Код 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);

Отправляю на датчик ph команду R,56.26, жду 1 секунду и затем выполняю i2c.read();.

Я вижу, как индикаторы мигают и меняют цвет так, как они должны, когда команда отправляется и когда выполняется i2c.read(), поэтому я знаю, что запрашиваю показания и получаю результат.

Техническое описание датчика EZO PH поясняет:
Ответ результата датчика EZO PH
введите здесь описание изображения

Кажется, я могу сохранить только первый бит своего результата вместо полных 7 байтов. Кажется, я всегда возвращаю 1. 1, который я получаю, соответствует «Успеху». Для дальнейшего устранения неполадок я отправил R, 34,53 на датчик ph, а затем преждевременно выполнил i2c.read(); и получил 254, что соответствует «Ожидание». Итак, я считаю, что получаю результат или частичный результат от датчика EZO PH.

Я не понимаю, как мне сохранить 7-байтовый результат. Я не знаю внутренней работы API библиотеки mraa nodejs. Итак, я не уверен, следует ли мне использовать объект, массив или переменную для хранения результата, или мне не хватает аргумента в i2c.read();

ОБНОВЛЕНИЕ

Я прочитал раздел примеров mraa github, в котором объясняется: «Нет явной документации API nodejs, см. Примеры. Сам API очень похож на python, но с синтаксисом js». Поэтому я написал довольно простой скрипт на Python, который успешно получает значение датчика Ph.

Код 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);

person dottedquad    schedule 25.12.2014    source источник


Ответы (2)


'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);  
        }
    }
 }
person Fumu 7    schedule 25.12.2014
comment
@ Fumu 7 ваш код вызвал прозрение. Мне удалось добиться результата. Пожалуйста, смотрите мой оригинальный пост для моего рабочего примера кода. - person dottedquad; 25.12.2014

Как объяснил @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);
person dottedquad    schedule 25.12.2014