Мазмұны:

BMP280 және BME280 кітапханасы: 7 қадам
BMP280 және BME280 кітапханасы: 7 қадам
Anonim
BMP280 және BME280 кітапханасы
BMP280 және BME280 кітапханасы
BMP280 және BME280 кітапханасы
BMP280 және BME280 кітапханасы
BMP280 және BME280 кітапханасы
BMP280 және BME280 кітапханасы

Кіріспе

Мен бұл кітапхананы жазуды мақсат етпедім. Бұл BMP280 қолданатын мен бастаған жобаның жанама әсері ретінде «болды». Бұл жоба әлі аяқталған жоқ, бірақ менің ойымша, кітапхана басқалармен бөлісуге дайын. Кейіннен мен BMP280 қысымы мен температуралық қабілеттілігіне ылғалдылықты қосатын BME280 қолдану қажет болды. BME280 BMP280 -мен «артқа үйлесімді», яғни BME280 -ден қысым мен температураны оқу үшін қажет барлық регистрлер мен қадамдар BMP280 үшін қолданылатындармен бірдей. Ылғалдылықты оқуға қажет қосымша регистрлер мен қадамдар бар, тек BME280 үшін қолданылады. Бұл сұрақ туындайды, екеуіне де бір кітапхана немесе екі бөлек кітапхана. Құрылғының екі түріне арналған жабдық толығымен ауыстырылады. Тіпті сатылатын көптеген модульдер (мысалы, Ebay мен AliExpress -те) BME/P280 деп белгіленген. Бұл қай түр екенін білу үшін сенсордың өзіндегі (кіші) жазуды қарау немесе құрылғы идентификаторының байтын тексеру қажет. Мен жеке кітапханаға баруды шештім. Жақсы жұмыс істеген сияқты.

Кері байланыс, әсіресе жақсарту бойынша кез келген ұсыныстар бағаланады.

Кітапхананың мүмкіндіктері мен мүмкіндіктері

Кітапхана-бұл барлық ұсақ бөлшектермен жұмыс істеудің қажеті жоқ, бағдарламашының құрылғының мүмкіндіктерін қолдануы үшін қолданбалы бағдарламалау интерфейсін (API) қамтамасыз ететін бағдарламалық жасақтама. Қажет болса, API қарапайым бастаушыға құрылғы мүмкіндіктерін толық пайдалануды қамтамасыз етуді бастау үшін оңай болуы керек. Кітапхана құрылғы өндірушісінің кез келген нақты нұсқауларын, сондай -ақ жалпы бағдарламалық қамтамасыз етудің жақсы тәжірибесін ұстануы керек. Мен осының барлығына қол жеткізуге тырыстым. BMP280 -тен бастаған кезде мен оған 3 түрлі кітапхана таптым: Adafruit_BMP280; Seeed_BMP280; және бірі құрылғы өндірушісінен BMP280 деп аталады. Adafruit де, Seeed де жақсы мүмкіндіктер бермеді, бірақ олар жақсы жұмыс істеді және негізгі қосымшаларда қолдануға оңай болды. Мен құрылғы өндірушісі (Bosch Sensortec) шығаратынды қалай қолдану керектігін түсінбедім. Бұл олардың жетіспеушілігінен гөрі менің кемшілігім болуы мүмкін. Кітапхана басқа екеуіне қарағанда әлдеқайда күрделі болды, мен ешқандай нұсқаулар мен пайдалану мысалдарын таба алмадым (кейінірек мысалдар «bmp280_support.c» файлында екенін білдім, бірақ бұл маған әсіресе пайдалы болмады).

Осы факторлардың нәтижесінде мен BMP280 үшін жеке кітапханамды жазуды шештім.

BME280 кітапханасының жағдайын зерттей отырып, мен Adafruit_BME280, Seed_BME280 бөлек кітапханаларын және Embedded Adventures жазған BME280_MOD-1022 кітапханаларын таптым. Олардың ешқайсысы BME280 қолдана алатын кітапханада BMP280 функцияларын біріктірмеді. Олардың ешқайсысы құрылғы мен оның басқарушы микропроцессоры ұйықтап жатқанда, бірнеше бит деректерді сақтау мүмкіндігін анық қолдамады (бұл мүмкіндік деректер кестесінде көрінеді және мен жазған және сипатталған кітапханада қолдау көрсетеді).

Біріктірілген кітапхана BME280 -дің барлық мүмкіндіктеріне қолдау көрсетуі керек, бірақ BMP280 -мен бірге қолданылғанда ол пайдаланылмаған функцияларға қосымша шығын келтірмеуі керек. Біріктірілген кітапхананың артықшылықтарына басқарылатын кітапханалық файлдар аз, бір жобада әр түрлі құрылғыларды оңай араластыру және техникалық қызмет көрсету немесе жаңартуға арналған оңайлатылған өзгерістер кіреді, оларды екі емес, бір жерде жасау керек. Мұның бәрі шамалы, тіпті шамалы, бірақ …

