6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
1

BME280 сенсор давления температуры и влажности

09.02.2019, 19:21. Показов 2528. Ответов 10
Метки нет (Все метки)

Всем привет.
Имею такую проблему с BME280
Все делаю по даташит.
Температуру измеряет, а давление меряет некорректно. Если подуть на сенсор, то он отреагирует. Но все равно должно быть примерно 730 а он мне показывает 975.
Кто знает в чем может быть проблема?

функция которая все высчитывает...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
uint32_t calulete_preasure(uint32_t adc_P)
{      
        int64_t var1, var2, p=0;
        if (adc_P == 0x800000) // value in case pressure measurement was disabled
        {
                while(1){}
        }
        
        var1 = ((int64_t)t_fine) - 128000;
        var2 = var1 * var1 * (int64_t)dig_P6;
        var2 = var2 + ((var1*(int64_t)dig_P5)<<17);
        var2 = var2 + (((int64_t)dig_P4)<<35);
        var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12);
        var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33;
        if (var1 == 0)
        {
                return 0; // avoid exception caused by division by zero
        }
        p = 1048576-adc_P;
        p = (((p<<31)-var2)*3125)/var1;
        var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;
        var2 = (((int64_t)dig_P8) * p) >> 19;
        p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4);
        float PREASURE=p/256;
        PREASURE=PREASURE/100;
        
        sprintf(str_BME280,"PREASURE: %f________\r\n", PREASURE);      // convert   in  str 
        size=sizeof(str_BME280);
        HAL_UART_Transmit(&huart1 , (uint8_t *)str_BME280, size, 0xFFF);    
        
        return (uint32_t)PREASURE;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2019, 19:21
Ответы с готовыми решениями:

Прибор для измерения Давления Влажности. Дата и время.
Прибор для измерения Давления Влажности. Дата и время. Для времени и даты было куплено DS1307N...

Работа с датчиком давления BME280. Обсуждение, обмен опытом
Доброго времени суток заглянувшему сюда. Сказать, что датчик &quot;сложный&quot;.. Думаю нет. Скорее...

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

atmega + сенсор давления масла
Добрый день)! В общем купил я датчик давления масла ДД-6М, который ставится на трактора, он до 6...

10
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
09.02.2019, 19:28  [ТС] 2
Скрин с компорта
Миниатюры
BME280 сенсор давления температуры и влажности  
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
09.02.2019, 19:38  [ТС] 3
Попробовал еще один вариант который указан в конце даташита.
Даташит - https://cdn-shop.adafruit.com/... 001-10.pdf на 49 странице.
Данные получаются такие же как с первыми расчетами.
Думаю я где-то ошибся перед функцией вычисления температуры.


C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
uint32_t calulete_preasure(uint32_t adc_P)
{      
//////////////////////////////////////////////////////////////////////////////
//      int64_t var1, var2, p=0;
//      if (adc_P == 0x800000) // value in case pressure measurement was disabled
//      {
//              while(1){}
//      }
//      
//      var1 = ((int64_t)t_fine) - 128000;
//      var2 = var1 * var1 * (int64_t)dig_P6;
//      var2 = var2 + ((var1*(int64_t)dig_P5)<<17);
//      var2 = var2 + (((int64_t)dig_P4)<<35);
//      var1 = ((var1 * var1 * (int64_t)dig_P3)>>8) + ((var1 * (int64_t)dig_P2)<<12);
//      var1 = (((((int64_t)1)<<47)+var1))*((int64_t)dig_P1)>>33;
//      if (var1 == 0)
//      {
//              return 0; // avoid exception caused by division by zero
//      }
//      p = 1048576-adc_P;
//      p = (((p<<31)-var2)*3125)/var1;
//      var1 = (((int64_t)dig_P9) * (p>>13) * (p>>13)) >> 25;
//      var2 = (((int64_t)dig_P8) * p) >> 19;
//      p = ((p + var1 + var2) >> 8) + (((int64_t)dig_P7)<<4);
//      float PREASURE=p/256;
//      PREASURE=PREASURE/100;
//      
//      sprintf(str_BME280,"PREASURE: %f________\r\n", PREASURE);      // convert   in  str 
//      size=sizeof(str_BME280);
//      HAL_UART_Transmit(&huart1 , (uint8_t *)str_BME280, size, 0xFFF);    
//      
//      return (uint32_t)PREASURE;
//////////////////////////////////////////////////////////////////////////////
 
        double var1, var2, p;
        var1 = ((double)t_fine/2.0)-64000.0;
        var2 = var1 * var1 * ((double)dig_P6) / 32768.0;
        var2 = var2 + var1 * ((double)dig_P5) * 2.0;
        var2 = (var2/4.0)+(((double)dig_P4) * 65536.0);
        var1 = (((double)dig_P3) * var1 * var1 / 524288.0 + ((double)dig_P2) * var1) / 524288.0;
        var1 = (1.0 + var1 / 32768.0)*((double)dig_P1);
        if (var1 == 0.0)
        {
        return 0; // avoid exception caused by division by zero
        }
        p = 1048576.0-(double)adc_P;
        p = (p-(var2 / 4096.0)) * 6250.0 / var1;
        var1 = ((double)dig_P9) * p * p / 2147483648.0;
        var2 = p * ((double)dig_P8) / 32768.0;
        p = p + (var1 + var2 + ((double)dig_P7)) / 16.0;
        
        sprintf(str_BME280,"PREASURE: %f________\r\n", p);      // convert   in  str 
        size=sizeof(str_BME280);
        HAL_UART_Transmit(&huart1 , (uint8_t *)str_BME280, size, 0xFFF);    
        
        return p;
}
Миниатюры
BME280 сенсор давления температуры и влажности  
0
3101 / 1600 / 196
Регистрация: 28.10.2011
Сообщений: 5,896
Записей в блоге: 6
09.02.2019, 20:06 4
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
должно быть примерно 730 а он мне показывает 975
730 мм рт. ст. это примерно 975 гПа.
1
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
09.02.2019, 20:08  [ТС] 5
Проблема решена. Нужно было только перевести hPa в mmHg.)
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
09.02.2019, 22:06  [ТС] 6
и появилась новая проблема. Проблема с влажностью. Ни один из этих вариантов не работает.

