diff --git a/Inc/DS_TMP112.h b/Inc/DS_TMP112.h new file mode 100644 index 0000000..4b5d7bd --- /dev/null +++ b/Inc/DS_TMP112.h @@ -0,0 +1,26 @@ +#ifndef DS_TMP112_H +#define DS_TMP112_H + +#ifdef STM32G030xx + #include "stm32g0xx_hal.h" +#endif + +#ifdef STM32F030xx + #include "stm32f0xx_hal.h" +#endif + +#ifdef STM32F103xB + #include "stm32f1xx_hal.h" +#endif + +#ifdef STM32L152xC + #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/README.md b/README.md index 6421aa6..95151ec 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,17 @@ # TMP112 +Для добавления в проект: +git submodule add https://git.domstudent.ru/Library/DS_TMP112 + +Затем добавляем в корневой CMakeLists.txt + +# Library folder +set(DS_Include_Dirs + ${CMAKE_SOURCE_DIR}/Library/DS_TMP112/Inc +) +target_include_directories(stm32cubemx INTERFACE ${DS_Include_Dirs}) + +set(DS_Application_Src + ${CMAKE_SOURCE_DIR}/Library/DS_TMP112/Src/DS_TMP112.c +) +target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${DS_Application_Src}) \ No newline at end of file diff --git a/Src/DS_TMP112.c b/Src/DS_TMP112.c new file mode 100644 index 0000000..5a0e793 --- /dev/null +++ b/Src/DS_TMP112.c @@ -0,0 +1,35 @@ +#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