5.9 KiB
Драйвер высокоточного датчика температуры DS_TMP112
Низкоуровневый драйвер на Си для работы с ультракомпактным цифровым датчиком температуры TMP112 (а также совместимыми TMP102 / TMP112A/B) по интерфейсу I2C. Датчик обладает высокой точностью (до 0.5°C) и возможностью работы в 12-битном или 13-битном (Extended) режимах.
📌 Особенности реализации
- Объектно-ориентированный дескриптор: Драйвер инкапсулирует конфигурацию и указатель на шину I2C, позволяя опрашивать несколько физических датчиков TMP112 на разных адресах.
- Прямая оцифровка: Функция чтения автоматически собирает два байта данных из регистра температуры (
0x00), учитывая формат Big-Endian и знаковые биты (дополнение до двух), возвращая готовое вещественное значение температуры. - Минимальное энергопотребление: Поддержка перевода датчика в режим Shutdown Mode для экономии батарейного питания между замерами.
🚀 Способ добавления в ваш проект (Git Submodule)
Библиотека подключается к вашему текущему проекту как подмодуль Git. Это позволяет фиксировать рабочую версию драйвера и обновлять её независимо от основного кода.
1. Подключение подмодуля
Откройте терминал в корневом каталоге вашего проекта и выполните команду:
git submodule add https://git.domstudent.ru/Library/DS_TMP112 Library/DS_TMP112
После этого Git создаст в папке Library/ директорию DS_TMP112 и скачает актуальные файлы драйвера.
2. Автоматическое обновление сборки CMake
Перейдите в папку с вашими автоматизированными утилитами и запустите PowerShell-скрипт обновления (из репозитория DS_UpdateCMakeList):
cd tools/
./UpdateCMakeList.ps1
Скрипт рекурсивно обойдет добавленную папку подмодуля, автоматически найдет пути к заголовочным файлам Library/DS_TMP112/Inc и исходному коду DS_TMP112.c, интегрируя их в ваш CMakeLists.txt.
🔌 Схема подключения (I2C)
Стандартный 7-битный адрес датчика на шине I2C по умолчанию равен 0x48 (если пин ADD0 подключен к GND). Для передачи в функции HAL адрес необходимо смещать влево на 1 бит (0x48 << 1 = 0x90).
| Вывод датчика TMP112 | Вывод STM32 | Назначение |
|---|---|---|
| V+ / VCC | 3.3V | Питание датчика (1.4V — 3.6V) |
| GND | GND | Общая земля |
| SCL | I2Cx_SCL | Тактовая линия шины I2C |
| SDA | I2Cx_SDA | Линия данных шины I2C |
| ALT | Любой GPIO_Input | Выход аппаратного оповещения ALERT (опционально) |
💻 Пример использования в main.c
#include "DS_TMP112.h"
extern I2C_HandleTypeDef hi2c1;
DS_TMP112 cabinet_sensor;
int main(void) {
// ... Автоматическая инициализация HAL, GPIO, I2C ...
/* 1. Инициализация датчика (адрес 0x48 сдвигаем для HAL: 0x90) */
DS_TMP112_Init(&cabinet_sensor, &hi2c1, 0x90);
/* 2. Конфигурирование (например, включение 12-битного режима, частота обновления 4 Гц) */
DS_TMP112_Configure(&cabinet_sensor);
while (1) {
/* 3. Чтение реальной температуры в градусах Цельсия */
float current_temp = DS_TMP112_ReadTemperature(&cabinet_sensor);
// Переменная current_temp готова для логирования или вывода на дисплей
HAL_Delay(1000);
}
}
📋 Справочник API функций
void DS_TMP112_Init(DS_TMP112 *sensor, I2C_HandleTypeDef *hi2c, uint8_t DevAddr)
Выполняет первичную логическую привязку дескриптора датчика к конкретной аппаратной шине I2C и I2C-адресу чипа на плате.
void DS_TMP112_Configure(DS_TMP112 *sensor)
Записывает базовые настройки в 16-битный регистр конфигурации 0x01 (установка шага конвертации, режима работы и порогов компаратора).
float DS_TMP112_ReadTemperature(DS_TMP112 *sensor)
Выполняет чтение регистра температуры 0x00, сдвигает 12-битное/13-битное значение, восстанавливает математический знак температуры для отрицательных величин и умножает сырое значение на шаг шкалы (0.0625 °C). Возвращает результат типа float.