#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; }