Interfaz Arduino con sensor de presión I2C

6

Tengo un sensor de presión Honeywell ASDXRRX100PD2A5 I2C que quiero leer utilizando un Arduino.

Mirando la hoja de datos, sé que la dirección I2C es 0x28, y he jugado con bits de código que he encontrado en Internet, pero ninguno de ellos tiene ningún sentido. Los números aumentan a medida que aumenta 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: enlace

Aquí hay una hoja de datos que contiene información sobre cómo comunicarse con los sensores Honeywell usando I2C: enlace

Sin tener mucha experiencia con I2C en el pasado, es difícil para mí entenderlo.

También, aquí hay una foto de mi configuración:

Elcódigoqueestoyusandoparaprobarloenestemomentoeselsiguiente:

#include<Wire.h>#definesensor0x28//Uniquebusaddressvoidsetup(){Wire.begin();//WakesupI2CbusSerial.begin(9600);}voidgetdata(byte*a,byte*b){//Moveregisterpointerbacktofirstregister//Wire.beginTransmission(sensor);//Wire.write(1);//Wire.endTransmission();Wire.requestFrom(sensor,2);//Sendscontentoffirsttworegisters*a=Wire.read();//firstbyterecievedstoredhere*b=Wire.read();//secondbyterecievedstoredhere}voidshowdata(){byteaa,bb;floatpressure=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();
}

Estoy obteniendo los siguientes resultados con 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.

    
pregunta JosephFTaylor

4 respuestas

4

¿Qué pasa?

El sensor es diferencial, hasta 100 psi.
entonces \ $ P_ {min} \ $ es -100psi, \ $ P_ {max} \ $ is + 100psi.
Total de 14 bits (de 0 a 2 14 -1),
\ $ P_ {min} \ $ está al 10%, por lo que \ $ OUTPUT_ {min} \ $ es 1638
\ $ P_ {max} \ $ está al 90%, por lo que \ $ OUTPUT_ {max} \ $ es 14745

de la hoja de datos: $$ P = \ dfrac {(SALIDA - SALIDA_ {min}) \ cdot (P_ {max} - P_ {min})} {SALIDA_ {max} - OUTPUT_ {min}} + SALIDA_ {min} $$

  • su primer \ $ SALIDA \ $ valor es \ $ (31 \ cdot 256) + 246 = 8182 \ $
    Según la ficha técnica, la presión es:
    $$ \ dfrac {(8182 - 1638) \ cdot (100 - (-100))} {14745 - 1638} - 100 \ approx -0.14496071 $$
  • su segundo valor es \ $ (34 \ cdot 256) + 102 = 8806 \ $
    $$ \ dfrac {(8806 - 1638) \ cdot (100 - (-100))} {14745 - 1638} - 100 \ aprox. 9.376669 $$
    La precisión no es tan buena, pero sigue siendo aceptable.
  • tercer valor: \ $ (32 \ cdot 256) + 30 = 8222 \ $
    $$ \ dfrac {(8222 - 1638) \ cdot (100 - (-100))} {14745 - 1638} - 100 \ aprox. 0.46540017 $$
    algo sale mal, no es como 20psi, es como 0psi.
  • cuarto valor: \ $ (39 \ cdot 256) + 167 = 10151 \ $
    $$ \ dfrac {(10151 - 1638) \ cdot (100 - (-100))} {14745 - 1638} - 100 \ aprox. 29.900053 $$
respondido por el edo1
2

Probablemente necesite agregar resistencias de pull-up al reloj I2C y las líneas de datos. La hoja de datos dice que \ $ 1 \ \ mathrm {k \ Omega} \ $ es el mínimo, así que tal vez intente \ $ 2.2 \ \ mathrm {k \ Omega} \ $. Las resistencias deben ir desde los pines hasta el suministro de + 5V.

    
respondido por el Adam Haun
1

Tengo el sensor diferencial ASDXRRX010ND2A5 con interfaz I2C. Le proporciona 2 bytes de datos que debe combinar para obtener la salida.

Este es mi código de prueba que da una salida 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;
}
    
respondido por el LIVEWIRE 240
0

Realmente no puedo ponerme al tanto de esto. En particular, el valor de 20 PSI parece sospechoso, ya que es más bajo que el valor de 10 PSI. Claro que no es 37?

Cualquiera, esta es una medida diferencial, por lo que sospecho que 32, 0 es la mitad de la escala, 63, 255 siendo la parte superior (la escala máxima es 63 * 256 + 255 = 16383 (o 3FFFh)). / p>

Entonces, cada valor que mida, debe restar 32 * 256 = 8192.

El valor 0 PSI es 32, 246, el valor completo es 8438, por lo que la presión (aún decimal) sería 8438 - 8192 = 246. Con la escala máxima (cada lado de 8192) correspondiente a 8192, esto 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 100PSI, 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 100PSI = 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.0PSIestámuylejos.Talvezelvalorera31,246?Esoda:

Lo que me hace sospechar que quizás deberías leer varias veces ¿Hasta dos valores consecutivos coinciden? Tenga en cuenta que es poco probable que confunde 31 y 32 debido a una resistencia pull-up o algo así. 31 son 5 consecutivos, mientras que 32 es solo uno [;-)]. También el El valor 0PSI está realmente fuera del rango de calibración del fabricante, que oscila entre el 10 y el 90%.

Editar : dudo que estés teniendo 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. Más fácil sería solo a 0 PSI. Trate de hacer la prueba sin pausa, luego con intervalos de 100 ms o menos. Busque saltos mayores que 1 en combinados b1 y b2 (es decir, en el número b1 * 256 + b2.

    
respondido por el jcoppens

Lea otras preguntas en las etiquetas