Talaan ng mga Nilalaman:

Library para sa BMP280 at BME280: 7 Mga Hakbang
Library para sa BMP280 at BME280: 7 Mga Hakbang

Video: Library para sa BMP280 at BME280: 7 Mga Hakbang

Video: Library para sa BMP280 at BME280: 7 Mga Hakbang
Video: Arduino Nano, BME280 and SSD1306 OLED Weather Station 2024, Hulyo
Anonim
Library para sa BMP280 at BME280
Library para sa BMP280 at BME280
Library para sa BMP280 at BME280
Library para sa BMP280 at BME280
Library para sa BMP280 at BME280
Library para sa BMP280 at BME280

Panimula

Hindi ako nagtakda upang isulat ang aklatan na ito. Ito ay "nangyari" bilang isang epekto-ng isang proyekto na sinimulan ko na gumagamit ng isang BMP280. Ang proyektong iyon ay hindi pa tapos, ngunit sa palagay ko handa na ang library na ibahagi sa iba. Kasunod ay kailangan kong gumamit ng isang BME280, na nagdaragdag ng pagsukat ng kahalumigmigan sa presyon at kakayahan sa temperatura ng BMP280. Ang BME280 ay "pabalik-tugma" sa BMP280 - iyon ay, ang lahat ng rehistro at mga hakbang na kinakailangan upang mabasa ang presyon at temperatura mula sa BME280 ay kapareho ng ginagamit para sa BMP280. Mayroong mga karagdagang pagrehistro at mga hakbang na kinakailangan upang mabasa ang halumigmig, nalalapat lamang sa BME280. Itinaas nito ang tanong, isang silid-aklatan para sa pareho, o dalawang magkakahiwalay na aklatan. Ang hardware para sa dalawang uri ng aparato ay ganap na napapalitan. Kahit na ang marami sa mga module na ibinebenta (halimbawa sa Ebay at AliExpress) ay may label na BME / P280. Upang malaman kung aling uri ito, kailangan mong tingnan ang (miniscule) na pagsusulat sa mismong sensor, o subukan ang byte ng aparato ID. Nagpasya akong pumunta para sa isang solong aklatan. Mukhang nag-OK ito.

Ang feedback, lalo na ang anumang mga mungkahi para sa pagpapabuti, ay pahalagahan.

Mga tampok at kakayahan sa library

Ang isang silid-aklatan ay isang piraso ng software na nagbibigay ng isang Application Programming Interface (API) para sa isang programmer na gamitin ang mga kakayahan ng aparato, nang hindi kinakailangang harapin ang lahat ng mga detalyeng pinong butil. Ninanais, ang API ay dapat na madali para sa isang nagsisimula na may simpleng mga kinakailangan upang makapagsimula, habang nagbibigay ng buong pagsasamantala sa mga kakayahan ng aparato. Ninanais na dapat sundin ng library ang anumang tukoy na mga alituntunin mula sa tagagawa ng aparato, pati na rin ang pangkalahatang mahusay na kasanayan sa software. Pinagsikapan kong makamit ang lahat ng ito. Kapag nagsisimula sa BMP280, nahanap ko ang 3 magkakaibang mga silid-aklatan para dito: Adafruit_BMP280; Nakita_BMP280; at isa na tinatawag na BMP280 mula sa tagagawa ng aparato. Ang alinman sa Adafruit o Seeed ay nagbigay ng pinalawig na mga kakayahan, kahit na gumana sila ng maayos at madaling gamitin para sa pangunahing mga application. Hindi ko mawari kung paano namin gagamitin ang ginawa ng tagagawa ng aparato (Bosch Sensortec). Maaaring ito ang aking kakulangan, kaysa sa kanila. Subalit ang silid-aklatan ay mas kumplikado kaysa sa iba pang dalawa, hindi ako makahanap ng anumang mga tagubilin o halimbawa ng paggamit (Sumunod na natagpuan ko ang mga halimbawa ay nasa file na "bmp280_support.c", subalit hindi ito partikular na nakakatulong sa akin).

Bilang isang resulta ng mga kadahilanang ito, nagpasya akong magsulat ng aking sariling silid-aklatan para sa BMP280.

Sa pagtingin sa sitwasyon ng silid-aklatan para sa BME280, nakakita ako ng magkakahiwalay na mga aklatan na Adafruit_BME280, Seed_BME280 at isa pang isang BME280_MOD-1022 na isinulat ng Embedded Adventures. Wala sa kanila ang nagsama ng mga pagpapaandar para sa BMP280 sa isang silid-aklatan na may kakayahang gamitin ang BME280. Wala sa kanila ang malinaw na sumusuporta sa kakayahan ng mga aparato upang mag-imbak ng ilang mga piraso ng data habang natutulog ang aparato at ang pagkontrol nito microprocessor (ang kakayahang ito ay maliwanag sa datasheet at sinusuportahan sa silid-aklatan na aking isinulat at inilarawan dito).

Ang isang pinagsamang library ay dapat magkaroon ng suporta para sa lahat ng mga kakayahan ng BME280, ngunit kapag ginamit sa isang BMP280 hindi ito dapat magpataw ng anumang overhead mula sa mga hindi nagamit na function. Ang mga benepisyo ng isang pinagsamang library ay nagsasama ng mas kaunting mga file ng library upang pamahalaan, madaling paghalo at tugma ng iba't ibang mga aparato sa parehong proyekto, at pinasimple na mga pagbabago para sa pagpapanatili o mga pag-upgrade na kailangang gawin sa isang lugar kaysa sa dalawa. Marahil ang lahat ay medyo menor de edad, kahit hindi gaanong mahalaga, ngunit …

