word()
предназначен для приведения переменной или литерала в 16-битное слово, он не добавляет два байта в 16-битное слово, как вы делаете word(HighByte, LowByte)
, я действительно удивлен, что это даже скомпилировано в Arduino .
Чтобы получить значение range
, вы можете сделать:
int range = HighByte * 256 + LowByte;
или:
int range = ((int)HighByte) << 8 | LowByte; //cast HighByte to int, then shift left by 8 bits.
Но поскольку Wire.read()
возвращает int вместо вместо байт (вы можете увидеть определение прототипа его функции здесь ), поэтому ваш код на самом деле может быть записан так:
int reading = Wire.read(); //read the first data
reading = reading << 8; // shift reading left by 8 bits, equivalent to reading * 256
reading |= Wire.read(); // reading = reading | Wire.read()
Кстати, когда вы используете #define
, вы не нужно специально приводить значение const к указанному типу данных c, компилятор позаботится об оптимизации и правильном типе данных, поэтому:
#define SensorAddress byte(0x70)
будет в порядке, если определить this:
#define SensorAddress 0x70
Вам также не нужно приводить значение const с byte(2)
или return word(0)
. В последнем случае ваш прототип функции уже ожидает, что возвращение будет иметь тип данных word
.