diff --git a/Inc/DS_TMP112.h b/Inc/DS_TMP112.h index 4fe98ab..4b5d7bd 100644 --- a/Inc/DS_TMP112.h +++ b/Inc/DS_TMP112.h @@ -17,5 +17,10 @@ #include "stm32l1xx_hal.h" #endif +/** + * Возвращает температуру в миллиградусах Цельсия (1/1000 °C) + * Пример: 25500 означает 25.5°C + */ +int32_t DS_TMP112_ReadTemperature(I2C_HandleTypeDef *hi2c); #endif //DS_TMP112_H \ No newline at end of file diff --git a/Src/DS_TMP112.c b/Src/DS_TMP112.c index 8d65019..5a0e793 100644 --- a/Src/DS_TMP112.c +++ b/Src/DS_TMP112.c @@ -1 +1,35 @@ -#include \ No newline at end of file +#include + +int32_t DS_TMP112_ReadTemperature(I2C_HandleTypeDef *hi2c) +{ + // Адрес TMP112 (обычно 0x48 << 1, если ножка ADD0 на GND) + #define TMP112_ADDR (0x48 << 1) + #define TMP112_REG_TEMP 0x00 + + uint8_t data[2]; + int16_t raw; + + // Читаем 2 байта из регистра температуры + if (HAL_I2C_Mem_Read(hi2c, TMP112_ADDR, TMP112_REG_TEMP, I2C_MEMADD_SIZE_8BIT, data, 2, 100) != HAL_OK) { + return -999000; // Ошибка чтения + } + + // Объединяем байты: MSB — это целая часть, LSB — дробная (4 верхних бита) + raw = (data[0] << 4) | (data[1] >> 4); + + // Поддержка отрицательных температур (12-битное число с дополнением до 2) + if (raw > 0x7FF) { + raw -= 4096; + } + + // Шаг датчика 0.0625°C (или raw / 16) + //return (float)raw * 0.0625f; + + + // Расчет в целых числах: + // Один шаг (LSB) = 0.0625°C = 1/16°C + // Чтобы получить миллиградусы: (raw * 1000) / 16 + // Это эквивалентно: raw * 62.5. Используем raw * 125 / 2 + return (int32_t)raw * 125 / 2; + +} \ No newline at end of file