Mga kakayahan sa aparato

Ang BMP280 at BME280 ay mga aparatong pang-ibabaw na tungkol sa 5mm square at 1 mm ang taas. Mayroong 8 mga interface pad, kabilang ang 2 magkakahiwalay na mga pad ng input ng kuryente at dalawang mga pad ng Ground. Magagamit ang mga ito sa eBay bilang isang module na may alinman sa 4 o 6 na mga pin na inilabas. Ang module na 4-pin ay may isang nakapirming I2C address at hindi mai-configure upang magamit ang SPI protocol.

Ang module na 6-pin o ang hubad na aparato ay maaaring magamit sa alinman sa I2C o SPI na mga protocol. Sa I2C mode maaari itong magkaroon ng dalawang magkakaibang mga address, na nakamit sa pamamagitan ng pagkonekta sa SDO pin alinman sa Ground (para sa base address = 0x76) o sa Vdd (para sa base address na +1 = 0x77). Sa mode na SPI mayroon itong karaniwang pag-aayos ng 1 orasan, 2 data (isa para sa bawat direksyon) at isang pin na pumili ng aparato (CS).

Sinusuportahan lamang ng library na aking isinulat at inilalarawan dito ang I2C. Ang Adafruit_BMP280 at ang mga aklatan ng BME_MOD-1022 ay may suporta para sa parehong i2C at SPI.

Maaaring mai-download ang silid aklatan dito:

github.com/farmerkeith/BMP280-library

Hakbang 1: Pag-set up ng Hardware

Pag-set up ng Hardware
Pag-set up ng Hardware

Bago maging kapaki-pakinabang ang silid-aklatan kinakailangan upang ikonekta ang isang microcontroller sa BMP280 (o sa dalawa sa kanila kung nais mo).

Gumamit ako ng isang WeMos D1 mini pro, kaya ipapakita ko ang mga koneksyon nito. Ang iba pang mga microcontroller ay magkatulad, kailangan mo lamang makuha ang koneksyon nang tama ang mga SDA at SCL na pin.

Sa kaso ng WeMos D1 mini pro, ang mga koneksyon ay:

Ang pagpapaandar WeMos pin BMP280 pin Mga Tala

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Address control SDO Ground o Vdd I2C piliin ang CSB Vdd (pipiliin ng GND ang SPI)

Tandaan na ang SDO pin sa ilan sa mga module ng MP280 ay may label na SDD, at ang Vdd pin ay maaaring may label na VCC. Tandaan: Ang mga linya ng SDA at SCL ay dapat na may mga pull-up resistors sa pagitan ng linya at ng Vin pin. Karaniwan ang isang halagang 4.7K ay dapat maging OK. Ang ilang mga modyul ng BMP280 at BME280 ay may 10K pull-up resistors na kasama sa module (na hindi magandang kasanayan, dahil ang paglalagay ng maraming mga aparato sa I2C bus ay maaaring labis na mai-load ito). Gayunpaman ang paggamit ng 2 BME / P280 modules bawat isa na may isang resistor na 10K ay hindi dapat maging isang problema sa pagsasanay hangga't walang masyadong maraming iba pang mga aparato sa parehong bus na may mga pull-up resistors din.

Kapag nakakonekta na ang hardware, madali mong masuri kung ang iyong aparato ay isang BMP280 o isang BME280 sa pamamagitan ng pagpapatakbo ng sketch I2CScan_ID na maaari mong makita dito:

Maaari mo ring suriin kung mayroon kang isang BMP280 o BME280 sa pamamagitan ng pagtingin sa aparato mismo. Natagpuan ko na kinakailangan na gumamit ng isang digital microscope upang gawin ito, ngunit kung ang iyong paningin ay napakahusay maaari mo itong gawin nang walang anumang mga tulong. Mayroong dalawang linya ng pag-print sa pambalot ng aparato. Ang susi ay ang unang titik sa pangalawang linya, na sa kaso ng mga aparato ng BMP280 ay isang "K" at sa kaso ng mga aparato ng BME280 ay isang "U".

Hakbang 2: Ang Mga API Na Ibinigay ng Library

Mga API Na Ibinigay ng Library
Mga API Na Ibinigay ng Library
Mga API Na Ibinigay ng Library
Mga API Na Ibinigay ng Library

Kasama ang library sa isang sketch

Ang library ay kasama sa isang sketch sa karaniwang paraan gamit ang pahayag

# isama ang "farmkeith_BMP280.h"

Ang pahayag na ito ay kailangang isama sa maagang bahagi ng sketch bago ang pagsisimula ng pag-andar ng pag-setup ().

Lumilikha ng isang object ng BME o BMP software

Mayroong 3 mga antas para sa paglikha ng object ng software ng BMP280. Ang pinakasimpleng ay makatarungan

bme280 objectName; o bmp280 objectName;

halimbawa, BMP280 bmp0;

Lumilikha ito ng isang object ng software na may default na address ng 0x76 (ie para sa SDO na konektado sa ground).

Ang susunod na antas para sa paglikha ng isang BME280 o BMP280 software object ay may isang parameter ng alinman sa 0 o 1, tulad ng sumusunod:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Ang parameter (0 o 1) ay idinagdag sa I2C base address, upang ang dalawang mga aparato ng BME280 o BMP280 ay maaaring magamit sa parehong I2C bus (kasama ang isa sa bawat isa).

