# Драйвер датчика давления и температуры DS_BMP180 Драйвер на Си для работы с цифровым барометрическим датчиком **BMP180** (а также совместимым BMP085) по интерфейсу I2C. Библиотека обеспечивает чтение заводских калибровочных коэффициентов из EEPROM чипа и производит математическую компенсацию нелинейности показаний. ## 📌 Особенности реализации * **Полная аппаратная компенсация**: Драйвер содержит внутреннюю структуру `Calibration` для хранения 11 уникальных заводских коэффициентов (`AC1`–`MD`) и промежуточного фактора `B5`. * **Поддержка Oversampling (OSS)**: Реализована возможность выбора точности измерения давления от экономичного (0) до сверхвысокого разрешения (3) через функцию конфигурирования. * **Целочисленная математика**: Все формулы вычисления оптимизированы под битовые сдвиги и целочисленные типы данных `long`/`uint32_t`, что исключает нагрузку на блок плавающей точки (FPU) микроконтроллера. --- ## 🔌 Схема подключения (I2C) Адрес устройства на шине I2C фиксирован аппаратно и равен `0x77` (в функциях HAL адрес необходимо передавать со сдвигом: `0x77 << 1`). | Вывод датчика BMP180 | Вывод STM32 | Назначение | | :--- | :--- | :--- | | **VCC** | 3.3V / 5V | Питание модуля (зависит от наличия стабилизатора на плате) | | **GND** | GND | Общая земля | | **SCL** | I2Cx_SCL | Тактовая линия шины I2C | | **SDA** | I2Cx_SDA | Линия данных шины I2C | --- ## 💻 Пример использования в `main.c` Датчик является асинхронным: сначала подается команда на запуск преобразования, затем выдерживается пауза на замер, и только после этого считывается результат. ```c #include "DS_BMP180.h" extern I2C_HandleTypeDef hi2c1; DS_BMP180 barometer; int main(void) { // ... Автоматическая инициализация HAL, GPIO, I2C ... /* 1. Инициализация и вычитка калибровочных коэффициентов */ // Передаем сдвинутый адрес: 0x77 << 1 = 0xEE DS_BMP180_Init(&barometer, &hi2c1, 0xEE); while (1) { /* 2. Измерение ТЕМПЕРАТУРЫ */ DS_BMP180_StartConversionTemperature(&barometer); HAL_Delay(5); // Пауза на преобразование температуры по даташиту (min 4.5 мс) long raw_temp = DS_BMP180_GetTemperature(&barometer); float real_temp = raw_temp / 10.0f; // Результат возвращается в десятых долях градуса /* 3. Измерение ДАВЛЕНИЯ */ // Запуск в режиме ультравысокого разрешения OSS = 3 DS_BMP180_StartConversionPressure(&barometer, 3); HAL_Delay(26); // Пауза для режима OSS=3 (min 25.5 мс) long pressure_pa = DS_BMP180_GetPressure(&barometer); // Результат в Паскалях (Па) float pressure_mmhg = pressure_pa / 133.3224f; // Перевод в мм ртутного столба // Полученные данные real_temp и pressure_mmhg готовы для вывода HAL_Delay(1000); } } ``` --- ## 📋 Справочник API функций ### `void DS_BMP180_Init(DS_BMP180 *DS_BMP180, I2C_HandleTypeDef *hi2c, uint8_t address)` Выполняет первичную привязку дескриптора к шине I2C и вычитывает массив из 22 байт из регистра `0xAA` для заполнения таблицы калибровочных констант. ### `void DS_BMP180_StartConversionTemperature(DS_BMP180 *DS_BMP180)` Записывает команду `0x2E` в управляющий регистр `0xF4`, запуская внутренний аналого-цифровой замер температуры. ### `long DS_BMP180_GetTemperature(DS_BMP180 *DS_BMP180)` Считывает регистры данных `0xF6`-`0xF7`, рассчитывает промежуточный фактор компенсации `B5` и возвращает температуру. * **Выходное значение**: Целое число (например, значение `245` соответствует температуре `24.5 °C`). ### `void DS_BMP180_StartConversionPressure(DS_BMP180 *DS_BMP180, uint8_t OversamplingRatio)` Запускает замер давления с указанным коэффициентом аппроксимации `OversamplingRatio` (значения от `0` до `3`). ### `long DS_BMP180_GetPressure(DS_BMP180 *DS_BMP180)` Вычитывает 3 байта сырых данных давления, выполняет полную компенсацию нелинейности по формулам Bosch с использованием ранее рассчитанного фактора `B5`. * **Выходное значение**: Давление в Паскалях (`Pa`).