Բովանդակություն:

Գրադարան BMP280- ի և BME280- ի համար. 7 քայլ
Գրադարան BMP280- ի և BME280- ի համար. 7 քայլ

Video: Գրադարան BMP280- ի և BME280- ի համար. 7 քայլ

Video: Գրադարան BMP280- ի և BME280- ի համար. 7 քայլ
Video: Using Heltec ESP32 OLED Wifi Kit 2024, Հուլիսի
Anonim
Գրադարան BMP280- ի և BME280- ի համար
Գրադարան BMP280- ի և BME280- ի համար
Գրադարան BMP280- ի և BME280- ի համար
Գրադարան BMP280- ի և BME280- ի համար
Գրադարան BMP280- ի և BME280- ի համար
Գրադարան BMP280- ի և BME280- ի համար

Ներածություն

Ես նպատակ չունեի գրել այս գրադարանը: Դա «տեղի ունեցավ» որպես իմ սկսած նախագծի կողմնակի ազդեցություն, որը օգտագործում է BMP280: Այդ նախագիծը դեռ ավարտված չէ, բայց կարծում եմ, որ գրադարանը պատրաստ է կիսվել ուրիշների հետ: Հետագայում ես կարիք ունեի օգտագործել BME280, որը խոնավության չափումն ավելացնում է BMP280 ճնշման և ջերմաստիճանի հնարավորություններին: BME280- ը «հետընթաց համատեղելի է» BMP280- ի հետ, այսինքն `բոլոր գրանցամատյանները և BME280- ից ճնշում և ջերմաստիճան կարդալու համար անհրաժեշտ քայլերը նույնն են, ինչ օգտագործվում է BMP280- ի համար: Խոնավությունը կարդալու համար անհրաժեշտ են լրացուցիչ գրանցամատյաններ և քայլեր, որոնք կիրառելի են միայն BME280- ի համար: Սա հարց է առաջացնում ՝ մեկ գրադարան երկուսի համար, կամ երկու առանձին գրադարան: Երկու տեսակի սարքերի սարքավորումները լիովին փոխանակելի են: Նույնիսկ վաճառվող մոդուլներից շատերը (օրինակ ՝ Ebay- ում և AliExpress- ում) պիտակավորված են BME/P280: Պարզելու համար, թե որ տեսակն է դա, դուք պետք է նայեք սենսորի վրա գրված (աննշան) գրությանը կամ փորձարկեք սարքի ID բայթը: Որոշեցի մեկ գրադարան գնալ: Կարծես լավ ստացվեց:

Հետադարձ կապը, հատկապես բարելավումների վերաբերյալ ցանկացած առաջարկ, կգնահատվի:

Գրադարանի առանձնահատկությունները և հնարավորությունները

Գրադարանը ծրագրաշարի մի կտոր է, որը ծրագրավորողին տալիս է Programրագրավորման ծրագրավորման միջերես (API) `սարքի հնարավորություններն օգտագործելու համար` առանց անպայմանորեն մանրուքների բոլոր մանրուքների հետ գործ ունենալու: Iraանկալի է, որ API- ն սկսելու համար պետք է հեշտ լինի պարզ պահանջներ ունեցող սկսնակի համար ՝ միաժամանակ ապահովելով սարքի հնարավորությունների լիարժեք շահագործումը: Desանկալի է, որ գրադարանը պետք է հետևի սարքի արտադրողի ցանկացած հատուկ ցուցումներին, ինչպես նաև ծրագրային ապահովման ընդհանուր փորձին: Ես ձգտել եմ հասնել այս ամենին: BMP280- ով սկսելիս ես դրա համար գտա 3 տարբեր գրադարաններ. Adafruit_BMP280; Տեսած_ԲՊՄ 280; և մեկը, որը կոչվում է BMP280 սարքի արտադրողից: Ոչ Adafruit- ը, ոչ Seeed- ը չեն տրամադրել ընդլայնված հնարավորություններ, չնայած դրանք լավ էին աշխատում և հեշտ էին օգտագործել հիմնական ծրագրերի համար: Ես չէի կարող հասկանալ, թե ինչպես օգտագործել սարքի արտադրողի (Bosch Sensortec) արտադրածը: Սա կարող է լինել իմ պակասը, այլ ոչ թե նրանց: Այնուամենայնիվ, գրադարանը շատ ավելի բարդ էր, քան մյուս երկուսը, ես չկարողացա գտնել որևէ ցուցում կամ օգտագործման օրինակ (հետագայում ես գտա օրինակներ «bmp280_support.c» ֆայլում, սակայն դրանք ինձ առանձնապես օգտակար չէին):

Այս գործոնների արդյունքում ես որոշեցի գրել իմ սեփական գրադարանը BMP280- ի համար:

Նայելով BME280- ի գրադարանային իրավիճակին ՝ ես գտա առանձին գրադարաններ ՝ Adafruit_BME280, Seed_BME280 և մեկ այլ BME280_MOD-1022 գրված ՝ Embedded Adventures- ի կողմից: Նրանցից ոչ մեկը չի համատեղել BMP280- ի գործառույթները գրադարանում, որը կարող է օգտագործել BME280- ը: Նրանցից ոչ մեկը հստակորեն չի աջակցում սարքերի ՝ մի քանի բիթ տվյալներ պահելու ունակությունը, մինչ սարքը և դրա վերահսկիչ միկրոպրոցեսորը քնած են (այս հնարավորությունը ակնհայտ է տվյալների թերթիկում և աջակցվում է իմ գրած և նկարագրած գրադարանում):

Համակցված գրադարանը պետք է ունենա աջակցություն BME280- ի բոլոր հնարավորություններին, սակայն BMP280- ի հետ աշխատելիս այն չպետք է որևէ լրացուցիչ ծախսեր չպահի չօգտագործված գործառույթներից: Համակցված գրադարանի առավելությունները ներառում են ավելի քիչ գրադարանային ֆայլերի կառավարում, նույն նախագծում տարբեր սարքերի հեշտ խառնուրդ և համընկնում և սպասարկման կամ արդիականացման պարզեցված փոփոխություններ, որոնք պետք է կատարվեն միայն մեկ տեղում, այլ ոչ թե երկուսում: Սրանք, հավանաբար, բոլորովին աննշան են, նույնիսկ աննշան, բայց…

Սարքի հնարավորությունները

BMP280- ը և BME280- ը մակերեսային սարքեր են ՝ մոտ 5 մմ քառակուսի և 1 մմ բարձրության վրա: Կան 8 միջերեսային բարձիկներ, ներառյալ 2 առանձին հոսանքի մուտքի բարձիկներ և երկու գրունտային բարձիկներ: Դրանք հասանելի են eBay- ում ՝ որպես մոդուլ, որի հետ դուրս են բերվում 4 կամ 6 կապում: 4-պին մոդուլն ունի ֆիքսված I2C հասցե և չի կարող կազմաձևվել SPI արձանագրության օգտագործման համար:

6-պին մոդուլը կամ մերկ սարքը կարող են օգտագործվել կամ I2C կամ SPI արձանագրություններով: I2C ռեժիմում այն կարող է ունենալ երկու տարբեր հասցեներ, որոնք ձեռք են բերվում SDO կապը միացնելով Ground- ին (հիմնական հասցեի համար = 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 Ground GND Հասցեի կառավարում SDO Ground կամ Vdd I2C ընտրել CSB Vdd (GND- ն ընտրում է SPI)

Նկատի ունեցեք, որ MP280- ի որոշ մոդուլների SDO կապը պիտակավորված է SDD, իսկ Vdd կապը կարող է պիտակավորված լինել VCC: Նշում. SDA և SCL գծերը պետք է ունենան ձգման դիմադրություններ գծի և Vin կապի միջև: Սովորաբար 4.7K արժեքը պետք է լինի OK: Որոշ BMP280 և BME280 մոդուլներում մոդուլում ներառված են 10K ձգման դիմադրություններ (ինչը լավ պրակտիկա չէ, քանի որ I2C ավտոբուսում բազմաթիվ սարքերի տեղադրումը կարող է այն չափազանց ծանրաբեռնել): Այնուամենայնիվ, 2 BME/P280 մոդուլներից յուրաքանչյուրը 10K դիմադրիչով գործնականում խնդիր չպետք է լինի, քանի դեռ նույն ավտոբուսում չկան շատ այլ սարքեր, ինչպես նաև ձգվող դիմադրիչներ:

Սարքավորումը միացնելուց հետո կարող եք հեշտությամբ ստուգել ՝ արդյոք ձեր սարքը BMP280 է, թե BME280 ՝ գործարկելով I2CScan_ID ուրվագիծը, որը կարող եք գտնել այստեղ ՝

Կարող եք նաև ստուգել ՝ ունեք BMP280 կամ BME280 ՝ նայելով ինքնին սարքին: Ես դրա համար անհրաժեշտ համարեցի օգտագործել թվային մանրադիտակ, բայց եթե ձեր տեսողությունը շատ լավ է, գուցե դա կարողանաք անել առանց որևէ օգնության: Սարքի պատյանում տպագրության երկու տող կա: Բանալին երկրորդ տողի առաջին տառն է, որը BMP280 սարքերի դեպքում «K» է, իսկ BME280 սարքերի դեպքում `« U »:

Քայլ 2. Գրադարանի տրամադրած API- ները

API- ները տրամադրվում են գրադարանի կողմից
API- ները տրամադրվում են գրադարանի կողմից
API- ները տրամադրվում են գրադարանի կողմից
API- ները տրամադրվում են գրադարանի կողմից

Գրադարանի ներառումը ուրվագծի մեջ

Գրադարանն ընդգրկված է ուրվագծի մեջ `օգտագործելով քաղվածքը

#ներառել «farmerkeith_BMP280.h»

Այս հայտարարությունը պետք է ներառվի ուրվագծի սկզբնական մասում ՝ նախքան setup () գործառույթի մեկնարկը:

BME կամ BMP ծրագրային օբյեկտի ստեղծում

BMP280 ծրագրային օբյեկտի ստեղծման համար կա 3 մակարդակ: Ամենապարզը պարզապես է

bme280 օբյեկտի անուն; կամ bmp280 օբյեկտի Անուն;

օրինակ ՝ BMP280 bmp0;

Սա ստեղծում է ծրագրային օբյեկտ `0x76 լռելյայն հասցեով (այսինքն` գետնին միացված SDO- ի համար):

BME280 կամ BMP280 ծրագրային օբյեկտ ստեղծելու հաջորդ մակարդակն ունի 0 կամ 1 պարամետր, հետևյալը.

bme280 օբյեկտի Անուն Ա (0);

bmp280 օբյեկտի անունԲ (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 ();

Սկսելու այս տարբերակը () կարդում է սարքից չափագրման պարամետրերը և սահմանում osrs_t = 7 (ջերմաստիճանի 16 չափում), osrs_p = 7 (ճնշման 16 չափում), ռեժիմ = 3 (շարունակական, նորմալ), t_sb = 0 (0.5 ms քուն միջև չափման հավաքածուներ), զտիչ = 0 (K = 1, այնպես որ զտում չկա) և spiw_en = 0 (SPI- ն անջատված է, այնպես որ օգտագործեք I2C): BME280- ի դեպքում խոնավության 16 չափումների համար կա լրացուցիչ պարամետր osrs_h = 7:

Կա սկիզբի () մեկ այլ տարբերակ, որը վերցնում է բոլոր վեց (կամ 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 ֆայլի մեկնաբանություններում:

Պարզ ջերմաստիճանի և ճնշման չափում

Temperatureերմաստիճանի չափում ստանալու համար ամենապարզ միջոցը

կրկնակի ջերմաստիճան = objectName.readTemperature (); // չափել ջերմաստիճանը

Pressureնշման չափում ստանալու համար ամենապարզ միջոցն է

կրկնակի ճնշում = objectName.readPressure (); // չափել ճնշումը

Խոնավության չափում ստանալու համար ամենապարզ միջոցը

կրկնակի խոնավություն = objectName.readHumidity (); // չափել խոնավությունը (միայն BME280)

Ինչպես ջերմաստիճան, այնպես էլ ճնշում ստանալու համար վերը նշված երկու հայտարարությունները կարող են օգտագործվել մեկը մյուսի հետևից, բայց կա մեկ այլ տարբերակ, որն է.

կրկնակի ջերմաստիճան;

կրկնակի ճնշում = objectName.read ճնշում (ջերմաստիճան); // չափել ճնշումն ու ջերմաստիճանը

Այս հայտարարությունը կարդում է BME280 կամ BMP280 սարքի տվյալները միայն մեկ անգամ և վերադարձնում է թե ջերմաստիճանը, թե ճնշումը: Սա փոքր -ինչ ավելի արդյունավետ օգտագործում է I2C ավտոբուսը և ապահովում է, որ երկու ընթերցումները համապատասխանեն նույն չափման ցիկլին:

BME 280 -ի համար համակցված հայտարարությունը, որը ստանում է բոլոր երեք արժեքները (խոնավություն, ջերմաստիճան և ճնշում), հետևյալն է.

կրկնակի ջերմաստիճան, ճնշում; կրկնակի խոնավություն = օբյեկտի անվանում. կարդալԽոնավություն (ջերմաստիճան, ճնշում); // չափել խոնավությունը, ճնշումը և ջերմաստիճանը

Այս հայտարարությունը կարդում է տվյալները BMP280 սարքից միայն մեկ անգամ և վերադարձնում է բոլոր երեք արժեքները: Սա փոքր -ինչ ավելի արդյունավետ օգտագործում է I2C ավտոբուսը և ապահովում է, որ երեք ընթերցումները համապատասխանեն նույն չափման ցիկլին: Նկատի ունեցեք, որ փոփոխականների անունները կարող են փոխվել այն ամենի վրա, ինչ օգտվողին դուր է գալիս, սակայն դրանց կարգը ֆիքսված է. Առաջինը ջերմաստիճանն է, իսկ ճնշումը `երկրորդը:

Այս օգտագործման դեպքերն ընդգրկված են գրադարանին տրամադրված էսքիզների օրինակով ՝ լինելով BasicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino և basicHumidityAndTemperatureAndPressure.ino:

Ավելի բարդ ջերմաստիճանի և ճնշման չափում

Չնայած վերը նշված հայտարարությունների շարանը կաշխատի առանց խնդիրների, կան մի քանի խնդիրներ.

  1. սարքը անընդհատ աշխատում է, ուստի էներգիա է սպառում իր առավելագույն մակարդակով: Եթե էներգիան գալիս է մարտկոցից, գուցե անհրաժեշտ լինի նվազեցնել այն:
  2. սպառված էներգիայի պատճառով սարքը տաքանում է, և, հետևաբար, չափված ջերմաստիճանը կլինի ավելի բարձր, քան շրջապատող ջերմաստիճանը: Այս մասին ավելի շատ կանդրադառնամ հետագա քայլին:

Արդյունքը, որն ավելի քիչ էներգիա է օգտագործում և տալիս է ջերմաստիճանը, որն ավելի մոտ է շրջակա միջավայրի, կարող է ստացվել ՝ օգտագործելով () ՝ օգտագործելով () այն քնեցնող պարամետրերով (օրինակ ՝ ռեժիմ = 0): Օրինակ:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, ռեժիմ, t_sb, զտիչ, spiw_en [, osrs_h]

Այնուհետև, երբ չափում է պահանջվում, սարքն արթնացրեք կազմաձևման հրամանով ՝ գրանցելով F2 (անհրաժեշտության դեպքում) և F4, որը սահմանում է osrs_h, osrs_t և osrs_p համապատասխան արժեքները, գումարած ռեժիմ = 1 (մեկ կրակոցի ռեժիմ): Օրինակ:

[objectName.updateF2Control (1);] // osrs_h - երբեք անհրաժեշտ չէ BMP280- ի համար, // և անհրաժեշտ չէ BME280- ի համար, եթե չափումների թիվը չի փոխվում // սկզբում նշված արժեքից (): objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, ռեժիմ

Սարքը արթնացնելուց հետո այն կսկսի չափել, սակայն արդյունքը որոշ միլիվայրկյանների ընթացքում հասանելի չի լինի `առնվազն 4 ms, գուցե մինչև 70 ms կամ ավելի, կախված ճշգրտված չափումների քանակից: Եթե ընթերցման հրամանը անմիջապես ուղարկվի, սարքը կվերադարձնի նախորդ չափման արժեքները, ինչը որոշ ծրագրերում կարող է ընդունելի լինել, բայց շատ դեպքերում հավանաբար ավելի լավ է հետաձգել մինչև նոր չափման հասանելի լինելը:

Այս հետաձգումը կարող է իրականացվել մի քանի եղանակով:

  1. սպասել որոշակի ժամանակ ՝ ամենաերկար սպասվող ուշացումը ծածկելու համար
  2. սպասել չափման առավելագույն ժամանակից հաշվարկվող ժամանակի (այսինքն ՝ 2.3 մվ) չափումների քանակի բազմապատկած գումարած վերևի գումարած լուսանցք:
  3. սպասեք ավելի կարճ ժամանակ, որը հաշվարկված է վերևում, բայց օգտագործելով չափման անվանական ժամանակը (այսինքն ՝ 2 ms) գումարած վերևը, և ապա սկսեք կարգավիճակի գրանցամատյանում ստուգել «Ես չափում եմ» բիտը: Երբ կարգավիճակի բիթը կարդում է 0 (այսինքն ՝ չի չափվում), ստացեք ջերմաստիճանի և ճնշման ցուցանիշները:
  4. անմիջապես սկսեք ստուգել կարգավիճակի գրանցամատյանը և ստացեք ջերմաստիճանի և ճնշման ցուցանիշներ, երբ կարգավիճակի բիթը կարդում է 0,

Ես մի փոքր ուշ ցույց կտամ դա անելու եղանակներից մեկի օրինակը:

Կազմաձևման գրանցման գործողություններ

Այս ամենը իրականացնելու համար մեզ պետք են մի քանի գործիքներ, որոնք ես դեռ չեմ ներկայացրել: Նրանք են:

բայտ կարդալԳրանցվել (գրանցվել)

անվավեր թարմացումԳրանցում (գրանցում, արժեք)

Սրանցից յուրաքանչյուրը գրադարանում ունի մի քանի ածանցյալ հրաման, որոնք որոշակի գործողությունների ծրագրակազմը մի փոքր ավելի պարզ են դարձնում:

PowerSaverPressureAndTemperature.ino- ի օրինակը օգտագործում է թիվ 3 մեթոդը: Կոդի տողը, որը կատարում է կրկնվող ստուգում, while (bmp0.readRegister (0xF3) >> 3); // հանգույց untl F3bit 3 == 0

Նշենք, որ այս ուրվագիծը ESP8266 միկրոկոնտրոլերի համար է: Ես օգտագործել եմ WeMos D1 mini pro: Էսքիզը չի աշխատի Atmega միկրոկառավարիչների հետ, որոնք քնելու համար տարբեր ցուցումներ ունեն: Այս ուրվագիծը կիրառում է մի քանի այլ հրամաններ, ուստի ես կներկայացնեմ բոլորը, նախքան այդ ուրվագիծը ավելի մանրամասն նկարագրելը:

Երբ միկրոկոնտրոլերը քնում է BMP280 սենսորին զուգահեռ, պահանջվող չափումների սենսորի կոնֆիգուրացիան կարող է կատարվել սկզբնական () հրամանում ՝ օգտագործելով 6 պարամետրը: Այնուամենայնիվ, եթե միկրոկառավարիչը քնած չէ, բայց սենսորը քնած է, ապա չափման պահին սենսորը պետք է արթնանա և հայտնվի չափման կազմաձևի մասին: Դա կարելի է անել ուղղակիորեն

թարմացումԳրանցում (կանոն, արժեք)

բայց մի փոքր ավելի հեշտ է հետևյալ երեք հրամաններով.

updateF2Control (osrs_h); // միայն BME280

updateF4Control (osrs_t, osrs_p, ռեժիմ); updateF5Config (t_sb, զտիչ, spi3W_en);

Չափման ավարտից հետո, եթե օգտագործված ռեժիմը Single shot (Հարկադիր ռեժիմ) է, ապա սարքն ինքնաբերաբար կվերադառնա քնի: Այնուամենայնիվ, եթե չափման հավաքածուն ներառում է շարունակական (նորմալ) ռեժիմի բազմաթիվ չափումներ, ապա BMP280- ը պետք է նորից քնել: Դա կարելի է անել հետևյալ երկու հրամաններից որևէ մեկի միջոցով.

updateF4Control16xSleep ();

updateF4ControlSleep (արժեք);

Այս երկուսն էլ ռեժիմի բիթերը սահմանում են 00 (այսինքն ՝ քնի ռեժիմ): Այնուամենայնիվ, առաջինը osrs_t և osrs_p- ը սահմանում է 111 (այսինքն ՝ 16 չափումներ), իսկ երկրորդը «արժեքից» ցածր 6 բիթերը պահում է 0xF4 գրանցամատյանի 7: 2 բիթերի մեջ:

Նմանապես, հետևյալ հայտարարությունը «արժեքի» ցածր վեց բիթ է պահում 0xF5 գրանցամատյանի 7: 2 բիթերում:

updateF5ConfigSleep (արժեք);

Այս վերջին հրամանների օգտագործումը հնարավորություն է տալիս 12 բիթ տեղեկատվություն պահել BMP280 գրանցամատյաններում F4 և F5: Առնվազն ESP8266- ի դեպքում, երբ միկրոկոնտրոլերը արթնանում է քունից հետո, այն սկսվում է էսքիզի սկզբից `առանց քնի հրամանին նախորդող իր վիճակի մասին տեղեկության: Մինչև քնելու հրամանը իր վիճակի մասին գիտելիքները պահելու համար տվյալները կարող են պահվել ֆլեշ հիշողության մեջ ՝ օգտագործելով EEPROM գործառույթները կամ SPIFFS- ի միջոցով ֆայլ գրելու միջոցով: Այնուամենայնիվ, ֆլեշ հիշողությունը ունի գրելու ցիկլերի քանակի սահմանափակում ՝ 10,000-ից մինչև 100,000: սահմանը մի քանի ամսվա ընթացքում: BMP280- ում տվյալների մի քանի բիթ պահելը նման սահմանափակում չունի:

F4 և F5 գրանցամատյաններում պահվող տվյալները կարող են վերականգնվել, երբ միկրոկոնտրոլերն արթնանում է ՝ օգտագործելով հրամանները

կարդալ F4Sleep ();

կարդալ F5Sleep ();

Այս գործառույթները կարդում են համապատասխան գրանցամատյանը, տեղափոխում բովանդակությունը `հեռացնելու 2 LSB- ները և վերադարձնելու մնացած 6 բիթերը: Այս գործառույթներն օգտագործվում են powerSaverPressureAndTemperatureESP.ino էսքիզների օրինակում հետևյալ կերպ.

// կարդալ EventCounter- ի արժեքը bmp0- ից

բայթ bmp0F4value = bmp0.readF4Sleep (); // 0 -ից 63 բայթ bmp0F5 արժեք = bmp0.readF5Sleep (); // 0 -ից 63 eventCounter = bmp0F5 արժեք*64+bmp0F4 արժեք; // 0 -ից 4095 -ը

Այս գործառույթները կարդում են համապատասխան գրանցամատյանը, տեղափոխում բովանդակությունը `հեռացնելու 2 LSB- ները և վերադարձնելու մնացած 6 բիթերը: Այս գործառույթներն օգտագործվում են powerSaverPressureAndTemperature.ino էսքիզների օրինակում հետևյալ կերպ.

// կարդալ EventCounter- ի արժեքը bmp1- ից

բայթ bmp1F4value = bmp1.readF4Sleep (); // 0 -ից 63 բայթ bmp1F5 արժեք = bmp1.readF5Sleep (); // 0 -ից 63 eventCounter = bmp1F5 արժեք*64+bmp1F4 արժեք; // 0 -ից 4095 -ը

Հում ջերմաստիճանի և ճնշման գործառույթներ

Հիմնական readTemperature, readPressure և readHumidity գործառույթներն ունեն երկու բաղադրիչ: Սկզբում 20-բիթանոց ջերմաստիճանի և ճնշման արժեքները ստացվում են BME/P280- ից, կամ հումքի 16-բիթանոց խոնավության արժեքը `BME280- ից: Այնուհետև փոխհատուցման ալգորիթմը օգտագործվում է ելքային արժեքներ առաջացնելու համար Celsius, hPa կամ %RH:

Գրադարանը ապահովում է այս բաղադրիչների առանձին գործառույթներ, որպեսզի հում ջերմաստիճանի, ճնշման և խոնավության տվյալները հնարավոր լինի ստանալ և գուցե ինչ -որ կերպ շահարկել: Այս հումքային արժեքներից ջերմաստիճանը, ճնշումը և խոնավությունը բխելու ալգորիթմը նույնպես նախատեսված է: Գրադարանում այս ալգորիթմներն իրականացվում են երկակի երկարությամբ լողացող կետերի թվաբանության միջոցով: Այն լավ է աշխատում ESP8266- ի վրա, որը 32-բիթանոց պրոցեսոր է և օգտագործում է 64 բիթ «կրկնակի» բոց փոփոխականների համար: Այս գործառույթները մատչելի դարձնելը կարող է օգտակար լինել այլ հարթակների համար հաշվարկը գնահատելու և, հնարավոր է, փոխելու համար:

Այս գործառույթներն են.

readRawPressure (rawTemperature); // կարդում է BME/P280readRawHumidity (BME/P280readRawHumidity) հումքի ճնշման և ջերմաստիճանի տվյալները (rawTemperature, rawPressure); // կարդում է հումքի խոնավության, ջերմաստիճանի և ճնշման տվյալները BME280 calcTemperature- ից (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (հում խոնավություն, t_fine)

Այս գործառույթների «t-fine» փաստարկը մի փոքր բացատրության է արժանի: Pressureնշման և խոնավության փոխհատուցման ալգորիթմները ներառում են ջերմաստիճանից կախված բաղադրիչ, որը ձեռք է բերվում t_fine փոփոխականի միջոցով: CalcTemperature ֆունկցիան արժեք է գրում t_fine- ում `հիմնված ջերմաստիճանի փոխհատուցման ալգորիթմի տրամաբանության վրա, որն այնուհետև օգտագործվում է որպես մուտքագրում և՛ calcPressure- ում, և՛ calcHumidity- ում:

Այս գործառույթների օգտագործման օրինակ կարելի է գտնել rawPressureAndTemperature.ino էսքիզի օրինակում, ինչպես նաև գրադարանի.cpp ֆայլում readHumidity () գործառույթի ծածկագրում:

Բարձրության և ծովի մակարդակի ճնշում

Մթնոլորտային ճնշման և բարձրության միջև հայտնի հարաբերություններ կան: Եղանակը նույնպես ազդում է ճնշման վրա: Երբ եղանակային կազմակերպությունները հրապարակում են մթնոլորտային ճնշման մասին տեղեկություններ, նրանք սովորաբար դրանք հարմարեցնում են բարձրության վրա, ուստի «սինոպտիկ գծապատկերում» ցուցադրվում են իզոբարներ (մշտական ճնշման գծեր), որոնք ստանդարտացված են ծովի մակարդակին: Այսպիսով, այս հարաբերություններում իրոք կան 3 արժեքներ, և դրանցից երկուսը իմանալը հնարավորություն է տալիս ստանալ երրորդը: 3 արժեքներն են.

  • ծովի մակարդակից բարձրություն
  • իրական բարձրությունը այդ բարձրության վրա
  • օդի համարժեք ճնշում ծովի մակարդակում (ավելի խիստ ՝ ծովի միջին մակարդակ, քանի որ ծովի ակնթարթային մակարդակը անընդհատ փոխվում է)

Այս գրադարանը ապահովում է այս գործառույթի երկու գործառույթ ՝ հետևյալը.

calcAltitude (ճնշում, ծովային LevelhPa);

նորմալ Նորմալ ճնշում (ճնշում, բարձրություն);

Կա նաև պարզեցված տարբերակ, որը ենթադրում է ծովի մակարդակի ստանդարտ ճնշում 1013,15 hPa:

calcAltitude (ճնշում); // ստանդարտ seaLevel Pressure ենթադրվում է

Քայլ 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 ms և 4000 ms) փոխարինվում են BME280- ում `10 ms և 20 ms կարճ ժամանակներով: BME280- ում քնի առավելագույն ժամանակը կազմում է 1000 ms:
  • BME280- ում ջերմաստիճանի և ճնշման հումքի արժեքները միշտ 20 բիթ են, եթե զտիչ կիրառվի: 16 -ից 19 բիթ արժեքների օգտագործումը սահմանափակվում է զտիչ չունեցող դեպքերում (այսինքն `զտիչ = 0):

Peratերմաստիճանը և ճնշումը յուրաքանչյուրն է 20 բիթանոց արժեքներ, որոնք պետք է փոխակերպվեն պայմանական ջերմաստիճանի և ճնշման ՝ բավականին բարդ ալգորիթմի միջոցով, օգտագործելով ջերմաստիճանի 3 16 բիթանոց կալիբրացիոն պարամետրեր, և 9 16 բիթանոց տրամաչափման պարամետրեր ՝ գումարած ճնշման ջերմաստիճանը: Temperatureերմաստիճանի չափման հատիկավորությունը 0.0003 աստիճան elsելսիուս է `նվազագույն էական փոփոխության համար (20 բիթ ընթերցում), 16 բիթ ընթերցման դեպքում ավելանալու է մինչև 0.0046 աստիճան:

Խոնավությունը 16 բիթանոց արժեք է, որը պետք է փոխակերպվի հարաբերական խոնավության մեկ այլ բարդ ալգորիթմի միջոցով ՝ օգտագործելով 6 տրամաչափման պարամետր, որոնք 8, 12 և 16 բիթերի խառնուրդ են:

Տվյալների թերթիկը ցույց է տալիս ջերմաստիճանի ընթերցման բացարձակ ճշգրտությունը ` +-0.5 C 25 C- ում և +-1 C 0-ից 65 C միջակայքում:

Pressureնշման չափման հատիկավորությունը 0.15 Պասկալ է (այսինքն `0.0015 հեկտոպասկալ) 20 բիթ լուծույթով, կամ 2.5 Պասկալ` 16 բիթ թույլատրությամբ: Հում ճնշման արժեքի վրա ազդում է ջերմաստիճանը, այնպես որ 25C- ի սահմաններում 1 աստիճանի C ջերմաստիճանի բարձրացումը նվազեցնում է չափված ճնշումը 24 պասկալով: Temperatureերմաստիճանի զգայունությունը հաշվառվում է ստուգաչափման ալգորիթմում, այնպես որ մատուցվող ճնշման արժեքները պետք է ճշգրիտ լինեն տարբեր ջերմաստիճաններում:

Տվյալների թերթիկը ցույց է տալիս ճնշման ընթերցման բացարձակ ճշգրտությունը ` +-1 hPa 0 ° C- ից մինչև 65 ° C ջերմաստիճանի դեպքում:

Խոնավության ճշգրտությունը տվյալների թերթիկում տրվում է որպես +-3% RH, և +-1% հիստերեզ:

Ինչպես է դա աշխատում

Byերմաստիճանի եւ ճնշման չափագրման տվյալների 24 բայթը, ինչպես նաեւ BME280- ի դեպքում խոնավության չափագրման տվյալների 8 բայթերը պետք է կարդալ սարքից եւ պահվել փոփոխականների մեջ: Այս տվյալները անհատապես ծրագրավորվում են գործարանում գտնվող սարքի մեջ, ուստի տարբեր սարքեր ունեն տարբեր արժեքներ `գոնե որոշ պարամետրերի դեպքում: BME/P280- ը կարող է լինել երկու վիճակներից մեկում: Մեկ վիճակում այն չափում է: Մյուս վիճակում այն սպասում է (քնում):

Որ վիճակում է այն կարելի է ստուգել ՝ նայելով 0xF3 գրանցամատյանի 3 -րդ բիթին:

Ամենավերջին չափման արդյունքները կարելի է ձեռք բերել ցանկացած պահի `համապատասխան տվյալների արժեքը կարդալով` անկախ սարքի քնած կամ չափիչ լինելուց:

Կան նաև BME/P280- ի շահագործման երկու եղանակ: Մեկը շարունակական ռեժիմն է (տվյալների թերթիկում կոչվում է նորմալ ռեժիմ), որը բազմիցս պտտվում է Չափման և Քնած վիճակների միջև: Այս ռեժիմում սարքը կատարում է մի շարք չափումներ, այնուհետև քնում է, այնուհետև արթնանում է չափումների մեկ այլ հավաքածուի համար և այլն: Անհատական չափումների քանակը և ցիկլի քնի հատվածի տևողությունը բոլորը կարող են վերահսկվել կազմաձևման գրանցամատյանների միջոցով:

BME/P280- ի շահագործման մյուս եղանակը Single Shot ռեժիմն է (տվյալների թերթիկում կոչվում է հարկադիր ռեժիմ): Այս ռեժիմում սարքը արթնանում է չափման հրամանով, այն կատարում է մի շարք չափումներ, այնուհետև նորից քնում: Հավաքածուի առանձին չափումների քանակը վերահսկվում է սարքը արթնացնող կազմաձևման հրամանում:

BMP280- ում, եթե կատարվում է մեկ չափում, արժեքի 16 ամենանշանակալից բիթերը լցված են, իսկ արժեքի ընթերցման չորս ամենաքիչ նշանակալի բիթերը `բոլորը զրո: Չափումների քանակը կարող է սահմանվել 1, 2, 4, 8 կամ 16, իսկ չափումների քանակի ավելացման հետ մեկտեղ ավելանում է տվյալներով բնակեցված բիթերի թիվը, այնպես որ 16 չափումներով բոլոր 20 բիթերը բնակեցված են չափման տվյալներով: Տվյալների թերթիկն այս գործընթացին վերաբերում է որպես գերբարձրացում:

BME280- ում նույն դասավորությունը գործում է այնքան ժամանակ, քանի դեռ արդյունքը չի զտվում: Եթե օգտագործվում է զտիչ, ապա արժեքները միշտ 20 բիթ են `անկախ այն բանից, թե յուրաքանչյուր չափման ցիկլում քանի չափումներ են կատարվում:

Յուրաքանչյուր անհատական չափում տևում է մոտ 2 միլիվայրկյան (տիպիկ արժեքը; առավելագույն արժեքը `2.3 ms): Սրան գումարած մոտ 2 ms (սովորաբար մի փոքր ավելի քիչ) ֆիքսված վերևը նշանակում է, որ չափման հաջորդականությունը, որը կարող է բաղկացած լինել 1 -ից 32 առանձին չափումներից, կարող է տևել 4 ms- ից մինչև 66 ms:

Տվյալների թերթիկը տրամադրում է տարբեր կիրառությունների համար ջերմաստիճանի և ճնշման գերբարձրացման առաջարկվող համակցություններ:

Կազմաձևման վերահսկման գրանցամատյաններ

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 բիթ զտիչ (տես ստորև); եւ
  • 1 բիթ spiw_en, որն ընտրում է SPI կամ I2C:

Theտիչի պարամետրը վերահսկում է մի տեսակ էքսպոնենցիալ քայքայման ալգորիթմ կամ կամ Infinite Impulse Response (IIR) ֆիլտր, որը կիրառվում է հում ճնշման և ջերմաստիճանի չափման արժեքների նկատմամբ (բայց ոչ խոնավության արժեքների): Հավասարումը տրված է տվյալների թերթիկում: Մեկ այլ ներկայացում է.

Արժեք (n) = Արժեք (n-1) * (K-1) / K + չափում (n) / K

որտեղ (n) ցույց է տալիս չափման և ելքի վերջին արժեքը. իսկ K- ը ֆիլտրի պարամետրն է: Filterտիչի պարամետրը K և կարող է սահմանվել 1, 2, 4, 8 կամ 16. Եթե K- ը 1 է, ապա հավասարումը պարզապես դառնում է Արժեք (n) = չափում (n): Theտիչի պարամետրի կոդավորումը հետևյալն է.

  • զտիչ = 000, K = 1
  • զտիչ = 001, K = 2
  • զտիչ = 010, K = 4
  • զտիչ = 011, K = 8
  • զտիչ = 1xx, K = 16

BME 280-ը ավելացնում է լրացուցիչ կազմաձևման հսկիչ գրանցամատյան 0xF2 հասցեով ՝ «ctrl_hum» ՝ մեկ 3 բիթանոց osrs_h պարամետրով (չափել խոնավությունը 0, 1, 2, 4, 8 կամ 16 անգամ):

Քայլ 4: Չափման և ընթերցման ժամանակը

Ես պլանավորում եմ ավելացնել սա ավելի ուշ ՝ ցույց տալով հրամանների և չափման պատասխանների ժամանակը:

Iddt - ընթացիկ ջերմաստիճանի չափման ժամանակ: Տիպիկ արժեքը 325 uA

Iddp - ընթացիկ ճնշման չափման ժամանակ: Բնորոշ արժեքը ՝ 720 uA, առավելագույնը ՝ 1120 uA

Iddsb - ընթացիկ սպասման ռեժիմում: Տիպիկ արժեքը 0.2 uA, առավելագույնը 0.5 uA

Iddsl - ընթացիկ քնի ռեժիմում: Տիպիկ արժեքը 0.1 uA, առավելագույնը 0.3 uA

Քայլ 5: Softwareրագրային ապահովման ուղեցույցներ

Softwareրագրային ապահովման ուղեցույցներ
Softwareրագրային ապահովման ուղեցույցներ
Softwareրագրային ապահովման ուղեցույցներ
Softwareրագրային ապահովման ուղեցույցներ

I2C պայթյունի ռեժիմ

BMP280 տվյալների թերթիկը տալիս է ուղեցույց տվյալների ընթերցման վերաբերյալ (բաժին 3.9): Այն ասում է, որ «խստորեն խորհուրդ է տրվում օգտագործել պոռթկուն ընթերցում և ոչ թե առանձին անդրադառնալ յուրաքանչյուր գրանցամատյանին: Դա կկանխի տարբեր չափումների պատկանող բայթերի հավանական խառնուրդը և կնվազեցնի ինտերֆեյսի երթևեկությունը»: Ոչ մի ուղեցույց չի տրվում փոխհատուցման/չափաբերման պարամետրերի ընթերցման վերաբերյալ: Ենթադրաբար, դրանք խնդիր չեն, քանի որ դրանք ստատիկ են և չեն փոխվում:

Այս գրադարանը կարդում է բոլոր հարակից արժեքները մեկ ընթերցման գործողության մեջ `24 բայթ` ջերմաստիճանի և ճնշման փոխհատուցման պարամետրերի դեպքում, 6 բայթ `համակցված ջերմաստիճանի և ճնշման համար, և 8 բայթ` խոնավության, ջերմաստիճանի և ճնշման համար: Երբ միայն ջերմաստիճանը ստուգվում է, ընթերցվում է ընդամենը 3 բայթ:

Մակրոների օգտագործում (#սահմանել և այլն)

Այս գրադարանում այլ մակրոներ չկան, բացի սովորական գրադարանի «ներառել պահակ» մակրոից, որը կանխում է կրկնությունները:

Բոլոր հաստատունները սահմանվում են const հիմնաբառի միջոցով, իսկ վրիպազերծման տպագրությունը վերահսկվում է ստանդարտ C գործառույթներով:

Դա ինձ համար որոշակի անորոշության աղբյուր էր, բայց այս թեմայի վերաբերյալ բազմաթիվ գրառումներ կարդալուց խորհուրդ եմ տալիս, որ #deine- ի օգտագործումը հաստատունների (առնվազն) և (հավանաբար) վրիպազերծման տպագրման հսկողության համար ավելորդ և անցանկալի է:

Const- ի և ոչ #սահմանման օգտագործման դեպքը բավականին պարզ է. Const- ն օգտագործում է նույն ռեսուրսները, ինչ #define (այսինքն `զրո), և արդյունքում ստացված արժեքները հետևում են շրջանակի կանոններին` դրանով իսկ նվազեցնելով սխալների հավանականությունը:

Վրիպազերծման տպագրության վերահսկման գործը մի փոքր ավելի պարզ է, քանի որ այն, ինչ ես արել եմ, նշանակում է, որ վերջնական ծածկագիրը պարունակում է վրիպազերծման տպագրության հայտարարությունների տրամաբանություն, չնայած դրանք երբեք չեն կիրառվում: Եթե գրադարանը պետք է օգտագործվի շատ սահմանափակ հիշողություն ունեցող միկրոկառավարիչի մեծ նախագծում, դա կարող է խնդիր դառնալ: Քանի որ իմ զարգացումը ESP8266- ի վրա էր `մեծ ֆլեշ հիշողությամբ, սա ինձ համար խնդիր չէր թվում:

Քայլ 6: Temերմաստիճանի կատարում

Ես նախատեսում եմ սա ավելացնել ավելի ուշ:

Քայլ 7: ureնշման կատարում

Ես նախատեսում եմ սա ավելացնել ավելի ուշ:

Խորհուրդ ենք տալիս: