Obtengo el mismo valor, cuando se lee a través de i2c - stm32 + hih6030

0

Quiero usar mi sensor de humedad y temperatura HIH6030 con mi tarjeta STM32F4, pero tengo el siguiente problema:

Enciendo mi tablero y empiezo a depurar. La primera vez que trato de leer está bien. Parece que obtuve buenos valores, pero la próxima vez que leo datos del sensor obtengo exactamente los mismos valores que antes. Todas las veces obtengo los mismos valores, hasta que reinicio mi tablero.

No puedo ver cuál podría ser el problema. Espero que ustedes me puedan ayudar.

Mi código:

#define HIH_ADDRESS 0x27

typedef struct {
    double temperature;
    double humidity;
} HIH_readout;

void initI2C() {
    __HAL_RCC_I2C2_CLK_ENABLE();
    hi2c2.Instance = I2C2;
    hi2c2.Init.ClockSpeed = 400000;
    hi2c2.Init.DutyCycle = I2C_DUTYCYCLE_2;
    hi2c2.Init.OwnAddress1 = 0;
    hi2c2.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;
    hi2c2.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;
    hi2c2.Init.OwnAddress2 = 0;
    hi2c2.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;
    hi2c2.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;
    if (HAL_I2C_Init(&hi2c2) != HAL_OK)
    {
        initStatus = ERROR_I2C_INIT;
    }
}

int HIH_read(HIH_readout* buffer) {
    uint8_t data[4];
    uint16_t temp_humidity;
    uint16_t temp_temperature;

    if(HAL_I2C_Master_Receive(&hi2c2, HIH_ADDRESS << 1,data, 4, 10) != HAL_OK){
        buffer->humidity = 0;
        buffer->temperature = 0;
        return HIH_FAIL;
    }
    uint8_t status = (data[0] & (uint8_t)0xC0U);
    //Masking MSB (status) bits
    temp_humidity = ((data[0] & ((uint8_t)0x3FU)) << 8) | data[1];
    //Masking LSB (don't care) bits
    temp_temperature = (data[2] << 8) | (data[3] & ((uint8_t)0xFCU));
    //The last two bits -> don't care
    temp_temperature = temp_temperature >> 2;

    //SCALE AND CAST
    buffer->humidity = (double)(temp_humidity * 100 / (pow(2,14) - 1));
    buffer->temperature = (double)(temp_temperature / (pow(2, 14) - 1) * 165 - 40);

    return HIH_OK;

}

Cuando mi principal comienza, llamo HAL_Init (); initI2C (); y después de while (1), llamo a HIH_read; Usé Cubemx para generar el código de inicialización, así que espero que funcione bien.

    
pregunta prodx

1 respuesta

3

Con solo mirar esas líneas de código, creo que el error podría ocurrir en su código de lanzamiento:

//SCALE AND CAST
buffer->humidity = (double)(temp_humidity * 100 / (pow(2,14) - 1));
buffer->temperature = (double)(temp_temperature / (pow(2, 14) - 1) * 165 - 40);

Al hacerlo, los valores se convierten después de que se realizan los cálculos de escala, justo antes de guardar. Esto significa que los cálculos todavía se hacen como enteros. Entonces, como la humedad y la temperatura probablemente solo varíen un poco, perderá estos cambios allí mismo.

Para ejecutar un cálculo como doble, al menos un operando debe ser un valor doble. Pruébalo así:

//SCALE AND CAST
buffer->humidity = ((double)temp_humidity * 100 / (pow(2,14) - 1));
buffer->temperature = ((double)temp_temperature / (pow(2, 14) - 1) * 165 - 40);

Espero que esto te funcione

    
respondido por el bunto1

Lea otras preguntas en las etiquetas