показывает или 0 или 100..(

так я считываю калибровочные регистры...
C
1
2
3
4
5
6
7
STATUS_BME280=HAL_I2C_Mem_Read(&hi2c1, BME280_ID<<1,(uint16_t)BME280_CALIB_26, (uint16_t) 1, buf_calibration_data, (uint16_t)10, 1000);
        
        dig_H2=(signed short)buf_calibration_data[1]<<8|(signed short)buf_calibration_data[0];
        dig_H3=(unsigned short)buf_calibration_data[2];
        dig_H4=(signed short)buf_calibration_data[4]<<3|(signed short)buf_calibration_data[5];
        dig_H5=(signed short)buf_calibration_data[6]<<11|(signed short)buf_calibration_data[7];
        dig_H6=(signed short)buf_calibration_data[8];

так вычисляю...
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
        double humidity;
        double humidity_min = 0.0;
        double humidity_max = 100.0;
        double var1;
        double var2;
        double var3;
        double var4;
        double var5;
        double var6;
 
        var1 = ((double)t_fine) - 76800.0;
        var2 = (((double)dig_H4) * 64.0 + (((double)dig_H5) / 16384.0) * var1);
        var3 = humidity - var2;
        var4 = ((double)dig_H2) / 65536.0;
        var5 = (1.0 + (((double)dig_H3) / 67108864.0) * var1);
        var6 = 1.0 + (((double)dig_H6) / 67108864.0) * var1 * var5;
        var6 = var3 * var4 * (var5 * var6);
        humidity = var6 * (1.0 - ((double)dig_H1) * var6 / 524288.0);
 
        if (humidity > humidity_max)
            humidity = humidity_max;
        else if (humidity < humidity_min)
            humidity = humidity_min;
 
      sprintf(str_BME280,"HUMIDITY: %d________\r\n", (int)humidity);      // convert   in  str 
        size=sizeof(str_BME280);
        HAL_UART_Transmit(&huart1 , (uint8_t *)str_BME280, size, 0xFFF);    
    
    return humidity;
получаю 0. Хотя входные данные с АЦП сенсора есть и они меняются.
Миниатюры
BME280 сенсор давления температуры и влажности  
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
09.02.2019, 22:09  [ТС] 7
humidity выходит за допустимые рамки ..
Миниатюры
BME280 сенсор давления температуры и влажности  
0
0 / 0 / 0
Регистрация: 24.11.2012
Сообщений: 63
10.02.2019, 11:02 8
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
double humidity_min = 0.0;
double humidity_max = 100.0;
Ну судя по всему у вас задан диапазон значений от 0 до 100. А расчетное значение получается -48.
И вот этот участок кода приравнивает его к нулю:
Цитата Сообщение от OlegD_STM32 Посмотреть сообщение
if (humidity > humidity_max) humidity = humidity_max;
else if (humidity < humidity_min) humidity = humidity_min;
Наверное надо диапазон расширить.
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
10.02.2019, 13:28  [ТС] 9
Что-то не так, потому что влажность не может быть отрицательной.

попробую найти как выглядят входные данные в функцию, и сравнить со своими. Возможным входные данные некорректны.
Миниатюры
BME280 сенсор давления температуры и влажности  
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
10.02.2019, 14:10  [ТС] 10
так считываю даниє с adc_H...
C
1
uint32_t adc_H=(uint32_t)buf_data_from_BME280[6]<<8|(uint32_t)buf_data_from_BME280[7];
так считываю калибровочные коэффициенты...
C
1
2
3
4
5
6
7
8
9
                dig_H1=(unsigned short)buf_calibration_data[24];
        
        STATUS_BME280=HAL_I2C_Mem_Read(&hi2c1, BME280_ID<<1,(uint16_t)BME280_CALIB_26, (uint16_t) 1, buf_calibration_data, (uint16_t)10, 1000);
        
        dig_H2=(signed short)buf_calibration_data[1]<<8|(signed short)buf_calibration_data[0];
        dig_H3=(unsigned short)buf_calibration_data[2];
        dig_H4=(signed short)buf_calibration_data[4]<<3|(signed short)buf_calibration_data[5];
        dig_H5=(signed short)buf_calibration_data[6]<<11|(signed short)buf_calibration_data[7];
        dig_H6=(signed short)buf_calibration_data[8];
мне кажется что данные с adc_H слишком малиє. Как считаєте?
Правельно ли я считую калибровочниє коефициенти?
Миниатюры
BME280 сенсор давления температуры и влажности   BME280 сенсор давления температуры и влажности  
0
6 / 6 / 0
Регистрация: 26.11.2018
Сообщений: 262
10.02.2019, 17:56  [ТС] 11
Кто-то может сбросить данные adc_H? И которая влажность при этом значении adc_H.?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.02.2019, 17:56
Помогаю со студенческими работами здесь

Orange pi считывание датчиков температуры, влажности
Orange pi считывание датчиков температуры, влажности и так далее Есть orange pi можно ли...

PIC16F690. Чтение датчика температуры и влажности DHT-11
pic16f690 не читает DHT11 проблема следующего характера... есть библиотека DHT11 нормально...

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

Чтение датчика температуры и влажности DHT-11 (ATMega16)
Есть почти готовая программа на мкк атмега16, с подключенным к ней датчиком DHT11, единственное что...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru