Администрация форума не несёт ответственности за достоверность информации и оставляет за собой право редактировать или в особых случаях даже удалять посты без предупреждения. Спасибо за понимание.

Программирование ATMEL в BASCOM.

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Осваиваем датчик BME280


Осваиваем датчик BME280

Сообщений 1 страница 19 из 19

1

Итак, приобретён BME280. Необходимо приручить его в васике. Опрос выполнен. Формулы прописаны, но вот результат пока удручает. Видимо с типом переменных это связано, но понять пока не могу.
Код не причёсан (не оптимизирован), но это вопрос последний.
Переменные описаны так.

Код:
'**************************BME280***************************************
Dim T1 As Word
Dim T1_low As Byte At T1 Overlay
Dim T1_high As Byte At T1 + 1 Overlay
Dim T2 As Integer
Dim T2_low As Byte At T2 Overlay
Dim T2_high As Byte At T2 + 1 Overlay
Dim T3 As Integer
Dim T3_low As Byte At T3 Overlay
Dim T3_high As Byte At T3 + 1 Overlay
Dim P1 As Word
Dim P1_low As Byte At P1 Overlay
Dim P1_high As Byte At P1 + 1 Overlay
Dim P2 As Integer
Dim P2_low As Byte At P2 Overlay
Dim P2_high As Byte At P2 + 1 Overlay
Dim P3 As Integer
Dim P3_low As Byte At P3 Overlay
Dim P3_high As Byte At P3 + 1 Overlay
Dim P4 As Integer
Dim P4_low As Byte At P4 Overlay
Dim P4_high As Byte At P4 + 1 Overlay
Dim P5 As Integer
Dim P5_low As Byte At P5 Overlay
Dim P5_high As Byte At P5 + 1 Overlay
Dim P6 As Integer
Dim P6_low As Byte At P6 Overlay
Dim P6_high As Byte At P6 + 1 Overlay
Dim P7 As Integer
Dim P7_low As Byte At P7 Overlay
Dim P7_high As Byte At P7 + 1 Overlay
Dim P8 As Integer
Dim P8_low As Byte At P8 Overlay
Dim P8_high As Byte At P8 + 1 Overlay
Dim P9 As Integer
Dim P9_low As Byte At P9 Overlay
Dim P9_high As Byte At P9 + 1 Overlay
Dim H1 As Byte
Dim H2 As Integer
Dim H2_low As Byte At H2 Overlay
Dim H2_high As Byte At H2 + 1 Overlay
Dim H3 As Byte
Dim H4 As Integer
Dim H4_low As Byte At H4 Overlay
Dim H4_high As Byte At H4 + 1 Overlay
Dim H5 As Integer
Dim H5_low As Byte At H5 Overlay
Dim H5_high As Byte At H5 + 1 Overlay
Dim H6 As Byte                                              '

Dim Press As Long
Dim Press_xlow As Byte At Press Overlay
Dim Press_low As Byte At Press + 1 Overlay
Dim Press_high As Byte At Press + 2 Overlay

Dim Temp As Long
Dim Temp_xlow As Byte At Temp Overlay
Dim Temp_low As Byte At Temp + 1 Overlay
Dim Temp_high As Byte At Temp + 2 Overlay

Dim Hum As Long
Dim Hum_low As Byte At Hum Overlay
Dim Hum_high As Byte At Hum + 1 Overlay

Dim P_single As Single
Dim T_single As Single
Dim H_single As Single

Dim Var1 As Single
Dim Var2 As Single
Dim T_fine As Single
Dim Temp_bme1 As Single
Dim Temp_bme2 As Single

Результаты в переменных:
P_single - давление
T_single - температура
H_single - влажность
Далее идут подпрограммы конфигурации, калибровочные данные, сырые данные и сам расчёт:

Код:
Getbme280:
   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HF7                                            ' À
   I2crepstart
   I2cwbyte &HED
   I2crbyte Press_high , Ack                                ' 
   I2crbyte Press_low , Ack                                 '
   I2crbyte Press_xlow , Ack
   I2crbyte Temp_high , Ack                                 ' 
   I2crbyte Temp_low , Ack                                  '
   I2crbyte Temp_xlow , Ack
   I2crbyte Hum_high , Ack                                  ' 
   I2crbyte Hum_low , Nack
   I2cstop
'Температура
   Var1 = T1 / 1024
   Var1 = Var1 * T2
   Temp_bme1 = Temp / 16384
   Print Temp_bme1
   Var1 = Temp_bme1 - Var1
   Temp_bme1 = T1 / 8192
   Temp_bme1 = Temp_bme1 * T3
   Temp_bme2 = Temp / 131072
   Temp_bme2 = Temp_bme2 - temp_bme1
   Temp_bme1 = T1 / 8192
   Temp_bme1 = Temp_bme1 * Temp_bme2
   Temp_bme2 = Temp / 131072
   Var2 = Temp_bme2 - Temp_bme1
   T_fine = Var1 + Var2
   T_single = T_fine / 5120
