Estoy usando un sensor de temperatura / humedad HDC1080 (original de Texas Ins.) que se comunica a través de I2C con un Arduino. Cada medida tiene una longitud de 16 bits y para guardar sus datos, primero debe leer los 8 MSB y luego los 8 LSB de cada registro (hay uno para temperatura y otro para zumbido).
El primer problema fue que al azar, me mostró el byte menos significativo como una palabra de 16 bits en lugar de una palabra de 8 bits, como esta
Mirandoelalcance,sepodríaobservarqueelerrorocurrecuandoelSDAesaltoenelmomentoenqueSCLestábajoenellapsoentrelosbytes,comomuestralaimagen:
Estásucediendodeformaaleatoriay,aveces,enambosregistros,avecessoloenuno,perolointeresanteesquesoloocurrealprincipiodelsegundobytequeseobtuvodelmismoregistro.
¿Hayalgúnproblemaconmisensor?¿Cómopuedotratarderesolverestasituación?
EDITAR:EsteesmicódigoArduino:
#include<Wire.h>#defineHDC0x40//Sensoraddressint16_thumrawvalue;//Rawdatavalue,MSbyte=valmsb,LSbyte=vallsbint16_ttemrawvalue;//Rawdatavalue,MSbyte=valmsb,LSbyte=vallsbint8_thumvalmsb,humvallsb;//Raw8-bitbyteofhumidityint8_ttemvalmsb,temvallsb;//Raw8-bitbyteoftemperatureintincomingByte=0;//Actioninputvoidsetup(){Serial.begin(9600);Serial.println("Hello");
Wire.begin();
}
void loop() {
if (Serial.available() > 0) {
// read the action input:
incomingByte = Serial.read();
// say what you got:
Serial.print("I received: ");
Serial.println(incomingByte, DEC);
}
if (incomingByte == 49){ //ASCII code for number 1
Wire.beginTransmission(HDC);
Wire.write(0x00); //0x00 is the temperature register, 0x01 is the humidity one
Wire.endTransmission(true);
delay(200);
Wire.requestFrom(HDC,4,true); //It asks for 4 bytes, 2 bytes per register
if(Wire.available()){
Serial.println(" ");
Serial.println("Measuring: ");
temvalmsb = Wire.read();
temvallsb = Wire.read();
humvalmsb = Wire.read();
humvallsb = Wire.read();
Serial.println("====TEMPERATURE====");
Serial.print("MSB: "); Serial.println(temvalmsb, BIN);
Serial.print("LSB: "); Serial.println(temvallsb, BIN);
temrawvalue = temvalmsb <<8| temvallsb; //Locates each byte in its proper place
Serial.print("Temp: "); Serial.println(temrawvalue, BIN);
Serial.println("====HUMIDITY====");
Serial.print("MSB: "); Serial.println(humvalmsb, BIN);
Serial.print("LSB: "); Serial.println(humvallsb, BIN);
humrawvalue = humvalmsb <<8| humvallsb;
Serial.print("Hum: "); Serial.println(humrawvalue, BIN);
Serial.println(" ");
delay(3000);
}
}
}