Құрылғының мүмкіндіктері

BMP280 және BME280-бұл 5 мм шаршы және биіктігі 1 мм болатын жер үсті қондырғылары. 8 интерфейс алаңы бар, оның ішінде 2 бөлек қуат кіріс алаңы және екі жер асты алаңы. Олар eBay -де 4 немесе 6 түйреуіш шығарылған модуль ретінде қол жетімді. 4 істікшелі модульде бекітілген I2C адресі бар және оны SPI протоколын қолдану үшін конфигурациялау мүмкін емес.

6 істікшелі модуль немесе жалаңаш құрылғыны I2C немесе SPI протоколдарымен пайдалануға болады. I2C режимінде SDO түйреуішін жерге қосу (базалық адрес = 0x76 үшін) немесе Vdd (базалық адрес үшін +1 = 0x77) арқылы екі түрлі адрес болуы мүмкін. SPI режимінде әдеттегідей 1 сағат, 2 деректер (әр бағыт үшін бір) және құрылғы таңдау түйреуіші (CS) бар.

Мен жазған және сипаттаған кітапхана тек I2C қолдайды. Adafruit_BMP280 және BME_MOD-1022 кітапханаларында i2C және SPI қолдау бар.

Кітапхананы мына жерден жүктеуге болады:

github.com/farmerkeith/BMP280-library

1 -қадам: Жабдықты орнату

Жабдықты орнату
Жабдықты орнату

Кітапхана пайдалы болмас бұрын BMP280 микроконтроллерін қосу қажет (немесе егер қаласаңыз, олардың екеуіне).

Мен WeMos D1 mini pro қолдандым, сондықтан мен оның байланысын көрсетемін. Басқа микроконтроллерлер ұқсас болады, тек SDA мен SCL түйреуіштерін дұрыс қосу керек.

WeMos D1 mini pro жағдайында қосылымдар:

WeMos түйреуіші BMP280 істікшесі Ескертулер

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Номиналды 3.3V GND GND мекенжайды басқару SDO Ground немесе Vdd I2C CSB Vdd таңдаңыз (GND SPI таңдайды)

Кейбір MP280 модульдеріндегі SDO түйреуішінің SDD, ал Vdd түйреуішінің VCC деп белгіленетінін ескеріңіз. Ескерту: SDA және SCL желілерінде сызық пен Вин түйреуіші арасында тартылатын резисторлар болуы керек. Әдетте 4.7K мәні жақсы болуы керек. Кейбір BMP280 және BME280 модульдерінде модульге 10K тартылатын резисторлар орнатылған (бұл жақсы тәжірибе емес, себебі I2C шинасына бірнеше құрылғыларды қосу оны шамадан тыс жүктеуі мүмкін). Алайда, әрқайсысында 10K резисторы бар 2 BME/P280 модулін қолдану тәжірибеде қиындық тудырмауы керек, себебі бір автобуста басқа тартылатын резисторы бар басқа құрылғылар тым көп емес.

Жабдық қосылғаннан кейін I2CScan_ID нобайын іске қосу арқылы құрылғының BMP280 немесе BME280 екенін оңай тексеруге болады:

Сізде BMP280 немесе BME280 бар -жоғын құрылғының өзіне қарап тексеруге болады. Мен мұны істеу үшін сандық микроскопты қолдануды қажет деп таптым, бірақ егер сіздің көру қабілетіңіз өте жақсы болса, сіз оны ешқандай көмексіз жасай аласыз. Құрылғының корпусында екі басып шығару жолы бар. Кілт - бұл екінші жолдағы бірінші әріп, ол BMP280 құрылғыларында «К», ал BME280 құрылғыларында - «U».

2 -қадам: Кітапханамен қамтамасыз етілген API

Кітапханамен қамтамасыз етілген API
Кітапханамен қамтамасыз етілген API
Кітапханамен қамтамасыз етілген API
Кітапханамен қамтамасыз етілген API

Кітапхананы эскизге қосу

Кітапхана нұсқаулықтың көмегімен стандартты түрде эскизге енгізілген

#«farmerkeith_BMP280.h» қосыңыз

Бұл мәлімдеме setup () функциясы басталғанға дейін эскиздің бірінші бөлігіне енгізілуі қажет.

BME немесе BMP бағдарламалық қамтамасыз ету объектісін құру

BMP280 бағдарламалық объектісін құрудың 3 деңгейі бар. Ең қарапайым - бұл жай ғана

bme280 objectName; немесе bmp280 objectName;

мысалы, BMP280 bmp0;

Бұл 0x76 әдепкі мекен -жайы бар бағдарламалық қамтамасыз ету объектісін жасайды (яғни жерге қосылған SDO үшін).

BME280 немесе BMP280 бағдарламалық жасақтама объектісін құрудың келесі деңгейінде 0 немесе 1 параметрі болады:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Параметр (0 немесе 1) I2C базалық адресіне қосылады, осылайша екі BME280 немесе BMP280 құрылғылары бір I2C шинасында (олардың біреуін қосқанда) қолданыла алады.

