es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Lectura de temperatura BMP280 0x000FFFF0

Tengo un BMP280 (hoja de datos del módulo GY-BMP280) conectado a una Raspberry Pi 3 utilizando la interfaz IC2 (dirección 0x76). El GYBMP280 está conectado al pin de 3.3V (Pin 1).

Las lecturas de Presión parecen estar bien, fluctúan ligeramente como se espera.

Sin embargo, la lectura de Temperatura siempre es [255,255,0] = 0x000FFFF0. Confirmé con un termómetro infrarrojo que mi sensor tiene una temperatura razonable (aproximadamente 70F), la cual está dentro del rango de detección.

He reducido las bibliotecas que planeo usar en un programa de prueba breve que solo inicializa el GYBMP280 y lee los registros apropiados, como se muestra a continuación.

La página 24 de la hoja de datos de Bosch muestra el mapa de memoria.

¿Estoy haciendo algo mal o el módulo está defectuoso?

“`python
import smbus
import time

Obtener el bus I2C

bus = smbus.SMBus(1)

Dirección BMP280, 0x76(118)

Seleccionar el registro de medición de control, 0xF4(244)

0x27(39) Modo normal, tasa de sobremuestreo de presión y temperatura = 1

bus.write_byte_data(0x76, 0xF4, 0x27)

Dirección BMP280, 0x76(118)

Seleccionar el registro de configuración, 0xF5(245)

0xA0(00) Tiempo de espera en espera = 1000 ms

bus.write_byte_data(0x76, 0xF5, 0xA0)
time.sleep(0.5)

Dirección BMP280, 0x76(118)

Leer los datos de 0xF7(247), 8 bytes

MSB de presión, LSB de presión, xLSB de presión, MSB de temperatura, LSB de temperatura, xLSB de temperatura

data = bus.read_i2c_block_data(0x76, 0xF7, 6)
print(data)

Extraer Presión y Temperatura

adc_p = (data[0]<<16 | data[1]<<8 | data[2]) >> 4
adc_t = (data[3]<<16 | data[4]<<8 | data[5]) >> 4
print(“Presión = 0x{0:08X}”.format(adc_p))
print(“Temperatura = 0x{0:08X}”.format(adc_t))

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Según el código y las hojas de datos proporcionadas, parece que el problema podría estar relacionado con el Factor de Calibración de Temperatura. El BMP280 tiene un Factor de Calibración incorporado que debe usarse para convertir los datos en bruto del sensor en lecturas de temperatura reales. Este factor consiste en varios valores de 16 bits que proporcionan la corrección para el valor de temperatura en bruto leído del sensor.

    Para verificar si el Factor de Calibración está causando el problema, puedes intentar lo siguiente:

    1. Lee los valores del Factor de Calibración de los registros del BMP280. Según la hoja de datos, estos valores se almacenan en un total de 24 bytes, comenzando desde el registro 0x88 (que es el primer byte del valor “dig_T1”) y terminando en el registro 0xA1 (que es el último byte del valor “dig_T3”).

      Puedes leer estos bytes utilizando el siguiente código:

      calib = bus.read_i2c_block_data(0x76, 0x88, 24)
      
    2. Una vez que tengas los valores del Factor de Calibración, puedes usarlos para convertir el valor de temperatura en bruto leído del sensor en lecturas de temperatura reales. Esto se hace combinando primero el valor de temperatura en bruto (que es un entero firmado de 20 bits) con los valores del Factor de Calibración para obtener un valor corregido, y luego aplicando una fórmula para convertir este valor corregido en unidades de temperatura reales (en grados Celsius).

      La fórmula para convertir el valor corregido en unidades de temperatura está dada en la hoja de datos como:

      var1 = (((adc_t >> 3) - (dig_T1 << 1)) * dig_T2) >> 11
      var2 = (((((adc_t >> 4) - dig_T1) * ((adc_t >> 4) - dig_T1)) >> 12) * dig_T3) >> 14
      t_fine = var1 + var2
      temperature = (t_fine * 5 + 128) >> 8
      

      Aquí, “adc_t” es el valor de temperatura en bruto leído del sensor, “dig_T1” a “dig_T3” son los valores del Factor de Calibración que leíste en el paso 1, y “t_fine” es una variable intermedia utilizada en la fórmula de conversión (representa un valor de temperatura en unidades de 0.01 grados Celsius).

      Puedes agregar este código de conversión a tu programa existente de la siguiente manera:

      # Leer los valores del Factor de Calibración
      calib = bus.read_i2c_block_data(0x76, 0x88, 24)
      dig_T1 = (calib[1] << 8) | calib[0]
      dig_T2 = (calib[3] << 8) | calib[2]
      dig_T3 = (calib[5] << 8) | calib[4]
      
      # Convertir el valor de temperatura en bruto a temperatura real
      var1 = (((adc_t >> 3) - (dig_T1 << 1)) * dig_T2) >> 11
      var2 = (((((adc_t >> 4) - dig_T1) * ((adc_t >> 4) - dig_T1)) >> 12) * dig_T3) >> 14
      t_fine = var1 + var2
      temperature = (t_fine * 5 + 128) >> 8
      
      print("temp = {0:.2f} C".format(temperature / 100))
      

      Ten en cuenta que el valor final de temperatura se divide por 100 para convertirlo de unidades de 0.01 grados Celsius a grados Celsius. Además, se utiliza el especificador de formato “{0:.2f}” para imprimir el valor de temperatura con dos decimales.

Comments are closed.