Tengo un sensor de presión Honeywell ASDXRRX100PD2A5 I2C que quiero leer usando un Arduino.
Mirando la hoja de datos, sé que la dirección I2C es 0x28, y he jugado con fragmentos de código que he encontrado en Internet, pero ninguno de ellos tiene ningún sentido. Los números aumentan a medida que aumento la presión, pero no en la escala que se muestra en la hoja de datos.
Aquí hay un enlace a dicha hoja de datos: http://www.farnell.com/datasheets/1676926.pdf
Aquí hay una hoja de datos que tiene información sobre la comunicación con sensores Honeywell usando I2C: http://sensing.honeywell.com/index.php/ci_id/45841/la_id/1/document/1/re_id/0
Sin tener mucha experiencia con I2C en el pasado, es difícil para mí entenderlo.
Además, aquí hay una foto de mi configuración:
El código que estoy usando para probarlo en este momento es el siguiente:
#include<Wire.h>
#define sensor 0x28 //Unique bus address
void setup()
{
Wire.begin();//Wakes up I2C bus
Serial.begin(9600);
}
void getdata(byte *a, byte *b)
{
//Move register pointer back to first register
//Wire.beginTransmission(sensor);
//Wire.write(1);
//Wire.endTransmission();
Wire.requestFrom(sensor,2);//Sends content of first two registers
*a = Wire.read(); //first byte recieved stored here
*b = Wire.read(); //second byte recieved stored here
}
void showdata()
{
byte aa,bb;
float pressure =0;
getdata(&aa,&bb);
Serial.print("byte 1: ");Serial.println(aa,DEC);
Serial.print("byte 2 ");Serial.println(bb,DEC);
delay(1000);
}
void loop()
{
showdata();
}
Obtengo los siguientes resultados a las siguientes presiones:
0psi byte1: 31
byte2: 246
10psi byte1: 34
byte2: 102
20psi byte1: 32
byte2: 30
30psi byte1: 39
byte2: 167
Cualquier ayuda que me indique la dirección correcta sería muy apreciada.
¿Qué ocurre?
El sensor es diferencial, hasta 100 psi.
asi que
es -100 psi,
es +100 psi.
Total 14 bits (de 0 a 2 14 -1),
está al 10%, entonces
es 1638
está al 90%, entonces
es 14745
de la hoja de datos:
Probablemente necesite agregar resistencias pull-up al reloj I2C y las líneas de datos. La hoja de datos dice que es el mínimo, así que tal vez intente . Las resistencias deben ir desde los pines hasta el suministro de +5V.
Tengo el sensor diferencial ASDXRRX010ND2A5 con interfaz I2C. Le proporciona 2 bytes de datos que debe combinar para obtener el resultado.
Este es mi código de prueba, da una salida de alrededor de 8190 cuando no se aplica presión. Según la hoja de datos, el valor de salida es la diferencia entre los 2 puertos.
//Sensor ASDXRRX010ND2A5
#include <Wire.h>
float a, b, Output, Pressure;
const long OutMax = 14745, OutMin = 1638;
const long PressureMax = 10, PressureMin = -10; //Inches of H20
void setup() {
Wire.begin(0x28);
Serial.begin(9600);
}
void loop() {
Wire.requestFrom(0x28, 2);
a = Wire.read();
b = Wire.read();
Output = BitShiftCombine(a , b);
Pressure = (((Output - OutMin) * (PressureMax - PressureMin)) / (OutMax - OutMin)) + PressureMin;
Serial.println(Pressure); //Inches of H20
delay(100);
}
long BitShiftCombine( unsigned char x_high, unsigned char x_low)
{
long combined;
combined = x_high; //send x_high to rightmost 8 bits
combined = combined << 8; //shift x_high over to leftmost 8 bits
combined |= x_low; //logical OR keeps x_high intact in combined and fills in rightmost 8 bits
return combined;
}
Realmente no puedo entender ni pies ni cabeza en esto. En particular, el valor de 20 PSI parece sospechoso, ya que es más bajo que el valor de 10 PSI. ¿Seguro que no es 37?
De todos modos, esta es una medida diferencial, por lo que sospecho que 32, 0 es la mitad de la escala, 63, 255 está en la parte superior (la escala máxima es 63 * 256 + 255 = 16383 (o 3FFFh)).
Entonces, cada valor que midas, debes restar 32*256 = 8192.
El valor de 0 PSI es 32, 246, el valor completo es 8438, por lo que la presión (todavía decimal) sería 8438 - 8192 = 246. Con la escala máxima (cada lado de 8192) correspondiente a 8192, sería 246/8192 = 3,0066 psi. ¿Presión residual? ¿O debería ser 31, 246?
El valor de 30 PSI 39, 167, es realmente 10151, luego 10151-8192=1959. Esto es 1959/8182 de 100 PSI, por lo que 23,9 PSI.
El valor de 10 PSI 34, 102, es realmente 8806, luego 8806-8192=614. Esto da como resultado 614/8192 de 100 PSI = 7,5 PSI
Hipotéticamente, si el primer número para 20PSI fuera 37, el número sería 9502, o 9502-8192= 1320 positivo, o 1320/8192 de 100PSI = 16PSI
¿Podría ser esta una buena explicación?
Aquí hay una captura de pantalla de una hoja de cálculo:
Mmmm. 0PSI está muy lejos. ¿Quizás el valor era 31, 246? Eso da:
¿Lo que me hace sospechar que tal vez deberías leer varias veces hasta que dos valores consecutivos coincidan? Tenga en cuenta que es poco probable que confunda 31 y 32 debido a una resistencia pull-up más o menos. 31 son 5 consecutivos, mientras que 32 es uno solo [;-)]. Además, el valor de 0PSI está realmente fuera del rango de calibración del fabricante, que va del 10 al 90%.
Editar : dudo que tenga errores de lectura (aunque, por supuesto, no puedo excluir la posibilidad). Para evaluar eso, le sugiero que intente hacer, digamos 100 mediciones en las mismas condiciones, es decir, la misma presión. Lo más fácil sería solo a 0 PSI. Intente hacer la prueba sin pausa, luego con intervalos de 100ms más o menos. Busque saltos mayores que 1 en la combinación de b1 y b2 (es decir, en el número b1*256 + b2.
Usuario323693
josefaylor
Usuario323693
josefaylor
charliehanson
josefaylor