BME немесе BMP280 бағдарламалық объектісін құрудың үшінші деңгейі екі параметрден тұрады. 0 немесе 1 болатын бірінші параметр алдыңғы жағдайдағыдай мекенжайға арналған. Екінші параметр отладтауды басып шығаруды басқарады. Егер ол 1 -ге орнатылса, бағдарламалық жасақтама объектісімен жасалған әрбір транзакция бағдарламашыға транзакцияның мәліметтерін көруге мүмкіндік беретін Serial.print нәтижелерін береді. Мысалға:

bmp280 objectNameB (1, 1);

Егер отладка бойынша басып шығару параметрі 0 -ге орнатылса, бағдарламалық қамтамасыз ету объектісі қалыпты әрекетке оралады (басып шығарылмайды).

Бұл мәлімдемені немесе мәлімдемелерді #include кейін және setup () функциясының алдында қосу қажет.

BME немесе BMP бағдарламалық қамтамасыз ету объектісін инициализациялау

Қолданар алдында, құрылғыдан калибрлеу параметрлерін оқып шығу керек және оны кез келген өлшеу режиміне, шамадан тыс іріктеу мен сүзгі параметрлеріне сәйкес конфигурациялау қажет.

Қарапайым, жалпы мақсаттағы инициализация үшін мәлімдеме:

objectName.begin ();

Begin () нұсқасы құрылғыдан калибрлеу параметрлерін оқиды және osrs_t = 7 (16 температуралық өлшеу), osrs_p = 7 (16 қысымды өлшеу), режим = 3 (үздіксіз, Қалыпты), t_sb = 0 (0,5 мс ұйқы арасында өлшеу жиынтығы), сүзгі = 0 (K = 1, сондықтан сүзгілеу жоқ) және spiw_en = 0 (SPI ажыратылған, сондықтан I2C қолданыңыз). BME280 жағдайында ылғалдылықты 16 өлшеу үшін osrs_h = 7 қосымша параметрі бар.

Begin () бағдарламасының барлық алты (немесе 7) параметрді қабылдайтын басқа нұсқасы бар. Жоғарыдағы мәлімдеменің баламасы

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, режим, t_sb, сүзгі, spiw_en

немесе objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, режим, t_sb, сүзгі, spiw_en, osrs_h

Кодтар мен олардың мағыналарының толық тізімі BME280 және BMP280 деректер парағында, сонымен қатар кітапханадағы.cpp файлындағы түсініктемелерде берілген.

Температура мен қысымды қарапайым өлшеу

Температураны өлшеудің ең қарапайым әдісі

қос температура = objectName.readTemperature (); // температураны өлшеу

Қысымды өлшеудің ең қарапайым әдісі

қос қысым = objectName.readPressure (); // қысымды өлшеу

Ылғалдылықты өлшеудің ең қарапайым әдісі

қос ылғалдылық = objectName.readHumidity (); // ылғалдылықты өлшеу (тек BME280)

Температураны да, қысымды да алу үшін жоғарыдағы екі мәлімдемені бірінен соң бірін қолдануға болады, бірақ басқа нұсқа бар, ол:

қосарланған температура;

қос қысым = objectName.readPressure (температура); // қысым мен температураны өлшеу

Бұл мәлімдеме BME280 немесе BMP280 құрылғысынан алынған деректерді бір рет оқиды және температураны да, қысымды да қайтарады. Бұл I2C шинасын біршама тиімдірек пайдалану және екі көрсеткіш бір өлшеу циклына сәйкес болуын қамтамасыз етеді.

BME 280 үшін барлық үш мәнді (ылғалдылық, температура және қысым) алатын біріктірілген мәлімдеме:

қос температура, қысым; қос ылғалдылық = objectName.readHumidity (температура, қысым); // ылғалдылықты, қысымды және температураны өлшеу

Бұл мәлімдеме BMP280 құрылғысынан алынған деректерді бір рет оқиды және барлық үш мәнді қайтарады. Бұл I2C шинасын біршама тиімдірек пайдалану және үш көрсеткіш бір өлшеу циклына сәйкес болуын қамтамасыз етеді. Назар аударыңыз, айнымалылардың атаулары пайдаланушыға ұнайтын кез келген нәрсеге өзгеруі мүмкін, бірақ олардың тәртібі бекітілген - температура бірінші, ал қысым екінші орында.

Бұл пайдалану жағдайлары basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino және basicHumidityAndTemperatureAndPressure.ino болатын кітапханамен қамтамасыз етілген эскиздерде қамтылған.

Неғұрлым күрделі температура мен қысымды өлшеу

Жоғарыда келтірілген мәлімдемелер сериясы қиындықсыз жұмыс істейтініне қарамастан, бірнеше мәселелер бар:

  1. құрылғы үздіксіз жұмыс істейді, сондықтан максималды қуат тұтынылады. Егер энергия батареядан алынса, оны азайту қажет болуы мүмкін.
  2. тұтынылатын қуаттың арқасында құрылғы жылынуды сезінеді, сондықтан өлшенген температура қоршаған ортаның температурасынан жоғары болады. Мен бұл туралы келесі қадамда толығырақ айтамын.

