1
0
This repository has been archived on 2025-11-01. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
2025-10-10 02:20:31 +02:00

124 lines
3.4 KiB
C
Executable File

#include "stm32l4xx_hal.h"
#include "HTS221.h"
extern I2C_HandleTypeDef hi2c2;
//Estructura para almacenar la calibración
typedef struct{
//Valores de los registros
float H0_rH_x2;
float H1_rH_x2;
float T0_degC_x8;
float T1_degC_x8;
int16_t H0_T0_OUT;
int16_t H1_T0_OUT;
int16_t T0_OUT;
int16_t T1_OUT;
//Rectas de calibración para humedad y temperatura
float ha, hb;
float ta, tb;
} HTS_Calibration;
//Instancia de la calibración
HTS_Calibration hts_cal;
// Direcciones de los registros
#define I2C_TH 0xBE
#define HTS_H0_rH_x2 0x30
#define HTS_H1_rH_x2 0x31
#define HTS_T0_degC_x8 0x32
#define HTS_T1_degC_x8 0x33
#define HTS_T1_T0_MSB 0x35
#define HTS_H0_T0_OUT_LSB 0x36
#define HTS_H0_T0_OUT_MSB 0x37
#define HTS_H1_T0_OUT_LSB 0x3A
#define HTS_H1_T0_OUT_MSB 0x3B
#define HTS_T0_OUT_LSB 0x3C
#define HTS_T0_OUT_MSB 0x3D
#define HTS_T1_OUT_LSB 0x3E
#define HTS_T1_OUT_MSB 0x3F
void HTS221_UpdateCalibration(){
uint8_t buffer;
uint8_t tempMSB;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H0_rH_x2, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
hts_cal.H0_rH_x2 = buffer / 2.0f;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H1_rH_x2, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
hts_cal.H1_rH_x2 = buffer / 2.0f;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T1_T0_MSB, I2C_MEMADD_SIZE_8BIT, &tempMSB, 1, 1000);
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T0_degC_x8, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
hts_cal.T0_degC_x8 = (((tempMSB & 0x03) <<8) | buffer) / 8.0f ;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T1_degC_x8, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
hts_cal.T1_degC_x8 = (((tempMSB & 0x0C) <<6) | buffer) / 8.0f ;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H0_T0_OUT_LSB, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H0_T0_OUT_MSB, I2C_MEMADD_SIZE_8BIT, &tempMSB, 1, 1000);
hts_cal.H0_T0_OUT = (tempMSB <<8) | buffer;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H1_T0_OUT_LSB, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_H1_T0_OUT_MSB, I2C_MEMADD_SIZE_8BIT, &tempMSB, 1, 1000);
hts_cal.H1_T0_OUT = (tempMSB <<8) | buffer;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T0_OUT_LSB, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T0_OUT_MSB, I2C_MEMADD_SIZE_8BIT, &tempMSB, 1, 1000);
hts_cal.T0_OUT = (tempMSB <<8) | buffer;
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T1_OUT_LSB, I2C_MEMADD_SIZE_8BIT, &buffer, 1, 1000);
HAL_I2C_Mem_Read(&hi2c2, I2C_TH, HTS_T1_OUT_MSB, I2C_MEMADD_SIZE_8BIT, &tempMSB, 1, 1000);
hts_cal.T1_OUT = (tempMSB <<8) | buffer;
hts_cal.ha = (hts_cal.H1_rH_x2 - hts_cal.H0_rH_x2) / (hts_cal.H1_T0_OUT - hts_cal.H0_T0_OUT);
hts_cal.hb = hts_cal.H0_rH_x2 - hts_cal.ha*hts_cal.H0_T0_OUT;
hts_cal.ta = (hts_cal.T1_degC_x8 - hts_cal.T0_degC_x8) / (hts_cal.T1_OUT - hts_cal.T0_OUT);
hts_cal.tb = hts_cal.T0_degC_x8 - hts_cal.ha*hts_cal.T0_OUT;
}
void HTS221_Init() {
uint8_t buffer[1];
buffer[0] = 0x87;
HAL_I2C_Mem_Write(&hi2c2, 0xBE, 0x20, I2C_MEMADD_SIZE_8BIT, buffer, 1, 1000);
HTS221_UpdateCalibration();
}
THSample HTS221_Read() {
THSample ths;
uint8_t buffer[4];
HAL_I2C_Mem_Read(&hi2c2, 0xBE, 0x80 | 0x28, I2C_MEMADD_SIZE_8BIT, buffer, 4, 1000);
int16_t hum_raw;
int16_t temp_raw;
hum_raw = (buffer[1] << 8) | buffer[0];
temp_raw = (buffer[3] << 8) | buffer[2];
ths.hum = hts_cal.ha * hum_raw + hts_cal.hb;
ths.temp = hts_cal.ta * temp_raw + hts_cal.tb;
return ths;
return ths;
}