STM32 SHT3x 온습도 센서 포팅

이전 포스트에서 포팅한 ads1115 모듈은 16비트의 4채널을 가진 ADC 모듈로 외부 온도센서 등을 연결하여 온도를 측정하는 방식이라면 SHT3x는 모듈에 온습도 센서를 포함하고 있어, 추가적인 온습도 센서를 포팅할 필요가 없다.

 

따라서, ads1115와 달리 레지스터 세팅도 특별히 없으며, 특정 레지스터에서 온습도 값을 읽으면 된다. 하지만 읽은 데이터의 무결성 검사를 위해 CRC8 구현해야 한다. 이것도 로직을 제공하고 있어 큰 어려움은 없다.

온습도 값은 STH3x_MEASURE_HIGHREP_STRETCH 레지스터 값을 읽으면 얻을 수 있는데, I2C read timeout 값을 최소 20ms 이상으로 설정해야 한다. 

uint32_t sht3x_read_temperature_humidity(float* temperature, float* humidity)
{
  uint8_t data[6] = {0, };
  uint8_t crc_temper;
  uint8_t crc_humid;
  uint16_t raw_temper;
  uint16_t raw_humid;

  if (i2c_read(HUMI_SENSOR, SHT3x_MEASURE_HIGHREP_STRETCH, 2, data, sizeof(data), 20) != 0) {
    return 1;
  }

  crc_temper = sht3x_calculate_crc(data, 2);
  crc_humid = sht3x_calculate_crc(&data[3], 2);
  if (crc_temper != data[2] || crc_humid != data[5]) {
    return 1;
  }

  raw_temper = (uint16_t)((data[0] << 8) | data[1]);
  raw_humid = (uint16_t)((data[3] << 8) | data[4]);

  *temperature = -45.0f + (175.0f * (raw_temper / 65535.0f));
  *humidity = 100.0f * (raw_humid / 65535.0f);

  return 0;
}

습관적으로 I2C read timeout 값을 10ms 설정해서, 온습도 값을 못 읽는 경우가 종종 발생하여 datasheet를 찾아보니, 최대 15ms 라고 하지만 안전하게 20ms로 설정하여 문제없는 것을 확인하였다.

위 예제코드는 아래 GitHub의 F407/Sensor 디렉토리를 참고하도록 한다.

 

GitHub - highgon2/STM32: STM32 TestCode

STM32 TestCode. Contribute to highgon2/STM32 development by creating an account on GitHub.

github.com