Ang pangatlong antas para sa paglikha ng isang BME o BMP280 software object ay may dalawang mga parameter. Ang unang parameter, na alinman sa 0 o 1, ay para sa address, tulad ng para sa naunang kaso. Kinokontrol ng pangalawang parameter ang pag-print ng debug. Kung nakatakda ito sa 1, ang bawat transaksyon na may object ng software ay nagreresulta sa Serial.print output na nagbibigay-daan sa programmer na makita ang mga detalye ng transaksyon. Halimbawa:

bmp280 objectNameB (1, 1);

Kung ang parameter ng pag-print ng debug ay nakatakda sa 0, ang object ng software ay babalik sa normal na pag-uugali (walang pag-print).

Ang pahayag o pahayag na ito ay kailangang isama pagkatapos ng # isama at bago ang pag-set up () na pag-andar.

Inisyal ang object ng BME o BMP software

Bago magamit, kinakailangang basahin ang mga parameter ng pagkakalibrate mula sa aparato, at i-configure ito para sa anumang mode ng pagsukat, labis na pag-sobra, at mga setting ng filter na naaangkop.

Para sa isang simple, pangkalahatang layunin sa pagsisimula, ang pahayag ay:

objectName.begin ();

Ang bersyon na ito ng pagsisimula () ay nagbabasa ng mga parameter ng pagkakalibrate mula sa aparato at nagtatakda ng osrs_t = 7 (16 mga sukat ng temperatura), osrs_p = 7 (16 mga sukat ng presyon), mode = 3 (tuloy-tuloy, Normal), t_sb = 0 (0.5 ms natutulog sa pagitan ng mga hanay ng pagsukat), filter = 0 (K = 1, kaya walang pagsala) at spiw_en = 0 (hindi pinagana ang SPI, kaya't gamitin ang I2C). Sa kaso ng BME280, mayroong isang labis na parameter osrs_h = 7 para sa 16 na sukat ng kahalumigmigan.

Mayroong isa pang bersyon ng pagsisimula () na tumatagal ng lahat ng anim (o 7) na mga parameter. Ang katumbas ng pahayag sa itaas ay

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en

o objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

Ang buong listahan ng mga code at ang kanilang mga kahulugan ay nasa data sheet ng BME280 at BMP280, at pati na rin sa mga komento sa.cpp file sa library.

Simpleng pagsukat ng temperatura at presyon

Upang makakuha ng pagsukat ng temperatura ang pinakasimpleng paraan

dobleng temperatura = objectName.readTemperature (); // sukatin ang temperatura

Upang makakuha ng pagsukat ng presyon ng pinakasimpleng paraan

double pressure = objectName.readPressure (); // sukatin ang presyon

Upang makakuha ng isang pagsukat sa kahalumigmigan ang pinakasimpleng paraan

dobleng kahalumigmigan = objectName.readHumidity (); // sukatin ang kahalumigmigan (BME280 lamang)

Upang makuha ang parehong temperatura at presyon sa itaas ng dalawang mga pahayag ay maaaring magamit nang sunud-sunod, ngunit may isa pang pagpipilian, na kung saan ay:

dobleng temperatura;

double pressure = objectName.readPressure (temperatura); // sukatin ang presyon at temperatura

Binabasa ng pahayag na ito ang data mula sa aparato ng BME280 o BMP280 nang isang beses lamang, at binabalik ang parehong temperatura at presyon. Ito ay bahagyang mas mahusay na paggamit ng I2C bus at tinitiyak na ang dalawang pagbasa ay tumutugma sa parehong siklo ng pagsukat.

Para sa BME 280, isang pinagsamang pahayag na nakakakuha ng lahat ng tatlong mga halaga (halumigmig, temperatura at presyon) ay:

dobleng temperatura, presyon; dobleng kahalumigmigan = objectName.readHumidity (temperatura, presyon); // sukatin ang kahalumigmigan, presyon at temperatura

Binabasa ng pahayag na ito ang data mula sa aparato ng BMP280 nang isang beses lamang, at ibinabalik ang lahat ng tatlong mga halaga. Ito ay bahagyang mas mahusay na paggamit ng I2C bus at tinitiyak na ang tatlong pagbasa ay tumutugma sa parehong siklo ng pagsukat. Tandaan na ang mga pangalan ng mga variable ay maaaring mabago sa anumang gusto ng gumagamit, ngunit naayos ang kanilang order - nauuna ang temperatura, at pangalawa ang presyon.

Ang mga kaso ng paggamit na ito ay sakop sa mga halimbawa ng mga sketch na ibinigay sa library, na pangunahingTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino at basicHumidityAndTemperatureAndPressure.ino.

Mas sopistikadong pagsukat ng temperatura at presyon

Bagaman gagana ang serye ng mga pahayag sa itaas nang walang mga problema, mayroong ilang mga isyu:

  1. ang aparato ay patuloy na tumatakbo, at samakatuwid ay gumagamit ng lakas sa maximum na antas nito. Kung ang enerhiya ay nagmumula sa isang baterya, maaaring kinakailangan na bawasan ito.
  2. dahil sa natupok na kuryente, makakaranas ang aparato ng pag-init, at samakatuwid ang nasusukat na temperatura ay magiging mas mataas kaysa sa temperatura ng paligid. Mas saklawin ko ito sa susunod na hakbang.

Ang isang resulta na gumagamit ng mas kaunting lakas, at nagbibigay ng isang temperatura na mas malapit sa paligid, ay maaaring makuha sa pamamagitan ng paggamit ng pagsisimula () na may mga parameter na natutulog (hal mode = 0). Halimbawa:

objectName.begin (1, 1, 0, 0, 0, 0 [, 1]); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en [, osrs_h]

Pagkatapos, kapag nais ang isang pagsukat, gisingin ang aparato na may isang utos ng pagsasaayos upang magrehistro ng F2 (kung kinakailangan) at F4 na nagtatakda ng naaangkop na mga halaga ng osrs_h, osrs_t at osrs_p, plus mode = 1 (solong shot mode). Halimbawa:

[objectName.updateF2Control (1);] // osrs_h - hindi na kailangan para sa BMP280, // at hindi kinakailangan para sa BME280 kung ang Bilang ng mga sukat ay hindi binabago // mula sa halagang ibinigay sa simula (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Ang pagkakaroon ng paggising sa aparato, magsisimula ito sa pagsukat, ngunit ang resulta ay hindi magagamit para sa ilang mga milliseconds - hindi bababa sa 4 ms, marahil hanggang sa 70 ms o higit pa, depende sa bilang ng mga pagsukat na tinukoy. Kung ang nabasa na utos ay ipinadala kaagad, ibabalik ng aparato ang mga halaga mula sa nakaraang pagsukat - na maaaring katanggap-tanggap sa ilang mga application, ngunit sa karamihan ng mga kaso marahil mas mahusay na mag-antala hanggang magamit ang bagong pagsukat.

Ang pagkaantala na ito ay maaaring gawin sa maraming paraan.

  1. maghintay ng isang nakapirming dami ng oras upang masakop ang pinakahihintay na pagkaantala
  2. maghintay ng isang dami ng oras na kinakalkula mula sa maximum na oras ng pagsukat sa bawat pagsukat (ie 2.3ms) na beses sa bilang ng mga sukat, kasama ang overhead, kasama ang isang margin.
  3. maghintay ng isang mas maikling dami ng oras na kinakalkula tulad ng nasa itaas, ngunit gamit ang nominal na oras ng pagsukat (ie 2 ms) kasama ang overhead, at pagkatapos ay simulang suriin ang "Sinusukat ko" na bit sa rehistro ng katayuan. Kapag ang katayuan ay nagbabasa ng 0 (ibig sabihin, hindi pagsukat), kunin ang mga pagbabasa ng temperatura at presyon.
  4. agad na simulan ang pagsuri sa rehistro ng katayuan, at kunin ang mga pagbabasa ng temperatura at presyon kapag binasa ng katayuan ang 0,

Magpapakita ako ng isang halimbawa ng isang paraan ng paggawa nito nang kaunti sa paglaon.

Mga pagpapatakbo ng rehistro ng pag-configure

Upang maganap ang lahat ng ito, kailangan namin ng maraming mga tool na hindi ko pa ipinakikilala. Sila ay:

byte readRegister (reg)

walang bisa ang updateRegister (reg, halaga)

Ang bawat isa sa mga ito ay may maraming nagmula na mga utos sa library, na ginagawang mas simple ang software para sa mga partikular na aksyon.

Ang halimbawa ng powerSaverPressureAndTemperature.ino ay gumagamit ng pamamaraan No. 3. Ang linya ng code na ginagawa ang paulit-ulit na pag-check ay

habang (bmp0.readRegister (0xF3) >> 3); // loop untl F3bit 3 == 0

Tandaan na ang sketch na ito ay para sa isang microcontroller ng ESP8266. Gumamit ako ng isang WeMos D1 mini pro. Hindi gagana ang sketch sa mga Atmega microcontroller, na may iba't ibang mga tagubilin para sa pagtulog. Ang sketch na ito ay nagsasanay ng maraming iba pang mga utos, kaya't ipapakilala ko ang lahat sa kanila bago ilarawan ang sketch na iyon nang mas detalyado.

Kapag ang microcontoller ay natutulog kahanay sa sensor ng BMP280, ang pagsasaayos ng sensor para sa mga kinakailangang pagsukat ay maaaring gawin sa pagsisimula ng () utos, gamit ang 6 na mga parameter. Gayunpaman kung ang microcontroller ay hindi natutulog, ngunit ang sensor ay, pagkatapos ay sa oras ng pagsukat ang sensor ay dapat gisingin at sinabi sa pagsasaayos ng pagsukat nito. Maaari itong gawin nang direkta sa

updateRegister (reg, halaga)

ngunit medyo madali sa mga sumusunod na tatlong mga utos:

updateF2Control (osrs_h); // BME280 lamang

updateF4Control (osrs_t, osrs_p, mode); updateF5Config (t_sb, filter, spi3W_en);

Matapos ang pagsukat ay tapos na, kung ang ginamit na mode ay Single shot (Forced mode), pagkatapos ay awtomatiko na matulog ang aparato. Gayunpaman, kung ang sukat ng pagsukat ay nagsasangkot ng maraming mga pagsukat gamit ang tuluy-tuloy (Normal) na mode kung gayon ang BMP280 ay kailangang ibalik sa pagtulog. Maaari itong magawa sa alinman sa dalawang sumusunod na utos:

updateF4Control16xS Sleep ();

updateF4ControlS Sleep (halaga);

Parehong itinatakda ang mga mode bit sa 00 (ie mode ng pagtulog). Gayunpaman ang unang nagtatakda ng osrs_t at osrs_p sa 111 (ibig sabihin 16 pagsukat) habang ang pangalawa ay nag-iimbak ng mababang 6 na piraso mula sa "halaga" sa mga piraso 7: 2 ng 0xF4 na rehistro.

Gayundin ang sumusunod na pahayag ay nag-iimbak ng mababang anim na piraso ng "halaga" sa mga piraso 7: 2 ng 0xF5 na rehistro.

updateF5ConfigS Sleep (halaga);

Ang paggamit ng mga huling utos na ito ay nagbibigay-daan sa pag-iimbak ng 12 piraso ng impormasyon sa rehistro ng BMP280 na F4 at F5. Hindi bababa sa kaso ng ESP8266, kapag ang microcontroller ay nagising pagkatapos ng isang panahon ng pagtulog, nagsisimula ito sa simula ng sketch na walang kaalaman sa estado nito bago ang utos ng pagtulog. Upang maiimbak ang kaalaman sa estado nito bago ang utos ng pagtulog, ang data ay maaaring itago sa memorya ng flash, gamit ang alinman sa mga pagpapaandar ng EEPROM o sa pamamagitan ng pagsulat ng isang file gamit ang SPIFFS. Gayunpaman ang flash memory ay may isang limitasyon ng bilang ng mga cycle ng pagsulat, ng pagkakasunud-sunod ng 10, 000 hanggang 100, 000. Nangangahulugan ito na kung ang microcontroller ay dumadaan sa isang cycle ng pagtulog bawat ilang segundo, maaari itong lumampas sa pinapayagan na isulat ng memorya limitahan sa ilang buwan. Ang pag-iimbak ng ilang mga piraso ng data sa BMP280 ay walang tulad limitasyon.

Maaaring makuha ang data na nakaimbak sa mga rehistro ng F4 at F5 kapag nagising ang microcontroller gamit ang mga utos

basahinF4Makatulog ();

basahinF5Makatulog ();

Ang mga pagpapaandar na ito ay basahin ang kaukulang rehistro, ilipat ang mga nilalaman upang alisin ang 2 LSBs at ibalik ang natitirang 6 na piraso. Ang mga pagpapaandar na ito ay ginagamit sa halimbawa ng sketch powerSaverPressureAndTemperatureESP.ino tulad ng sumusunod:

// basahin ang halaga ng EventCounter pabalik mula bmp0

byte bmp0F4value = bmp0.readF4S Sleep (); // 0 to 63 byte bmp0F5value = bmp0.readF5S Sleep (); // 0 to 63 eventCounter = bmp0F5value * 64 + bmp0F4value; // 0 hanggang 4095

Ang mga pagpapaandar na ito ay basahin ang kaukulang rehistro, ilipat ang mga nilalaman upang alisin ang 2 LSBs at ibalik ang natitirang 6 na piraso. Ang mga pagpapaandar na ito ay ginagamit sa halimbawa ng sketch powerSaverPressureAndTemperature.ino tulad ng sumusunod:

// basahin ang halaga ng EventCounter pabalik mula bmp1

byte bmp1F4value = bmp1.readF4S Sleep (); // 0 to 63 byte bmp1F5value = bmp1.readF5S Sleep (); // 0 to 63 eventCounter = bmp1F5value * 64 + bmp1F4value; // 0 hanggang 4095

Mga paggana ng hilaw na temperatura at presyon

Ang pangunahing readTemperature, readPressure at readHumidity function ay may dalawang bahagi. Una ang hilaw na 20-bit na temperatura at mga halaga ng presyon ay nakuha mula sa BME / P280, o ang hilaw na 16-bit na halumigmig na halaga ay nakuha mula sa BME280. Pagkatapos ang algorithm ng kabayaran ay ginagamit upang makabuo ng mga halaga ng output sa degree Celsius, hPa o% RH.

Nagbibigay ang library ng magkakahiwalay na mga pag-andar para sa mga sangkap na ito, upang ang data ng hilaw na temperatura, presyur at kahalumigmigan ay maaaring makuha, at marahil ay manipulahin sa ilang paraan. Ang algorithm upang makuha ang temperatura, presyon at halumigmig mula sa mga hilaw na halagang ito ay ibinigay din. Sa silid-aklatan ang mga algorithm na ito ay ipinatupad gamit ang dobleng haba na lumulutang point na arithmetic. Gumagana ito nang maayos sa ESP8266 na isang 32-bit na processor at gumagamit ng 64 bits para sa "doble" na mga variable ng float. Ang paggawa ng mga pag-andar na ito na ma-access ay maaaring maging kapaki-pakinabang para sa pagtatasa at posibleng baguhin ang pagkalkula para sa iba pang mga platform.

Ang mga pagpapaandar na ito ay:

readRawPressure (rawTemperature); // nagbabasa ng data ng hilaw na presyon at temperatura mula sa BME / P280readRawHumidity (rawTemperature, rawPressure); // nagbabasa ng raw na kahalumigmigan, temperatura at data ng presyon mula sa BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Ang "t-fine" na argument sa mga pagpapaandar na ito ay nagkakahalaga ng kaunting paliwanag. Ang parehong mga algorithm ng pressure at halumigmig na kabayaran ay nagsasama ng isang sangkap na umaasa sa temperatura na nakamit sa pamamagitan ng variable na t_fine. Ang pagpapaandar ng calcTemperature ay nagsusulat ng isang halaga sa t_fine batay sa temperatura sa algorithm ng algorithm sa kompensasyon, na kung saan ay ginagamit bilang isang input sa parehong calculPressure at calcHumidity.

Ang isang halimbawa ng paggamit ng mga pagpapaandar na ito ay matatagpuan sa halimbawa ng sketch na rawPressureAndTemperature.ino, at din sa code para sa readHumidity () na pag-andar sa.cpp file ng library.

Altitude at presyon ng Antas ng Dagat

Mayroong isang kilalang ugnayan sa pagitan ng presyon ng atmospheric at altitude. Naaapektuhan din ng panahon ang presyon. Kapag ang mga samahan ng panahon ay naglathala ng impormasyon sa presyon ng atmospera, karaniwang inaayos nila ito para sa taas at sa gayon ang "tsart na synoptic" ay nagpapakita ng mga isobar (mga linya ng patuloy na presyon) na na-standardize na nangangahulugang antas ng dagat. Kaya't talagang mayroong 3 mga halaga sa ugnayan na ito, at ang pag-alam sa dalawa sa mga ito ay nagbibigay-daan sa paghuhukay ng pangatlo. Ang 3 halaga ay:

  • taas sa antas ng dagat
  • aktwal na presyon ng hangin sa altitude na iyon
  • katumbas na presyon ng hangin sa antas ng dagat (mas mahigpit, nangangahulugang antas ng dagat, dahil patuloy na nagbabago ang antas ng dagat)

Nagbibigay ang library na ito ng dalawang pagpapaandar para sa ugnayan na ito, tulad ng sumusunod:

calculAltitude (presyon, seaLevelhPa);

CalNormalisedPressure (presyon, altitude);

Mayroon ding isang pinasimple na bersyon, na ipinapalagay ang karaniwang presyon ng antas ng dagat na 1013.15 hPa.

calcAltitude (presyon); // ipinapalagay na karaniwang seaLevelPressure

Hakbang 3: Mga Detalye ng BMP280 Device

Mga Detalye ng Device ng BMP280
Mga Detalye ng Device ng BMP280

Mga kakayahan sa hardware

Ang BMP280 ay may 2 bytes ng data ng pagsasaayos (sa rehistro address 0xF4 at 0xF5) na ginagamit upang makontrol ang maraming mga pagpipilian sa pagsukat at output ng data. Nagbibigay din ito ng 2 piraso ng impormasyon ng katayuan, at 24 bytes ng mga parameter ng pagkakalibrate na ginagamit sa pag-convert ng hilaw na temperatura at mga halaga ng presyon sa maginoo na mga yunit ng temperatura at presyon. Ang BME280 ay may karagdagang data tulad ng sumusunod:

  • 1 dagdag na byte ng data ng pagsasaayos sa rehistro ng address na 0xF2 na ginagamit upang makontrol ang maraming pagsukat ng kahalumigmigan;
  • 8 sobrang mga byte ng mga parameter ng pagkakalibrate na ginamit sa pag-convert ng raw na halagang halumigmig sa porsyento ng kamag-anak na kahalumigmigan.

Ang temperatura, presyon at rehistro ng katayuan para sa BME280 ay kapareho ng para sa BMP280 na may mga menor de edad na pagbubukod tulad ng sumusunod:

  • ang mga "ID" na piraso ng BME280 ay nakatakda sa 0x60, kaya maaari itong makilala mula sa BMP280 na maaaring 0x56, 0x57 o 0x58
  • ang control time ng pagtulog (t_sb) ay binago upang ang dalawang mahabang oras sa BMP280 (2000 ms at 4000 ms) ay pinalitan sa BME280 na may maikling oras ng 10 ms at 20 ms. Ang maximum na oras ng pagtulog sa BME280 ay 1000 ms.
  • Sa BME280 ang temperatura at presyon ng hilaw na halaga ay palaging 20 bits kung ang pag-filter ay inilapat. Ang paggamit ng 16 hanggang 19 na halaga ay limitado sa mga kaso na walang pagsala (ie filter = 0).

Ang temperatura at presyon ay bawat halaga ng 20 bit, na kailangang mai-convert sa maginoo na temperatura at presyon sa pamamagitan ng isang medyo kumplikadong algorithm gamit ang 3 16 bit na mga parameter ng pagkakalibrate para sa temperatura, at 9 16 bit na mga parameter ng pagkakalibrate kasama ang temperatura para sa presyon. Ang granulatity ng pagsukat ng temperatura ay 0,0003 degrees Celsius para sa isang hindi gaanong makabuluhang pagbabago ng bit (20 bit readout), pagtaas sa 0.0046 degrees Celsius kung ginamit ang 16 bit readout.

Ang kahalumigmigan ay isang 16 bit na halaga na kailangang mai-convert sa kamag-anak na kahalumigmigan sa pamamagitan ng isa pang kumplikadong algorithm gamit ang 6 na mga parameter ng pagkakalibrate na isang halo ng 8, 12 at 16 na mga piraso.

Ipinapakita ng sheet ng data ang ganap na kawastuhan ng pagbabasa ng temperatura bilang + -0.5 C sa 25 C at + -1 C sa saklaw na 0 hanggang 65 C.

Ang granularity ng pagsukat ng presyon ay 0.15 Pascals (ie 0.0015 hectoPascals) sa resolusyon na 20 bit, o 2.5 Pascals sa resolusyon na 16 bit. Ang halaga ng hilaw na presyon ay apektado ng temperatura, kaya't sa paligid ng 25C, isang pagtaas sa temperatura ng 1 degree C na nababawasan ang sinusukat na presyon ng 24 Pascals. Ang pagkasensitibo ng temperatura ay isinasaalang-alang sa algorithm ng pagkakalibrate, kaya't ang naihatid na mga halaga ng presyon ay dapat na tumpak sa iba't ibang mga temperatura.

Ipinapakita ng sheet ng data ang ganap na kawastuhan ng readout ng presyon bilang + -1 hPa para sa mga temperatura sa pagitan ng 0 C at 65 C.

Ang kawastuhan ng halumigmig ay ibinibigay sa sheet ng data bilang + -3% RH, at + -1% na hysteresis.

Kung paano ito gumagana

Ang 24 bytes ng data ng pag-calibrate ng temperatura at presyon, at gayun din sa kaso ng BME280 ang 8 bytes ng data ng pagkakalibrate ng kahalumigmigan, kailangang basahin mula sa aparato at itago sa mga variable. Ang data na ito ay isa-isang nai-program sa aparato sa pabrika, kaya't ang iba't ibang mga aparato ay may iba't ibang mga halaga - hindi bababa sa para sa ilan sa mga parameter. Ang isang BME / P280 ay maaaring nasa isa sa dalawang mga estado. Sa isang estado nagsusukat ito. Sa ibang estado naghihintay ito (natutulog).

Aling estado ito ay maaaring suriin sa pamamagitan ng pagtingin sa bit 3 ng pagrehistro 0xF3.

Ang mga resulta ng pinakabagong pagsukat ay maaaring makuha sa anumang oras sa pamamagitan ng pagbabasa ng katumbas na halaga ng data, anuman ang pagtulog o pagsukat ng aparato.

Mayroon ding dalawang paraan ng pagpapatakbo ng BME / P280. Ang isa ay Ang tuluy-tuloy na mode (tinatawag na Normal mode sa data sheet) na paulit-ulit na ikot sa pagitan ng mga estado ng Pagsukat at Pagtulog. Sa mode na ito ang aparato ay nagsasagawa ng isang hanay ng mga sukat, pagkatapos ay matulog, pagkatapos ay gumising para sa isa pang hanay ng mga sukat, at iba pa. Ang bilang ng mga indibidwal na pagsukat at ang tagal ng bahagi ng pagtulog ng ikot ay maaaring makontrol ang lahat sa pamamagitan ng mga rehistro ng pagsasaayos.

Ang iba pang paraan ng pagpapatakbo ng BME / P280 ay Single Shot mode (tinatawag na Forced mode sa data sheet). Sa mode na ito ang aparato ay nagising mula sa pagtulog sa pamamagitan ng isang utos na sukatin, gumagawa ito ng isang hanay ng mga sukat, pagkatapos ay bumalik sa pagtulog. Ang bilang ng mga indibidwal na sukat sa hanay ay kinokontrol sa utos ng pagsasaayos na gumising sa aparato.

Sa BMP280, kung ang isang pagsukat ay nagawa, ang 16 pinaka makabuluhang mga piraso sa halaga ay pinunan, at ang apat na hindi gaanong makabuluhang mga piraso sa pagbasa ng halaga ay lahat ng mga zero. Ang bilang ng mga sukat ay maaaring itakda sa 1, 2, 4, 8 o 16 at habang ang bilang ng mga sukat ay nadagdagan, ang bilang ng mga piraso na pinuno ng data ay tumataas, sa gayon na may 16 na sukat lahat ng 20 bit ay pinunan ng data ng pagsukat. Ang sheet ng data ay tumutukoy sa prosesong ito bilang oversampling.

Sa BME280, ang parehong pag-aayos ay nalalapat hangga't ang resulta ay hindi nai-filter. Kung ginamit ang pag-filter, ang mga halaga ay palaging 20 bits, hindi alintana kung gaano karaming mga pagsukat ang kinuha sa bawat siklo ng pagsukat.

Ang bawat indibidwal na pagsukat ay tumatagal ng halos 2 milliseconds (karaniwang halaga; ang maximum na halaga ay 2.3 ms). Idagdag dito ang isang nakapirming overhead na halos 2 ms (karaniwang medyo mas kaunti) ay nangangahulugang ang isang pagkakasunud-sunod ng pagsukat, na maaaring binubuo ng 1 hanggang 32 indibidwal na mga sukat, ay maaaring tumagal mula 4 ms hanggang sa 66 ms.

Nagbibigay ang data sheet ng isang hanay ng mga inirekumendang kombinasyon ng temperatura at sobrang paglalagay ng presyon para sa iba't ibang mga application.

Nagrerehistro ang kontrol sa pag-configure

Ang dalawang rehistro sa pagkontrol ng pagsasaayos sa BMP280 ay nasa rehistro ng mga address na 0xF4 at 0xF5, at nai-map sa 6 na indibidwal na mga halaga ng kontrol sa pagsasaayos. Ang 0xF4 ay binubuo ng:

  • 3 bits osrs_t (sukatin ang temperatura 0, 1, 2, 4, 8 o 16 beses);
  • 3 bits osrs_p (sukatin ang presyon 0, 1, 2, 4, 8 o 16 beses); at
  • 2 bits Mode (Sleep, Forced (ie Single Shot), Normal (ie tuloy-tuloy).

Ang 0xF5 ay binubuo ng:

  • 3 bits t_sb (oras ng pag-standby, 0.5ms hanggang 4000 ms);
  • 3 bits filter (tingnan sa ibaba); at
  • 1 bit spiw_en na pumipili ng SPI o I2C.

Kinokontrol ng parameter ng filter ang isang uri ng exponential decay algorithm, o filter na Infinite Impulse Response (IIR), na inilapat sa mga presyon ng hilaw na presyon at temperatura (ngunit hindi sa mga halagang halumigmig). Ang equation ay ibinibigay sa sheet ng data. Ang isa pang pagtatanghal ay:

Halaga (n) = Halaga (n-1) * (K-1) / K + pagsukat (n) / K

kung saan (n) ipinapahiwatig ang pinakabagong halaga ng pagsukat at output; at K ang parameter ng filter. Ang parameter ng filter na K at maaaring itakda sa 1, 2, 4, 8 o 16. Kung ang K ay nakatakda sa 1 ang equation ay nagiging Halaga (n) = pagsukat (n) lamang. Ang pag-cod ng parameter ng filter ay:

  • filter = 000, K = 1
  • filter = 001, K = 2
  • filter = 010, K = 4
  • filter = 011, K = 8
  • filter = 1xx, K = 16

Ang BME 280 ay nagdaragdag ng isang karagdagang pagrehistro ng control control sa address 0xF2, "ctrl_hum" na may isang solong 3-bit na parameter osrs_h (sukatin ang halumigmig 0, 1, 2, 4, 8 o 16 beses).

Hakbang 4: Oras ng Pagsukat at Pagbasa

Plano kong idagdag ito sa paglaon, ipinapakita ang tiyempo ng mga utos at mga tugon sa pagsukat.

Iddt - kasalukuyang sa pagsukat ng temperatura. Karaniwang halaga 325 uA

Iddp - kasalukuyang nasa pagsukat ng presyon. Karaniwang halaga 720 uA, max 1120 uA

Iddsb - kasalukuyang nasa standby mode. Karaniwang halaga na 0.2 uA, max 0.5 uA

Iddsl - kasalukuyang nasa mode ng pagtulog. Karaniwang halaga na 0.1 uA, max 0.3 uA

Hakbang 5: Mga Alituntunin ng Software

Mga Alituntunin ng Software
Mga Alituntunin ng Software
Mga Alituntunin ng Software
Mga Alituntunin ng Software

I2C Burst mode

Ang sheet ng data ng BMP280 ay nagbibigay ng gabay tungkol sa pagbabasa ng data (seksyon 3.9). Sinasabi nito na "masidhing inirerekomenda na gumamit ng isang basang pagbasa at hindi address ang bawat rehistro nang paisa-isa. Pipigilan nito ang isang posibleng pagsasama-sama ng mga byte na kabilang sa iba't ibang mga sukat at mabawasan ang trapiko ng interface." Walang ibinigay na patnubay patungkol sa pagbabasa ng mga parameter ng kabayaran / pagkakalibrate. Marahil hindi ito isang isyu sapagkat sila ay static at hindi nagbabago.

Binabasa ng library na ito ang lahat ng magkakalapit na halaga sa iisang operasyon na binasa - 24 bytes sa kaso ng temperatura at mga parameter ng kompensasyon sa presyon, 6 na byte para sa temperatura at presyon na pinagsama, at 8 bytes para sa halumigmig, temperatura at pinagsamang presyon. Kapag ang temperatura lamang ang nasuri, 3 bytes lamang ang nabasa.

Paggamit ng macros (# tukuyin atbp.)

Walang mga macros sa library na ito bukod sa karaniwang library na "isama ang guard" na macro na pumipigil sa pagdoble.

Ang lahat ng mga Constant ay tinukoy gamit ang const keyword, at ang pag-print ng debug ay kinokontrol na may karaniwang mga pagpapaandar ng C.

Naging mapagkukunan ng ilang kawalan ng katiyakan para sa akin, ngunit ang payo na nakukuha ko mula sa pagbabasa ng maraming mga post sa paksang ito ay ang paggamit ng #define para sa deklarasyon ng mga pare-pareho (hindi bababa sa) at (marahil) ang pag-print ng pag-print ng debug ay hindi kinakailangan at hindi kanais-nais.

Ang kaso para sa paggamit ng const kaysa sa #define ay medyo malinaw - gumagamit ang const ng parehong mga mapagkukunan tulad ng #define (ie nil) at ang mga resulta na halaga ay sumusunod sa mga panuntunan sa pagsisikap, sa gayon binabawasan ang pagkakataon ng mga pagkakamali.

Ang kaso para sa kontrol sa pag-print ng debug ay medyo hindi gaanong malinaw, sapagkat ang paraan na nagawa ko ito ay nangangahulugan na ang pangwakas na code ay naglalaman ng lohika para sa mga pahayag sa pag-print ng debug, kahit na hindi nila ito naisagawa. Kung gagamitin ang silid-aklatan sa isang malaking proyekto sa isang microcontroller na may limitadong memorya, maaari itong maging isang isyu. Dahil ang aking pag-unlad ay nasa isang ESP8266 na may isang malaking memorya ng flash, ito ay tila hindi isang isyu para sa akin.

Hakbang 6: Pagganap ng Temperatura

Plano kong idagdag ito sa paglaon.

Hakbang 7: Pagganap ng Presyon

Plano kong idagdag ito sa paglaon.

Inirerekumendang: