BMP280 – температура и атмосферное давление – учебный проект

Views: 2292


Учебный проект на PIC32 и светодиодной панели P5 (2121)-168-6432-80 (32*64).

Проект позволяет ознакомиться с простой графикой и с чтением давления и температуры с датчика BMP280.

Для тестирования необходимо собрать следующую схему.

Схему в формате pdf можно скачать внизу страницы.

Для тестирования используется модуль приобрести его можно как всегда у китайцев.

Датчик позволяет измерять окружающую температуру и атмосферное давление.

Для разработки будем использовать библиотеку графики от Catcatcat и библиотеку от BOSCH для датчика BMP280. Библиотеку для графики можно скачать внизу статьи, а библиотеку для датчика вот отсюда /BMP280_driver.

 

Выберем Harmony проект

Зададим папку проекта и имя проекта.

Настроим на наш микроконтроллер и установим кодовую страницу проекта, от которой страницы будут зависит формируемые коды символов.

Кодовая страница.

Настроим выбор микроконтроллера, версию компилятора, тип дебаггера

Для работы библиотеки графики для светодиодного модуля необходимо настроить порты микроконтроллера и включить таймер для формирования периода для формирования развертки на дисплее.

Перейдем в закладки опции и настроим работу таймера. Сначала зайдем в System Services и активируем системный таймер.

Откроем раздел Драйверы и настроем для управления разверткой дисплея таймер 2. Режим статический, таймер 2, предделитель на 64, период 500.

 

Запустим генерацию проекта

Будут с регенерированы основные файлы проекта.

Следующий этап добавим библиотеку графики для светодиодного модуля. Добавления выполним классическим образом. Нам необходимо взять папку DRIVER_HUB75 содержащую драйвер для формирования изображения на светодиодных модулях, и папку GRAPHICS_HUB75 с функциями графики и добавим в наш проект.

Я это делаю так, в папке проекта, создаю папку с именем ch_lib, вней я храню все свои библиотеки.

В неё добавим наши библиотеки.

Теперь подключим библиотеки к нашему проекту. Сначала добавим рабочие файлы.

Добавим каталог с нашей библиотекой.

В структуре проекта появиться каталог с библиотеками.

Теперь аналогичным образом добавит заголовки библиотек.

После добавления папки заголовков будут пустые, необходимо дополнительно добавить заголовки каждый в свой каталог.

Файл заголовок драйвера.

Файл заголовка графической библиотеки.

Теперь необходимо добавить драйвер в прерывания таймера, откроем файл прерываний.

 

Добавим в прерывания таймера 2 следующие строки.

void __ISR(_TIMER_2_VECTOR, ipl1AUTO) IntHandlerDrvTmrInstance0(void)
{
    Drive_hab75();                  // видео драйвер
    
    if(timer_tact1>0)timer_tact1--; // таймер скорости бегущей реки
    if(timer_tact2>0)timer_tact2--; //
    
    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_2);
}

Для подключения достаточно добавить заголовок библиотеки графики, описание на драйвер в ней уже есть.

//------------------------------------------------------------------------------
#include "../ch_lib/GRAPHICS_HUB75/graphics.h"  // библиотека графики
//------------------------------------------------------------------------------

Теперь можно протестировать вывод изображения на дисплей. Для этого откроем файл app.c.

Добавим заголовок библиотеки графики.

//------------------------------------------------------------------------------
#include "../ch_lib/GRAPHICS_HUB75/graphics.h"
//------------------------------------------------------------------------------

И в Функцию void APP_Tasks ( void ) в case APP_STATE_SERVICE_TASKS: бегущую строку с надписью, что даст нам возможность опробовать работу функций вывода изображения на дисплей.

        case APP_STATE_SERVICE_TASKS:
        {
        
            Scrolling2("Температура и давление, от Catcatcat electronics!", 5, 1, 53, 2, 1, 1, 100, Fuchsia, Black);
            
            break;
        }

Загрузим проект и проверим работу графики.

Дополнительно добавим прорисовку прямоугольников, для красоты со случным выводом цвета. Для этого подключим библиотеку stdlib.h  для функции rand. И добавим  строки.

            if(++f>3000000)
            {
                f=0;
                
                Rectangle( 0,  0,  1,  1,   5,  20,  8,  8, rand()%7, rand()%7);
                Rectangle( 0,  0,  1,  1,  15,  20,  8,  8, rand()%7, rand()%7);
                Rectangle( 0,  0,  1,  1,  25,  20,  8,  8, rand()%7, rand()%7);
                Rectangle( 0,  0,  1,  1,  35,  20,  8,  8, rand()%7, rand()%7);
            }

У вас должно быть изображение:

Вверху каждые две секунды 4 квадрата с изменяющимся цветом, внизу бегущая строка.

Для работы с датчиком BMP280 нам необходимо активировать I2C модуль. Для этого перейдем в конфигуратор и настроим порты для пятого модуля I2C.

Активируем модуль. Статический режим, модель передача буфера данных, модуль 5 скорость 100 кб.

Выполним генерацию проекта.

Подключим библиотеку от Bosch для датчика BMP280.

Для этого скачаем файлы как это описано в начале статьи и добавим библиотеку в проект для этого скопируем каталог BMP280, в папку Bosch нашего проекта.

Добавим библиотеку в проект, ка это делалось ранее.

Библиотека требует промежуточных файлов для связи с модулем I2C. Для этого надо создать три функции.

Функция задержки:

void delay_ms(uint32_t period_ms)
{
    /* Реализуйте процедуру задержки в соответствии с целевой машиной */
    time_delayi = 3*period_ms;        // функция задержки 1 ms
    while (time_delayi);    //
}

Нужна функция записи.

int8_t i2c_reg_write(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{
    bufer.adress = reg_addr;
    memcpy(bufer.bufer,reg_data,length);
    DRV_I2C0_Transmit (i2c_addr<<1, &bufer, length+1, 0);
    delay_ms(2);
    return 0;
}

Для функции записи опишем структуру.

typedef struct 
{
    uint8_t adress;             // адрес старший байт
    uint8_t bufer[100];         // буфер данных для передачи
}_bufer;                        //

И функцию чтения.

int8_t i2c_reg_read(uint8_t i2c_addr, uint8_t reg_addr, uint8_t *reg_data, uint16_t length)
{
static uint8_t  reg_addrr;
    reg_addrr = reg_addr;
    DRV_I2C0_TransmitThenReceive(i2c_addr<<1,&reg_addrr,1,reg_data,length,0);
    delay_ms(2);
    return 0;
}

Создадим промежуточную библиотеку, назовем её например bmp280_in. Добавим файлы в проект.

В итоге мы должны получить следующую структуру проекта.

Для запуска работы датчика необходимо в начале выполнить процедуру инициализации, после чего можно считывать данные температуры и давления. Датчик может преобразовывать отдельно температуру и давление или выполнять обо преобразования одновременно, в зависимости от как эффективно и точно необходимо получать данные, могут быть заданы разнообразные режимы работы.

В конце стать есть частичный передо описания датчика, в котором можно более подробно получить описание датчика и его возможности.

Подключим наши библиотеки в файле app.c

#include "../Bosch/BMP280/bmp280.h"         // Библиотека Bosch для датчика bmp280
#include "../ch_lib/BMP280_IN/bmp280_in.h"  // Связывающие драйвера

Добавим промежуточные переменный и структуры для обработки данных.

struct bmp280_dev bmp;
struct bmp280_config conf;
struct bmp280_uncomp_data ucomp_data;
uint32_t tempI, presI;

А также последовательность инициализации и индикации температуры и давления.

                if(!flag)
                {
                    /* Сопоставьте указатель функции задержки с функцией, ответственной за реализацию задержки */
                    bmp.delay_ms = delay_ms;
                    /* Присвойте устройству адрес I2C в зависимости от состояния SDO pin (GND for PRIMARY(0x76) & VDD for SECONDARY(0x77)) */
                    bmp.dev_id = BMP280_I2C_ADDR_PRIM;
                    /* Выберите режим интерфейса как I2C */
                    bmp.intf = BMP280_I2C_INTF;
                    /* Сопоставьте указатель функции чтения и записи I2C с функциями, отвечающими за передачу шины I2C */
                    bmp.read = i2c_reg_read;
                    bmp.write = i2c_reg_write;
                    /*инициализация модуля*/
                    bmp280_init(&bmp);
                    /* Обязательное чтение текущих настройк перед записью, особенно когда все настройки не изменены */
                    bmp280_get_config(&conf, &bmp);
                    /* настройка передискретизации температуры, коэффициента фильтра и скорости передачи данных на выходе */
                    /* Коэффициент фильтра*/
                    conf.filter = BMP280_FILTER_COEFF_2;
                    /* Передискретизация давления установлена на 4x */
                    conf.os_pres = BMP280_OS_4X;
                    /* Передискретизация температуры установлена на 4x */
                    conf.os_temp = BMP280_OS_4X;
                    /* Отключение измерения теперературы или давления */
            //        conf.os_pres = BMP280_OS_NONE;
            //        conf.os_temp = BMP280_OS_NONE;
                    /* Установка скорости передачи данных на выходе 1HZ(1000ms) */
                    conf.odr = BMP280_ODR_1000_MS;
                    /* Конфигурирование модуля */
                    bmp280_set_config(&conf, &bmp);

                    /* Всегда устанавливайте режим питания после настройки конфигурации */
                    bmp280_set_power_mode(BMP280_NORMAL_MODE, &bmp);

                    flag=1;
                }
    
                /* Чтение необработанных данных с датчика */
                bmp280_get_uncomp_data(&ucomp_data, &bmp);

                /* Получение компенсированного давления с использованием 32-битной точности */
                presI = bmp280_comp_pres_32bit(ucomp_data.uncomp_press, &bmp);
                presI = presI*0.00750063755419211;//1 паскаль [Па] = 0,00750063755419211 миллиметр ртутного столба (0°C) [мм рт.ст.]

                /* Получение 32-битной скомпенсированной температуры */
                tempI = bmp280_comp_temp_32bit(ucomp_data.uncomp_temp, &bmp);
                tempI = tempI/10;
                /*Индикация параметров*/
                Cursor (1, 10);
                BinDec(tempI, 2, 0, 3, 1, 1, White, Black);
                Symbol(0xBF, 1, 0, 1, 1, Red, Black);
//                Symbol('C', 1, 0, 1, 1, White, Black);
                Cursor (34, 10);
                BinDec(presI, 0, 0, 3, 1, 1, Green, Black);
                StringCur("mm", 1, 0, 1, 1, Yellow, Black);
//              bmp.delay_ms(1000); /* Время сна между измерениями = BMP280_ODR_1000_MS */
//              delay_ms(2000);
            }

Дополнительно необходимо подключить в прерывания таймера 2 управление задержкой для функции delay_ms(uint32_t period_ms).

void __ISR(_TIMER_2_VECTOR, ipl1AUTO) IntHandlerDrvTmrInstance0(void)
{
    Drive_hab75();                  // видео драйвер
    
    if(timer_tact1>0)timer_tact1--; // таймер скорости бегущей реки
    if(timer_tact2>0)timer_tact2--; //
    
    if(time_delayi>0) time_delayi--;// фунция задержки для bmp280
    
    PLIB_INT_SourceFlagClear(INT_ID_0,INT_SOURCE_TIMER_2);
}

С компилируем проект и загрузим в микроконтроллер.


В результате получим следующий результат бегущая строка и индикация температуры и атмосферного давления.


Значок

BMP280 - учебный проект - схема 390.60 KB 620 downloads

Схема проекта в pdf. ...

Пароль на архив Catcatcat.

Значок

BMP280 - учебный проект - проект 465.53 KB 3 downloads

Проект MPLABX, библиотека графики, драйвер для светодиодной...
Login Required Message:

Это может быть интересно


  • LM317 и светодиодыLM317 и светодиоды
    Views: 8206 LM317 и светодиоды статья с переработанная с сайта http://invent-systems.narod.ru/LM317.htm Долговечность светодиодов определяется качеством изготовления кристалла, а для белых светодиодов еще и качеством люминофора. В процессе эксплуатации скорость деградации кристалла …
  • CAN – Controller Area NetworkCAN – Controller Area Network
    Views: 1264 Controller Area Network (CAN) первоначально был создан немецким поставщиком автомобильных систем Робертом Бош в середины 1980-х для автомобильной промышленности как метод для обеспечения возможности надежной последовательной связи. Целью было сделать автомобили более надежными, …
  • Счетчики посетителейСчетчики посетителей
    Views: 1310 Вас сосчитали!? или счетчики посетителей.   Для чего нужны счетчики посетителей? Какие они бывают? ТОРГОВЛЯ. Подсчитайте, сколько ваш магазин посещает человек за день. Кок много человек приходит утром, какое …
  • Moving average – скользящее среднееMoving average – скользящее среднее
    Views: 2458 Скользящая средняя, скользящее среднее (англ. moving average, MA) — общее название для семейства функций, значения которых в каждой точке определения равны среднему значению исходной функции за предыдущий период. Скользящие средние обычно используются с данными временных рядов для сглаживания …
  • TM1650 драйвер LED семисегментного индикатораTM1650 драйвер LED семисегментного индикатора
    Views: 18503 UPDATES 2025/10/10 Китайский производитель Shenzhen Titan Micro Electronics Co., Ltd.  Выпускает широкую линейку драйверов управления светодиодными дисплеями, которые позволяют разгрузить микроконтроллер для основной работы, главная особенность этих драйверов …
  • My libraries for Altium DesignerMy libraries for Altium Designer
    Views: 4478 Attention, this version of the database is outdated today. See updates in articles https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure  and https://catcatcat.d-lan.dp.ua/altium-designer-my-setup-system-and-project-structure-v23-2/    My libraries for Altium designer  (Updated V – 29/05/2022) (c) 2021 …
  • MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)MTouch® Модуль Емкостной Библиотеки для MPLAB®X Code Configurator (MCC)
    Views: 1442 Введение MTouch ® Модуль Емкостной Библиотеки для MPLAB ® X Code Configurator (MCC) позволяет быстро и легко генерировать решение кода на  Cи для емкостной сенсорной кнопки, датчика приближения и слайдера.
  • NeoPixel LED and PIC24NeoPixel LED and PIC24
    Views: 781 Популярность однопроводной шины для управления светодиода типа WS2812 не ослабевает, а новые типы светодиодов в корпусах 3,5*3,5мм, 2,0*2,0мм становяться все больше привлекательными. Построение дисплеев для анимации требуют все …
  • MPLAB® Harmony – или как это просто! Часть 4.MPLAB® Harmony – или как это просто! Часть 4.
    Views: 2442 Часть четвертая – это может показаться немного сложно. Структура проекта. Для облегчения конфигурирования проекты MPLAB Harmony обычно структурированы таким образом, чтобы изолировать код, необходимый для настройки «системы», от …
  • JDY-62A Audio bluetooth moduleJDY-62A Audio bluetooth module
    Views: 1924 Простой модуль для простого аудио блютуса. Встроенные подсказки на английском языке. Модуль включён, режим муте – после подачи питания. Контроль разряда батареи предупреждение что батарея разряжена и необходима …



 

Поделись этим!

Catcatcat

catcatcat

Development of embedded systems based on Microchip microcontrollers.

Продолжайте читать

НазадДалее

Комментарии

Добавить комментарий

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.