Yo definiría un tercer protocolo, "TND", y habría que actualizar el fichero
de CAO1_config.h y en LinealSensor lo haría igual que tú.
Código:
// ****************************************************************
// Lectura unitaria. La funcion depende del protocolo usado.
// Devuelve uint16_t.
// ****************************************************************
uint16_t Cao1_LinealSensor::_Read1RawSensor(){
uint16_t ValAn;
if (0==strncmp("IDL", _Protocol, 3)){ // I2c de DormandLabs
// Solicitamos leer 2 bytes Desde el dispositivo I2C en la direccion _ADDR
Wire.requestFrom((int) _ADDR, 2);
// Esperar a la recepcion de al menos 2 bytes.
while(Wire.available() < 2);
byte H = Wire.read();
byte L = Wire.read();
// SerFmt.Fmt(0, F("*** H=%d, L=%d"), (int) H, (int) L); // TRAZA
return (uint16_t) (H*256) + (uint16_t) L;
}
if (0==strncmp("TND", _Protocol, 3)){ // I2c de Tindie
// Solicitamos leer 3 bytes Desde el dispositivo I2C en la direccion _ADDR
Wire.requestFrom((int) _ADDR, 3);
// Esperar a la recepcion de al menos 3 bytes.
while(Wire.available() < 3);
byte H = Wire.read();
byte L = Wire.read();
byte CnfR = Wire.read();
// SerFmt.Fmt(0, F("*** H=%d, L=%d, CnfR=%d"), (int) H, (int) L, (int) CnfR ); // TRAZA
return (uint16_t) (H*256) + (uint16_t) L;
}
else if(0==strncmp("ANR", _Protocol, 3)){ // analogRead()
ValAn=analogRead(_ADDR);
// SerFmt.Fmt(0, F("*** ValAn=%d"), ValAn); // TRAZA
return ValAn;
}
}
Pruebalo por si hay algo que se te pasó, pero está hecho igual que el tuyo.
Yo creo que debería funcionar.
En cualquier caso tienes lo más importante, un ejemplo que te funciona y a malas habría que ir tirando de ese hilo.
Descomenta la traza de la función_Read1RawSensor() para ver los datos que recibes de I2C y pon igualmente trazas de los datos dentro del ejemplo que funciona usando Serial.println()
En realidad no hacemos las mismas cosas pero es que no entiendo porque Tindie usa ese sistema de lectura.
El código de Tindie en realidad significa.
Código:
Mientras Wire tenga un byte disponible para lectura intento leer los tres siguientes{ // ??? Cómoor ???
Leo un byte en highbyte;
Leo un byte en lowbyte
Leo un byte en configRegister
}
Es lo que significa
Código:
while(Wire.available()) // ensure all the data comes in
{
highbyte = Wire.read(); // high byte * B11111111
lowbyte = Wire.read(); // low byte
configRegister = Wire.read();
}
Y funciona.
Lógicamente yo intentaría hacer comparaciones con las trazas en ambos códigos para ver lo que funciona, lo que no y por qué. Todo tiene una razón y buscaría entenderla.
Tindie podría estar usando wire() de una forma algo diferente a Dormant Lab, o un protocolo con diferencias que desconozco y si no somos capaces de usarlo a mi modo habría que imitarlo lo mejor posible.