'Давление P
   Var1 = T_fine / 2
   Var1 = Var1 - 64000
   Var2 = P6 / 32768
   Temp_bme1 = Var1 * Var1
   Var2 = Var2 * Temp_bme1
   Temp_bme1 = P5 * 2
   Temp_bme1 = Temp_bme1 * Var1
   Var2 = Var2 + Temp_bme1
   Temp_bme1 = P4 * 65536
   Temp_bme2 = Var2 / 4
   Var2 = Temp_bme2 + Temp_bme1
   Temp_bme1 = Var1 * Var1
   Temp_bme1 = P3 * Temp_bme1
   Temp_bme1 = Temp_bme1 / 524288
   Temp_bme2 = P2 * Var1
   Temp_bme2 = Temp_bme2 / 524288
   Var1 = Temp_bme1 + Temp_bme2
   Var1 = Var1 / 32768
   Var1 = Var1 * P1
   Var1 = Var1 + 1
   If Var1 = 0 Then Goto Error
   P_single = 1048576 - press
   Temp_bme1 = Var2 / 4096
   Temp_bme2 = P_single - Temp_bme1
   P_single = Temp_bme2 * 6250
   P_single = P_single / Var1
   Var1 = P9 * P_single
   Var1 = Var1 * P_single
   Var1 = Var1 / 2147483648
   Var2 = P_single * P8
   Var2 = Var2 / 32768
   Temp_bme1 = Var1 + Var2
   Temp_bme1 = Temp_bme1 + P7
   Temp_bme1 = Temp_bme1 / 16
   P_single = P_single + Temp_bme1
   P_single = P_single * 0.0075006
Error:
'Влажность H
   H_single = T_fine - 76800
   Temp_bme1 = H3 / 67108864
   Temp_bme1 = Temp_bme1 * H_single
   Temp_bme1 = 1 + Temp_bme1
   Temp_bme2 = H6 / 67108864
   Temp_bme2 = Temp_bme2 * H_single
   Temp_bme2 = Temp_bme2 * Temp_bme1
   Temp_bme2 = Temp_bme2 + 1
   Temp_bme1 = H2 / 65536
   Temp_bme1 = Temp_bme1 * Temp_bme2
   Temp_bme2 = H5 / 16384
   Temp_bme2 = Temp_bme2 * H_single
   Temp_bme2 = Temp_bme2 * Temp_bme1
   Temp_bme1 = H4 * 64
   Temp_bme1 = Temp_bme1 + Temp_bme2
   H_single = Hum - Temp_bme1
   Temp_bme1 = H1 * H_single
   Temp_bme1 = Temp_bme1 / 524288
   Temp_bme1 = 1 - Temp_bme1
   H_single = H_single * Temp_bme1
   If H_single > 100 Then H_single = 100
   If H_single < 0 Then H_single = 0
Return

Ctrl_hum:
   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HF2                                            ' 
   I2cwbyte &H01                                            'osrs_h 100 oversampling *1
   I2cstop
Return

Ctrl_meas:
   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HF4                                            'osrs_t  100 oversampling *1
   I2cwbyte &H27                                            'osrs_p  100 oversampling *1
   I2cstop                                                  'Mode Normal 11
Return                                                      '  10010011

Configbme:
   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HF5                                            't_sb 000 0.5ms
   I2cwbyte &H00                                            'filter settings off 000
   I2cstop                                                  'bit 0=0 SPI disable
Return                                                      '00001100




Bme280calibratedata:
   I2cstart
   I2cwbyte &HEC
   I2cwbyte &H88                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte T1_low , Ack                                    '  &H88
   I2crbyte T1_high , Ack                                   ' &H89
   I2crbyte T2_low , Ack
   I2crbyte T2_high , Ack
   I2crbyte T3_low , Ack
   I2crbyte T3_high , Ack
   I2crbyte P1_low , Ack
   I2crbyte P1_high , Ack
   I2crbyte P2_low , Ack
   I2crbyte P2_high , Ack
   I2crbyte P3_low , Ack
   I2crbyte P3_high , Ack
   I2crbyte P4_low , Ack
   I2crbyte P4_high , Ack
   I2crbyte P5_low , Ack
   I2crbyte P5_high , Ack
   I2crbyte P3_low , Ack
   I2crbyte P3_high , Ack
   I2crbyte P4_low , Ack
   I2crbyte P4_high , Ack
   I2crbyte P5_low , Ack
   I2crbyte P5_high , Ack
   I2crbyte P6_low , Ack
   I2crbyte P6_high , Ack
   I2crbyte P7_low , Ack
   I2crbyte P7_high , Ack
   I2crbyte P8_low , Ack
   I2crbyte P8_high , Ack
   I2crbyte P9_low , Ack
   I2crbyte P9_high , Nack
   I2cstop

   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HA1                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte H1 , Nack
   I2cstop

   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HE1                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte H2_low , Ack                                    '
   I2crbyte H2_high , Nack                                  '
   I2cstop

   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HE3                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte H3 , Nack
   I2cstop

   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HE4                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte H4_high , Ack                                   '
   I2crbyte H4_low , Nack                                   '
   I2cstop

   I2cstart
   I2cwbyte &HEC
   I2cwbyte &HE5                                            ' 
   I2crepstart
   I2cwbyte &HED
   I2crbyte H5_low , Ack                                    '
   I2crbyte H5_high , Ack                                   '
   I2crbyte H6 , Nack
   I2cstop
Return

На данный момент калибровочные данные считываются (подпрограмма Bme280calibratedata:). Сырые данные и сам расчёт (подпрограмма Getbme280:).
Всё собрано на макете, поэтому Ваши предложения смогу быстро проверить.
Даташит тутСсылка
У кого какие мысли.

Отредактировано Tankor (2015-12-13 19:09:06)

+1

2

Mrshilov написал(а):

Исходник.
Оверсемплинг и фильтр выставлены на максимум, время "отдыха" - 250мс. Сотые доли с такими параметрами стоят как вкопанные при опросе 1 раз в сек.

Ух-ты, вот это подарок. Огромная благодарность.  :flag:

0

3

Уважаемый Mrshilov
Опробовал. Всё супер. Макет чешит как надо.
http://s6.uploads.ru/t/ikHN3.jpg

Отредактировано Tankor (2015-12-13 23:05:23)

0

4

Mrshilov написал(а):

Как-то 743мм маловато. Живете высоко?

г.Нижнекамск, Татарстан

0

5

Всем Доброго Здоровья!

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

0

6

Нужен код, чтобы их считать.

0

7

max написал(а):

Нужен код, чтобы их считать.

Нет, нужны константы с разных датчиков.

0

8

sasha_1973 написал(а):

Нет, нужны константы с разных датчиков.

Я имел ввиду, что мне нужен код, чтобы их считать. Датчик имеется в наличии.

0

9

max написал(а):

Я имел ввиду, что мне нужен код, чтобы их считать

Попробуйте этот

$map       ' Получаем карту распределения памяти
  $regfile = "m328pdef.dat"       ' Используемый контроллер - http://www.atmel.com/images/Atmel-8271- … mplete.pdf
  $crystal = 1000000       ' 1 МГц
  $framesize = 32       'размер области используемой и необходимой для преобразований
  $hwstack = 40       ' Размер аппаратного стека
  $swstack = 16       ' Размер программного стека

  $baud = 4800
  Ucsr0a.1 = 1

  Config Sda = Portc.4       ' I2C Data
  Config Scl = Portc.5       ' I2C Clock
  I2cinit

  Const Slave = &HEC       ' I2C Address (5pin=0)

  Dim Count As Byte
  Dim Temp(24) As Byte

  I2cstart
  I2cwbyte Slave
  I2cwbyte &H88

  For Count = 1 To 23
      I2crbyte Temp(count) , Ack
  Next Count

  I2crbyte Temp(24) , Nack
  I2cstop

  For Count = 1 To 23

      Print "Temp" ; Count ; " = " ; Temp(count)

  Next Count

End

Отредактировано sasha_1973 (2016-01-16 13:37:32)

0

10

Хорошо.

0

11

Mrshilov написал(а):

Тогда уж так

Хорошо. Сейчас макетку соберу и попробую. Позже отпишусь.

0

12

http://s017.radikal.ru/i416/1601/5c/e315666a25c7t.jpg

Отредактировано max (2016-01-16 16:08:39)

0

13

У меня вот такое выдаёт в железе, или не это нужно?
T1=28028
T2=26193
T3=50
P1=37652
P2=-10905
P3=3024
P4=6028
P5=43
P6=-7
P7=9900
P8=-10230
P9=4285
H1=75
H2=355
H3=0
H4=337
H5=14
H6=207

Отредактировано Tankor (2016-01-16 18:24:17)

+1

14

Tankor написал(а):

или не это нужно

Именно это, СПАСИБО!

0

15

BMP280 кто нибудь приручал в бэйсике. Поделитесь если у кого исходник есть.

0

16

Ага, Mrshilov "приручал".
Вы походу тему не читали.

-1

17

Mrshilov написал(а) Возьмите исходник из поста 2 и выкиньте все связанное с влажностью. Должно работать.

Спасибо я понял.

0

18

Исходник моего Логгера температуры заточен под Bascom_AVR_1.11.9.8. и под BMP085. Я переписал данные под ВМР280 используя исходник из поста 2, выкинул все связанное с влажностью, только Bascom_AVR_1.11.9.8 не понимает новые коды а более новый компилятор не хоче компилять старую прогу. Может у кого есть библиотека для ВМЕ280 под Bascom_AVR_1.11.9.8

0

19

Без вашего кода вам никто не поможет.

0


Вы здесь » Программирование ATMEL в BASCOM. » Вопросы - ответы » Осваиваем датчик BME280