Аз қуатты пайдаланатын және қоршаған ортаға жақын температураны беретін нәтижені begin () көмегімен ұйықтататын параметрлермен алуға болады (мысалы, режим = 0). Мысалға:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, режим, t_sb, сүзгі, spiw_en [, osrs_h]

Содан кейін, өлшеу қажет болған кезде, osrs_h, osrs_t және osrs_p сәйкес мәндерін орнататын F2 (қажет болған жағдайда) және F4 регистрлері үшін конфигурация пәрменімен құрылғыны оятыңыз, plus = 1 режимі (бір рет түсіру режимі). Мысалға:

[objectName.updateF2Control (1);] // osrs_h - BMP280 үшін ешқашан қажет емес, // және өлшеу саны өзгертілмесе, BME280 үшін қажет емес // begin () ішінде берілген мәннен. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, режим

Құрылғыны оятқаннан кейін ол өлшеуді бастайды, бірақ нәтиже кейбір миллисекундтарда қол жетімді болмайды - көрсетілген өлшемдердің санына байланысты кемінде 4 мс, мүмкін 70 мс немесе одан да көп болуы мүмкін. Егер оқу пәрмені дереу жіберілсе, құрылғы алдыңғы өлшемдегі мәндерді қайтарады - бұл кейбір қосымшаларда қолайлы болуы мүмкін, бірақ көп жағдайда жаңа өлшеу қол жетімді болғанша кешіктірген дұрыс.

Бұл кешіктіруді бірнеше жолмен жасауға болады.

  1. күтілетін ең ұзақ кідірісті жабу үшін белгілі бір уақытты күтіңіз
  2. өлшеудің максималды өлшеу уақытының (яғни 2,3 мс) өлшемдер санынан, үстеме шығындардың үстінен маржамен есептелген уақытты күтіңіз.
  3. жоғарыда есептелгендей қысқа уақытты күтіңіз, бірақ номиналды өлшеу уақытын (яғни 2 мс) плюс үстеме шығындарды пайдаланып, содан кейін күй регистріндегі «Мен өлшеп жатырмын» битін тексеруді бастаңыз. Күй биті 0 -ге тең болғанда (яғни, өлшемейді), температура мен қысым көрсеткіштерін алыңыз.
  4. дереу күй регистрін тексеруді бастаңыз және статус биті 0 -ге тең болған кезде температура мен қысым көрсеткіштерін алыңыз,

Мен мұны істеудің бір жолының мысалын сәл кейінірек көрсетемін.

Конфигурация регистрінің операциялары

Мұның бәрін жасау үшін бізге әлі енгізбеген бірнеше құралдар қажет. Олар:

байтты оқу Тіркеу (reg)

void updateRegister (reg, value)

Олардың әрқайсысында кітапханада белгілі бір әрекеттерге арналған бағдарламалық қамтамасыз етуді біршама жеңілдететін бірнеше туынды командалар бар.

PowerSaverPressureAndTemperature.ino мысалы No 3 әдісті қолданады. Қайталап тексеруді жүзеге асыратын код жолы

while (bmp0.readRegister (0xF3) >> 3); // цикл untl F3bit 3 == 0

Бұл эскиз ESP8266 микроконтроллеріне арналғанын ескеріңіз. Мен WeMos D1 mini pro қолдандым. Эскиз ұйқыға арналған әр түрлі нұсқаулары бар Atmega микроконтроллерлерімен жұмыс істемейді. Бұл эскиз бірнеше басқа командаларды орындайды, сондықтан мен бұл эскизді толығырақ сипаттамас бұрын олардың барлығымен таныстырамын.

Микроконтроллер BMP280 сенсорымен параллель ұйықтап жатқанда, сенсорды конфигурациялауды 6 параметрді қолдана отырып, begin () командасында орындауға болады. Бірақ егер микроконтроллер ұйықтамаса, бірақ сенсор ұйықтап жатса, онда өлшеу кезінде сенсорды оятып, оның өлшеу конфигурациясын айту керек. Мұны тікелей көмегімен жасауға болады

updateRegister (reg, value)

бірақ келесі үш пәрменмен біршама жеңіл:

updateF2Control (osrs_h); // тек BME280

updateF4Control (osrs_t, osrs_p, режим); updateF5Config (t_sb, сүзгі, spi3W_en);

Өлшеу аяқталғаннан кейін, егер пайдаланылатын режим Бір кадрлық режим (Мәжбүрлі режим) болса, онда құрылғы автоматты түрде ұйқыға кетеді. Алайда, егер өлшеу жиынтығы үздіксіз (Қалыпты) режимді қолдана отырып бірнеше өлшеуді қамтитын болса, онда BMP280 қайтадан ұйқыға жіберілуі керек. Мұны келесі екі команданың бірімен жасауға болады:

updateF4Control16xSleep ();

updateF4ControlSleep (мән);

Бұл екеуі де режим биттерін 00 -ге (яғни ұйқы режимі) орнатады. Алайда, біріншісі osrs_t және osrs_p -ды 111 -ге (яғни 16 өлшемге) орнатады, ал екіншісі «мәннен» төмен 6 битті 0xF4 регистрінің 7: 2 биттерінде сақтайды.

Сол сияқты келесі мәлімдемеде «мәннің» төменгі алты биті 0xF5 регистрінің 7: 2 биттерінде сақталады.

updateF5ConfigSleep (мән);

Бұл соңғы командаларды қолдану BMP280 F4 және F5 регистрлерінде 12 бит ақпаратты сақтауға мүмкіндік береді. Кем дегенде, ESP8266 жағдайында, микроконтроллер ұйқыдан кейін оянғанда, ол эскиздің басында ұйқы пәрменіне дейін оның күйі туралы білмей басталады. Ұйқы пәрменіне дейін оның жай -күйі туралы білімді сақтау үшін, деректерді флэш -жадта EEPROM функцияларын қолдана отырып немесе SPIFFS көмегімен файлды жазу арқылы сақтауға болады. Бірақ флэш-жадыда жазу циклдарының саны шектеулі, олардың саны 10-нан 100-ге дейін. Бұл дегеніміз, егер микроконтроллер бірнеше секунд сайын ұйқы-ояту циклінен өтсе, ол рұқсат етілген жадтан асып кетуі мүмкін. бірнеше ай ішінде шектеу. BMP280 -де бірнеше бит деректерді сақтау мұндай шектеулерге ие емес.

F4 және F5 регистрлерінде сақталған мәліметтерді микроконтроллер командалар көмегімен оянғанда қалпына келтіруге болады.

readF4Sleep ();

readF5Sleep ();

Бұл функциялар сәйкес регистрді оқиды, 2 LSB жою үшін мазмұнды ауыстырады және қалған 6 биттерді қайтарады. Бұл функциялар powerSaverPressureAndTemperatureESP.ino эскизінің мысалында келесідей қолданылады:

// bmp0 -ден EventCounter мәнін оқу

байт bmp0F4value = bmp0.readF4Sleep (); // 0 -ден 63 байтқа дейін bmp0F5value = bmp0.readF5Sleep (); // 0 -ден 63 -ке дейін eventCounter = bmp0F5value*64+bmp0F4value; // 0 -ден 4095 дейін

Бұл функциялар сәйкес регистрді оқиды, 2 LSB жою үшін мазмұнды ауыстырады және қалған 6 биттерді қайтарады. Бұл функциялар powerSaverPressureAndTemperature.ino эскизінің мысалында келесідей қолданылады:

// bmp1 -ден EventCounter мәнін оқу

байт bmp1F4value = bmp1.readF4Sleep (); // 0 -ден 63 байтқа дейін bmp1F5value = bmp1.readF5Sleep (); // 0 -ден 63 -ке дейін eventCounter = bmp1F5value*64+bmp1F4value; // 0 -ден 4095 дейін

Шикі температура мен қысымның функциялары

Негізгі оқу температурасы, оқу қысымы және оқу ылғалдылығы екі компоненттен тұрады. Алдымен шикі 20-разрядты температура мен қысым мәндері BME/P280-ден алынады немесе 16-разрядты ылғалдылық мәні BME280-ден алынады. Содан кейін компенсация алгоритмі Цельсий градусында, hPa немесе %RH шығыс мәндерін генерациялау үшін қолданылады.

Кітапхана бұл компоненттер үшін бөлек функцияларды қамтамасыз етеді, осылайша шикі температура, қысым мен ылғалдылық туралы мәліметтерді алуға болады, мүмкін қандай да бір жолмен басқарылады. Осы шикізаттық мәндерден температураны, қысымды және ылғалдылықты алу алгоритмі де берілген. Кітапханада бұл алгоритмдер екі ұзындықтағы өзгермелі нүктелі арифметиканың көмегімен жүзеге асады. Ол 32 разрядты процессор болып табылатын ESP8266-де жақсы жұмыс істейді және «қос» өзгермелі айнымалы мәндер үшін 64 бит қолданады. Бұл функцияларды қолжетімді ету басқа платформалар үшін есептеулерді бағалау және өзгерту үшін пайдалы болуы мүмкін.

Бұл функциялар:

readRawPressure (rawTemperature); // BME/P280readRawHumidity (rawTemperature, rawPressure) шикі қысым мен температура деректерін оқиды; // BME280 calcTemperature шикі ылғалдылығы, температурасы мен қысымы туралы деректерді оқиды (rawTemperature, t_fine); кальций қысымы (шикі қысым, t_fine); кальций ылғалдылығы (шикі ылғалдылық, t_fine)

Бұл функциялардың «t-fine» аргументі біраз түсіндіруге тұрарлық. Қысым мен ылғалдылықты өтеу алгоритмдері t_fine айнымалысы арқылы қол жеткізілетін температураға тәуелді компонентті қамтиды. CalcTemperature функциясы температураны өтеу алгоритмінің логикасына негізделген t_fine мәнін жазады, ол содан кейін calcPressure және calcHumidity -те кіріс ретінде пайдаланылады.

Бұл функцияларды қолданудың мысалын rawPressureAndTemperature.ino эскизінен, сонымен қатар кітапхананың.cpp файлындағы readHumidity () функциясының кодынан табуға болады.

Биіктік пен теңіз деңгейінің қысымы

Атмосфералық қысым мен биіктік арасында белгілі байланыс бар. Ауа райы қысымға да әсер етеді. Ауа райы ұйымдары атмосфералық қысым туралы ақпаратты жариялаған кезде, олар әдетте оны биіктікке қарай реттейді, сондықтан «синоптикалық диаграмма» теңіз деңгейінен стандартталған изобарларды (тұрақты қысым сызықтары) көрсетеді. Бұл қатынаста шын мәнінде 3 құндылық бар, ал олардың екеуін білу үшіншісін шығаруға мүмкіндік береді. 3 мән:

  • теңіз деңгейінен биіктігі
  • сол биіктіктегі нақты ауа қысымы
  • теңіз деңгейіндегі ауа қысымы

Бұл кітапхана осы қатынас үшін екі функцияны ұсынады, мысалы:

calcAlitude (қысым, теңіз деңгейі);

calcNormalised Pressure (қысым, биіктік);

Теңіз деңгейінің 1013,15 гПа стандартты қысымын болжайтын жеңілдетілген нұсқа да бар.

кальций биіктігі (қысым); // стандартты SeaLevelPressure қабылданды

3 -қадам: BMP280 құрылғысы туралы мәліметтер

BMP280 құрылғысы туралы мәліметтер
BMP280 құрылғысы туралы мәліметтер

Аппараттық құралдардың мүмкіндіктері

BMP280 конфигурация деректерінің 2 байтына ие (0xF4 және 0xF5 регистрлік адрестерде), ол бірнеше өлшеу мен деректерді шығару опцияларын басқару үшін қолданылады. Ол сондай -ақ 2 бит күйі туралы ақпаратты және 24 байт калибрлеу параметрлерін ұсынады, олар шикі температура мен қысым мәндерін әдеттегі температура мен қысым бірліктеріне түрлендіру үшін қолданылады. BME280 келесідей қосымша деректерге ие:

  • Ылғалдылықтың бірнеше өлшеуін бақылау үшін пайдаланылатын 0xF2 регистрлік адрес бойынша конфигурация деректерінің 1 қосымша байты;
  • Шикі ылғалдылық мәнін салыстырмалы ылғалдылық пайызына айналдыру үшін қолданылатын калибрлеу параметрлерінің 8 қосымша байты.

BME280 үшін температура, қысым және күй регистрлері BMP280 сияқты төмендегідей шамалы ерекшеліктермен бірдей:

  • BME280 -дің «ID» биттері 0x60 -қа орнатылған, сондықтан оны BMP280 -ден ажыратуға болады, ол 0x56, 0x57 немесе 0x58 болуы мүмкін.
  • ұйқы уақытын басқару (t_sb) BMP280 -дегі екі ұзақ уақыт (2000 мс және 4000 мс) BME280 -де 10 мс және 20 мс қысқа уақыттармен ауыстырылатын етіп өзгертіледі. BME280 -де ұйқының максималды уақыты - 1000 мс.
  • Егер сүзу қолданылса, BME280 -де температура мен қысымның шикі мәндері әрқашан 20 бит болады. 16 -дан 19 -ға дейінгі биттік мәндерді қолдану тек сүзгісіз жағдаймен шектеледі (яғни сүзгі = 0).

Температура мен қысым - әрбір 20 биттік мәндер, оларды температура үшін 3 16 биттік калибрлеу параметрлері мен 9 16 биттік калибрлеу параметрлері мен қысым үшін температураны қолдана отырып, күрделі алгоритм арқылы әдеттегі температура мен қысымға түрлендіру қажет. Температураны өлшеудің түйіршіктілігі ең аз бит өзгерісі (20 биттік оқу) үшін 0.0003 градус Цельсий болып табылады, егер 16 биттік көрсеткіш қолданылса, 0.0046 градусқа дейін артады.

Ылғалдылық - бұл 16 биттік мән, ол 8, 12 және 16 биттерден тұратын 6 калибрлеу параметрін қолдана отырып, басқа күрделі алгоритм арқылы салыстырмалы ылғалдылыққа айналдырылуы керек.

Деректер парағы температураны оқудың абсолютті дәлдігін 25-те +-0,5 С және 0-ден 65 С аралығында +-1 С көрсетеді.

Қысымды өлшеудің түйіршіктілігі 20 разрядта 0,15 Паскальды құрайды (яғни 0,0015 гектоПаскаль) немесе 16 разрядта 2,5 Паскаль. Шикізат қысымының мәніне температура әсер етеді, сондықтан 25С шамасында температураның 1 градус С жоғарылауы өлшенген қысымды 24 Паскальға төмендетеді. Температураның сезімталдығы калибрлеу алгоритмінде есепке алынады, сондықтан берілген қысымның мәндері әр түрлі температурада дәл болуы керек.

Деректер парағы 0 С-ден 65 С-қа дейінгі температура үшін қысым көрсеткішінің абсолютті дәлдігін +-1 гПа ретінде көрсетеді.

Ылғалдылық дәлдігі мәліметтер парағында +3% RH, және +-1% гистерезис түрінде берілген.

Бұл қалай жұмыс істейді

Температура мен қысымды калибрлеу бойынша 24 байт, сондай -ақ BME280 жағдайында ылғалдылықты калибрлеудің 8 байт деректері құрылғыдан оқылып, айнымалыларда сақталуы керек. Бұл деректер зауытта құрылғыға жеке бағдарламаланған, сондықтан әр түрлі құрылғыларда әр түрлі мәндер бар - кем дегенде кейбір параметрлер үшін. BME/P280 екі күйдің бірінде болуы мүмкін. Бір күйде ол өлшенеді. Басқа күйде ол күтеді (ұйықтайды).

Ол қандай күйде екенін 0xF3 регистрінің 3 -битіне қарап тексеруге болады.

Ең соңғы өлшеу нәтижелерін кез келген уақытта құрылғы ұйықтап жатқанына немесе өлшегеніне қарамастан, сәйкес деректер мәнін оқу арқылы алуға болады.

Сонымен қатар BME/P280 жұмысының екі әдісі бар. Бірі - Өлшеу мен Ұйықтау күйлері арасында бірнеше рет цикл жасайтын Үздіксіз режим (деректер парағында Қалыпты режим деп аталады). Бұл режимде құрылғы өлшеулер жиынтығын орындайды, содан кейін ұйқыға кетеді, содан кейін басқа өлшемдер жиынтығынан оянады және т.б. Жеке өлшеулердің саны мен циклдің ұйқы бөлігінің ұзақтығын конфигурация регистрлері арқылы басқаруға болады.

BME/P280 жұмысының басқа әдісі - бұл бір кадрлық режим (деректер парағында мәжбүрлі режим деп аталады). Бұл режимде құрылғы ұйқыдан өлшеу пәрменімен оятады, ол өлшемдер жиынтығын жасайды, содан кейін қайтадан ұйқыға кетеді. Жинақтағы жеке өлшеулер саны құрылғыны оятатын конфигурация командасында бақыланады.

BMP280 -де, егер бір өлшеу жүргізілсе, мәндегі ең маңызды 16 бит толтырылады, ал мәнді оқудағы ең аз төрт бит нөлге тең. Өлшеу санын 1, 2, 4, 8 немесе 16 етіп орнатуға болады және өлшеу санын көбейткен сайын деректермен толтырылатын биттердің саны артады, осылайша 16 өлшеу кезінде барлық 20 бит өлшеу деректерімен толтырылады. Деректер парағы бұл процесті шамадан тыс іріктеу деп атайды.

BME280 -де нәтиже сүзілмесе, дәл сол тәртіп қолданылады. Егер сүзгілеу қолданылса, әрбір өлшеу циклінде қанша өлшеу жүргізілгеніне қарамастан, мәндер әрқашан 20 бит болады.

Әрбір жеке өлшеуге шамамен 2 миллисекунд кетеді (типтік мән; максималды мән - 2,3 мс). Бұған шамамен 2 мс (әдетте сәл аз) тұрақты үстеме шығындарды қосу 1 -ден 32 -ге дейінгі жеке өлшемдерден тұратын өлшеу реттілігі 4 мс -тен 66 мс -ке дейін созылатынын білдіреді.

Мәліметтер парағы әр түрлі қосымшалар үшін температура мен қысымның шамадан тыс іріктеуінің ұсынылған комбинацияларының жиынтығын ұсынады.

Конфигурацияны басқару регистрлері

BMP280 конфигурациясын басқарудың екі регистрі 0xF4 және 0xF5 регистрлік адрестерде орналасқан және 6 жеке конфигурацияны басқару мәніне салыстырылады. 0xF4 мыналардан тұрады:

  • 3 бит osrs_t (температураны 0, 1, 2, 4, 8 немесе 16 рет өлшеңіз);
  • 3 бит osrs_p (қысымды 0, 1, 2, 4, 8 немесе 16 рет өлшеңіз); және
  • 2 бит режимі (Ұйқы, мәжбүрлі (яғни бір кадрлық), қалыпты (яғни үздіксіз).

0xF5 мыналардан тұрады:

  • 3 бит t_sb (күту уақыты, 0,5 мс - 4000 мс);
  • 3 биттік сүзгі (төменде қараңыз); және
  • SPI немесе I2C таңдайтын 1 бит spiw_en.

Сүзгі параметрі экспоненциалды ыдырау алгоритмінің түрін немесе шикі қысым мен температураны өлшеу мәндеріне (бірақ ылғалдылық мәндеріне емес) қолданылатын Infinite Impulse Response (IIR) сүзгісін басқарады. Теңдеу мәліметтер парағында берілген. Тағы бір презентация:

Мән (n) = Мән (n-1) * (K-1) / K + өлшеу (n) / K

мұнда (n) ең соңғы өлшеу мен шығару мәнін көрсетеді; ал K - сүзгі параметрі. Сүзгі параметрі K және оны 1, 2, 4, 8 немесе 16 мәніне орнатуға болады. Егер K мәніне 1 қойылса, онда теңдеу мәнге (n) = өлшеуге (n) айналады. Сүзгі параметрінің кодталуы:

  • сүзгі = 000, K = 1
  • сүзгі = 001, K = 2
  • сүзгі = 010, K = 4
  • сүзгі = 011, K = 8
  • сүзгі = 1xx, K = 16

BME 280 0xF2, «ctrl_hum» адресі бойынша конфигурацияның басқа регистрін қосады, osrs_h 3-биттік бір параметрлі (ылғалдылықты 0, 1, 2, 4, 8 немесе 16 рет өлшеңіз).

4 -қадам: Өлшеу және оқу уақыты

Мен бұны кейінірек қосуды жоспарлап отырмын, командалар мен өлшеу жауаптарының уақытын көрсетеді.

Iddt - температураны өлшеу кезіндегі ток. Әдеттегі мән 325 uA

Iddp - қысымды өлшеу кезіндегі ток. Әдеттегі мәні 720 uA, max 1120 uA

Iddsb - күту режиміндегі ток. Әдеттегі мән 0,2 uA, максимум 0,5 uA

Iddsl - ұйқы режиміндегі ток. Әдеттегі мән 0,1 uA, максимум 0,3 uA

5 -қадам: Бағдарламалық қамтамасыз ету бойынша нұсқаулық

Бағдарламалық қамтамасыз ету бойынша нұсқаулық
Бағдарламалық қамтамасыз ету бойынша нұсқаулық
Бағдарламалық қамтамасыз ету бойынша нұсқаулық
Бағдарламалық қамтамасыз ету бойынша нұсқаулық

I2C Burst режимі

BMP280 мәліметтер парағы деректерді оқу бойынша нұсқаулық береді (3.9 бөлім). Онда «әр оқулыққа жеке адресат емес, оқуды қолдану ұсынылады. Бұл әр түрлі өлшемдерге жататын байттардың ықтимал араласуын болдырмайды және интерфейс трафигін азайтады» делінген. Компенсация/калибрлеу параметрлерін оқуға қатысты нұсқаулық берілмейді. Мүмкін, бұл мәселе емес, өйткені олар тұрақты және өзгермейді.

Бұл кітапхана барлық оқшау мәндерді бір оқу операциясында оқиды - температура мен қысымды өтеу параметрлері жағдайында 24 байт, температура мен қысымды біріктіру үшін 6 байт, ылғалдылық, температура мен қысымды біріктіру үшін 8 байт. Тек температураны тексергенде, тек 3 байт оқылады.

Макростарды қолдану (#define және т

Бұл кітапханада қайталауды болдырмайтын «қорғаныс қорғанысы бар» әдеттегі кітапханадан басқа макростар жоқ.

Барлық тұрақтылар const кілт сөзінің көмегімен анықталады, ал отладтауды басып шығару стандартты С функциясымен басқарылады.

Бұл мен үшін белгісіздіктің көзі болды, бірақ мен осы тақырыптағы көптеген жазбаларды оқудан алатын кеңес - тұрақтылықты жариялау үшін #define пайдалану (кем дегенде) және (мүмкін) отладтауды басуды басқару қажет емес және қажет емес.

#Define емес, const қолдану жағдайы өте түсінікті - const #define сияқты ресурстарды пайдаланады (яғни nil) және алынған мәндер қолдану ережелерін сақтайды, осылайша қате ықтималдығын азайтады.

Қатені басып шығаруды бақылауға қатысты жағдай сәл түсінікті, себебі мен мұны қалай істегенім, түпкілікті кодта олар ешқашан орындалмаса да, отладтауды басып шығару мәлімдемелерінің логикасы бар екенін білдіреді. Егер кітапхана жады шектеулі микроконтроллердегі үлкен жобада пайдаланылатын болса, бұл мәселе болуы мүмкін. Менің дамуым үлкен флэш -жады бар ESP8266 -де болғандықтан, бұл мен үшін мәселе емес сияқты.

6 -қадам: Температураның өнімділігі

Мен мұны кейінірек қосуды жоспарлап отырмын.

7 -қадам: Қысым өнімділігі

Мен мұны кейінірек қосуды жоспарлап отырмын.

Ұсынылған: