Cuprins:

Biblioteca pentru BMP280 și BME280: 7 pași
Biblioteca pentru BMP280 și BME280: 7 pași

Video: Biblioteca pentru BMP280 și BME280: 7 pași

Video: Biblioteca pentru BMP280 și BME280: 7 pași
Video: Using BME280 and BMP280 Breakouts with Adafruit Sensor Libraries 2024, Iulie
Anonim
Biblioteca pentru BMP280 și BME280
Biblioteca pentru BMP280 și BME280
Biblioteca pentru BMP280 și BME280
Biblioteca pentru BMP280 și BME280
Biblioteca pentru BMP280 și BME280
Biblioteca pentru BMP280 și BME280

Introducere

Nu mi-am propus să scriu această bibliotecă. S-a „întâmplat” ca efect secundar al unui proiect pe care l-am început, care utilizează un BMP280. Acest proiect nu este încă finalizat, dar cred că biblioteca este gata să le împărtășească altora. Ulterior am avut nevoie să folosesc un BME280, care adaugă măsurarea umidității la capacitatea de presiune și temperatură a BMP280. BME280 este „compatibil înapoi” cu BMP280 - adică toate registrele și pașii necesari pentru a citi presiunea și temperatura din BME280 sunt aceleași cu cele utilizate pentru BMP280. Există registre și pași suplimentari necesari pentru citirea umidității, aplicabile numai BME280. Acest lucru ridică întrebarea, o bibliotecă pentru ambele sau două biblioteci separate. Hardware-ul pentru cele două tipuri de dispozitive este complet interschimbabil. Chiar și multe dintre modulele vândute (de exemplu pe Ebay și AliExpress) sunt etichetate BME / P280. Pentru a afla ce tip este, trebuie să vă uitați la scrierea (minusculă) de pe senzor în sine sau să testați octetul de ID al dispozitivului. Am decis să merg pentru o singură bibliotecă. Se pare că a funcționat OK.

Feedback-ul, în special orice sugestie de îmbunătățire, va fi apreciat.

Caracteristici și capacități ale bibliotecii

O bibliotecă este o bucată de software care oferă o interfață de programare a aplicațiilor (API) pentru ca un programator să exercite capacitățile dispozitivului, fără a fi necesar să se ocupe de toate detaliile cu granulație fină. De dorit, API-ul ar trebui să fie ușor pentru un începător cu cerințe simple pentru a începe, asigurând în același timp exploatarea completă a capacităților dispozitivului. Este de dorit ca biblioteca să urmeze orice instrucțiuni specifice de la producătorul dispozitivului, precum și bunele practici generale ale software-ului. M-am străduit să realizez toate acestea. Când am început cu BMP280, am găsit 3 biblioteci diferite pentru acesta: Adafruit_BMP280; Seeed_BMP280; și unul numit BMP280 de la producătorul dispozitivului. Nici Adafruit, nici Seeed nu au oferit capabilități extinse, deși au funcționat bine și au fost ușor de utilizat pentru aplicațiile de bază. Nu mi-am putut imagina cum să folosim cel produs de producătorul dispozitivului (Bosch Sensortec). Aceasta poate fi deficiența mea, mai degrabă decât a lor. Cu toate acestea biblioteca a fost mult mai complicată decât celelalte două, nu am putut găsi nicio instrucțiune sau exemple de utilizare (am găsit ulterior exemple în fișierul „bmp280_support.c”, totuși acestea nu mi-au fost deosebit de utile).

Ca urmare a acestor factori, am decis să-mi scriu propria bibliotecă pentru BMP280.

Privind situația bibliotecii pentru BME280, am găsit biblioteci separate Adafruit_BME280, Seed_BME280 și încă una BME280_MOD-1022 scrisă de Embedded Adventures. Niciunul dintre ele nu a combinat funcțiile pentru BMP280 într-o bibliotecă capabilă să utilizeze BME280. Niciunul dintre aceștia nu a acceptat în mod explicit capacitatea dispozitivelor de a stoca câțiva biți de date în timp ce dispozitivul și microprocesorul său de control dorm (această capacitate este evidentă în foaia tehnică și este acceptată în biblioteca pe care am scris-o și am descris-o aici).

O bibliotecă combinată ar trebui să aibă suport pentru toate capacitățile BME280, dar atunci când este utilizată cu un BMP280 nu ar trebui să impună niciun fel de cheltuieli generale din funcțiile neutilizate. Avantajele unei biblioteci combinate includ mai puține fișiere de bibliotecă pentru gestionare, mixare ușoară și potrivire a diferitelor dispozitive din același proiect și modificări simplificate pentru întreținere sau actualizări care trebuie făcute doar într-un singur loc, în loc de două. Acestea sunt probabil toate destul de minore, chiar nesemnificative, dar …

Capacitățile dispozitivului

BMP280 și BME280 sunt dispozitive de montare la suprafață de aproximativ 5 mm pătrat și 1 mm înălțime. Există 8 plăci de interfață, inclusiv 2 plăcuțe de intrare de alimentare separate și două plăci de împământare. Acestea sunt disponibile pe eBay ca un modul cu 4 sau 6 pini scoase. Modulul cu 4 pini are o adresă I2C fixă și nu poate fi configurat pentru a utiliza protocolul SPI.

Modulul cu 6 pini sau dispozitivul bare pot fi utilizate fie cu protocoale I2C, fie cu SPI. În modul I2C poate avea două adrese diferite, realizate prin conectarea pinului SDO fie la masă (pentru adresa de bază = 0x76), fie la Vdd (pentru adresa de bază +1 = 0x77). În modul SPI are aranjamentul obișnuit de 1 ceas, 2 date (una pentru fiecare direcție) și un pin de selectare a dispozitivului (CS).

Biblioteca pe care am scris-o și am descris-o aici acceptă doar I2C. Bibliotecile Adafruit_BMP280 și BME_MOD-1022 au suport atât pentru i2C, cât și pentru SPI.

Biblioteca poate fi descărcată de aici:

github.com/farmerkeith/BMP280-library

Pasul 1: Configurarea hardware-ului

Configurarea hardware-ului
Configurarea hardware-ului

Înainte ca biblioteca să fie utilă, este necesar să conectați un microcontroler la BMP280 (sau la două dintre ele, dacă doriți).

Am folosit un WeMos D1 mini pro, așa că îi voi arăta conexiunile. Alte microcontrolere vor fi similare, trebuie doar să conectați corect pinii SDA și SCL.

În cazul WeMos D1 mini pro, conexiunile sunt:

Funcție pin WeMos pin BMP280 Note

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Control adrese SDO Ground sau Vdd I2C select CSB Vdd (GND selectează SPI)

Rețineți că pinul SDO de pe unele dintre modulele MP280 este etichetat SDD, iar pinul Vdd poate fi etichetat VCC. Notă: liniile SDA și SCL ar trebui să aibă rezistențe de tragere între linie și pinul Vin. De obicei, o valoare de 4,7K ar trebui să fie OK. Unele module BMP280 și BME280 au rezistențe de tracțiune de 10K incluse în modul (ceea ce nu este o bună practică, deoarece punerea mai multor dispozitive pe magistrala I2C poate încărca excesiv). Cu toate acestea, utilizarea a două module BME / P280 fiecare cu un rezistor de 10K nu ar trebui să fie o problemă în practică, atâta timp cât nu există prea multe alte dispozitive pe aceeași magistrală, de asemenea, cu rezistențe pull-up.

După ce aveți hardware-ul conectat, puteți verifica cu ușurință dacă dispozitivul dvs. este un BMP280 sau un BME280 executând schița I2CScan_ID pe care o puteți găsi aici:

De asemenea, puteți verifica dacă aveți un BMP280 sau BME280 uitându-vă la dispozitivul în sine. Am considerat că este necesar să folosesc un microscop digital pentru a face acest lucru, dar dacă vederea este foarte bună, este posibil să o poți face fără niciun ajutor. Există două linii de imprimare pe carcasa dispozitivului. Cheia este prima literă de pe a doua linie, care în cazul dispozitivelor BMP280 este un „K”, iar în cazul dispozitivelor BME280 este un „U”.

Pasul 2: API-uri furnizate de bibliotecă

API-uri furnizate de bibliotecă
API-uri furnizate de bibliotecă
API-uri furnizate de bibliotecă
API-uri furnizate de bibliotecă

Includerea bibliotecii într-o schiță

Biblioteca este inclusă într-o schiță în mod standard folosind declarația

#include "farmerkeith_BMP280.h"

Această declarație trebuie inclusă în prima parte a schiței înainte de începerea funcției setup ().

Crearea unui obiect software BME sau BMP

Există 3 niveluri pentru crearea obiectului software BMP280. Cel mai simplu este doar

bme280 Numele obiectului; sau bmp280 objectName;

de exemplu, BMP280 bmp0;

Aceasta creează un obiect software cu adresa implicită 0x76 (adică pentru SDO conectat la masă).

Următorul nivel pentru crearea unui obiect software BME280 sau BMP280 are un parametru de 0 sau 1, după cum urmează:

bme280 ObjectNameA (0);

bmp280 ObjectNameB (1);

Parametrul (0 sau 1) este adăugat la adresa de bază I2C, astfel încât două dispozitive BME280 sau BMP280 pot fi utilizate pe aceeași magistrală I2C (inclusiv una din fiecare).

Al treilea nivel pentru crearea unui obiect software BME sau BMP280 are doi parametri. Primul parametru, care este fie 0, fie 1, este pentru adresă, ca în cazul precedent. Al doilea parametru controlează imprimarea de depanare. Dacă este setat la 1, fiecare tranzacție cu obiectul software rezultă în ieșiri Serial.print care permit programatorului să vadă detaliile tranzacției. De exemplu:

bmp280 ObjectNameB (1, 1);

Dacă parametrul de imprimare pentru depanare este setat la 0, obiectul software revine la un comportament normal (fără imprimare).

Această declarație sau declarații trebuie să fie incluse după #include și înainte de funcția setup ().

Inițializarea obiectului software BME sau BMP

Înainte de a fi utilizat, este necesar să citiți parametrii de calibrare de pe dispozitiv și să-l configurați pentru orice mod de măsurare, eșantionarea și setările de filtrare sunt adecvate.

Pentru o inițializare simplă, cu scop general, afirmația este:

objectName.begin ();

Această versiune de begin () citește parametrii de calibrare de pe dispozitiv și setează osrs_t = 7 (16 măsurători de temperatură), osrs_p = 7 (16 măsurători de presiune), modul = 3 (continuu, Normal), t_sb = 0 (0,5 ms somn între seturi de măsurare), filter = 0 (K = 1, deci fără filtrare) și spiw_en = 0 (SPI dezactivat, deci utilizați I2C). În cazul BME280, există un parametru suplimentar osrs_h = 7 pentru 16 măsurători de umiditate.

Există o altă versiune a begin () care ia toți cei șase (sau 7) parametri. Echivalentul afirmației de mai sus este

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

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

Lista completă a codurilor și semnificațiile acestora se află în foaia de date BME280 și BMP280, precum și în comentariile din fișierul.cpp din bibliotecă.

Măsurarea simplă a temperaturii și a presiunii

Pentru a obține o măsurare a temperaturii, cel mai simplu mod este

temperatura dublă = obiectNume.readTemperature (); // măsoară temperatura

Pentru a obține o măsurare a presiunii cel mai simplu mod este

presiune dublă = ObjectName.readPressure (); // masura presiunea

Pentru a obține o măsurare a umidității cel mai simplu mod este

umiditate dublă = objectName.readHumidity (); // măsurați umiditatea (numai BME280)

Pentru a obține atât temperatura, cât și presiunea, cele două afirmații de mai sus pot fi folosite una după alta, dar există o altă opțiune, care este:

temperatura dubla;

presiune dublă = obiectNume.readPressure (temperatura); // măsurați presiunea și temperatura

Această declarație citește datele de pe dispozitivul BME280 sau BMP280 o singură dată și returnează atât temperatura, cât și presiunea. Aceasta este o utilizare puțin mai eficientă a magistralei I2C și asigură că cele două citiri corespund aceluiași ciclu de măsurare.

Pentru BME 280, o declarație combinată care obține toate cele trei valori (umiditate, temperatură și presiune) este:

temperatura dublă, presiune; umiditate dublă = obiectNume.readHumidity (temperatură, presiune); // măsoară umiditatea, presiunea și temperatura

Această declarație citește datele de pe dispozitivul BMP280 o singură dată și returnează toate cele trei valori. Aceasta este o utilizare puțin mai eficientă a magistralei I2C și asigură că cele trei citiri corespund aceluiași ciclu de măsurare. Rețineți că numele variabilelor pot fi schimbate cu orice îi place utilizatorului, dar ordinea lor este fixă - temperatura este pe primul loc, iar presiunea pe al doilea.

Aceste cazuri de utilizare sunt acoperite în schițe de exemplu furnizate împreună cu biblioteca, fiind basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino și basicHumidityAndTemperatureAndPressure.ino.

Măsurare mai sofisticată a temperaturii și a presiunii

Deși seria de declarații de mai sus va funcționa fără probleme, există câteva probleme:

  1. dispozitivul funcționează continuu și, prin urmare, consumă energie la nivelul său maxim. Dacă energia provine de la o baterie, poate fi necesară reducerea acesteia.
  2. datorită puterii consumate, dispozitivul se va încălzi și, prin urmare, temperatura măsurată va fi mai mare decât temperatura ambiantă. Voi acoperi acest lucru mai mult într-un pas ulterior.

Un rezultat care folosește mai puțină energie și oferă o temperatură mai apropiată de cea ambientală, poate fi obținut utilizând begin () cu parametri care îl adorm (de exemplu, modul = 0). De exemplu:

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

Apoi, când se dorește o măsurare, treziți dispozitivul cu o comandă de configurare pentru a înregistra F2 (dacă este necesar) și F4 care setează valorile corespunzătoare osrs_h, osrs_t și osrs_p, plus mode = 1 (modul de fotografiere simplă). De exemplu:

[objectName.updateF2Control (1);] // osrs_h - nu este necesar niciodată pentru BMP280, // și nu este necesar pentru BME280 dacă numărul de măsurători nu este modificat // de la valoarea prevăzută în begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

După ce a trezit dispozitivul, acesta va începe să măsoare, dar rezultatul nu va fi disponibil pentru câteva milisecunde - cel puțin 4 ms, poate până la 70 ms sau mai mult, în funcție de numărul de măsurători care au fost specificate. Dacă comanda de citire este trimisă imediat, dispozitivul va returna valorile din măsurarea anterioară - ceea ce poate fi acceptabil în unele aplicații, dar în majoritatea cazurilor este probabil mai bine să întârziați până când noua măsurare este disponibilă.

Această întârziere se poate face în mai multe moduri.

  1. așteptați o perioadă fixă de timp pentru a acoperi cea mai lungă întârziere așteptată
  2. așteptați o cantitate de timp calculată din timpul de măsurare maxim pe măsurare (adică 2,3 ms) de numărul de măsurători, plus cheltuielile generale, plus o marjă.
  3. așteptați o perioadă mai scurtă de timp calculată ca mai sus, dar folosind timpul de măsurare nominal (adică 2 ms) plus cheltuielile generale, apoi începeți să verificați bitul „Măsoară” din registrul de stare. Când bitul de stare citește 0 (adică nu măsoară), obțineți citirile de temperatură și presiune.
  4. începeți imediat să verificați registrul de stare și obțineți citirile de temperatură și presiune atunci când bitul de stare citește 0,

Voi arăta un exemplu de mod de a face acest lucru puțin mai târziu.

Operațiuni de înregistrare a configurației

Pentru ca toate acestea să se întâmple, avem nevoie de mai multe instrumente pe care încă nu le-am introdus. Sunt:

byte readRegister (reg)

nul updateRegister (reg, valoare)

Fiecare dintre acestea are mai multe comenzi derivate în bibliotecă, care fac software-ul pentru acțiuni specifice un pic mai simplu.

Exemplul powerSaverPressureAndTemperature.ino folosește metoda nr. 3. Linia de cod care efectuează verificarea repetată este

while (bmp0.readRegister (0xF3) >> 3); // bucla untl F3bit 3 == 0

Rețineți că această schiță este pentru un microcontroler ESP8266. Am folosit un WeMos D1 mini pro. Schița nu va funcționa cu microcontrolerele Atmega, care au instrucțiuni diferite pentru dormit. Această schiță exercită alte câteva comenzi, așa că le voi introduce pe toate înainte de a descrie schița mai detaliată.

Când microcontolerul dorm în paralel cu senzorul BMP280, configurația senzorului pentru măsurătorile necesare se poate face în comanda begin (), utilizând cei 6 parametri. Cu toate acestea, dacă microcontrolerul nu doarme, dar senzorul este, atunci în momentul măsurării, senzorul trebuie trezit și comunicat configurația sa de măsurare. Acest lucru se poate face direct cu

updateRegister (reg, valoare)

dar este puțin mai ușor cu următoarele trei comenzi:

updateF2Control (osrs_h); // Numai BME280

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

După efectuarea măsurătorii, dacă modul utilizat este Single shot (Mod forțat), atunci dispozitivul va reveni automat la repaus. Cu toate acestea, dacă setul de măsurare implică mai multe măsurători folosind modul continuu (Normal), atunci BMP280 va trebui să fie pus din nou în repaus. Acest lucru se poate face cu oricare dintre următoarele două comenzi:

updateF4Control16xSleep ();

updateF4ControlSleep (valoare);

Ambele setează biții de mod la 00 (adică modul de repaus). Cu toate acestea, primul setează osrs_t și osrs_p la 111 (adică 16 măsurători) în timp ce al doilea stochează cei 6 biți mici de la „valoare” în biții 7: 2 din registrul 0xF4.

În mod similar, următoarea declarație stochează cei șase biți mici de „valoare” în biții 7: 2 din registrul 0xF5.

updateF5ConfigSleep (valoare);

Utilizarea acestor ultime comenzi permite stocarea a 12 biți de informații în registrele BMP280 F4 și F5. Cel puțin în cazul ESP8266, când microcontrolerul se trezește după o perioadă de somn, acesta începe la începutul schiței fără să se cunoască starea sa înainte de comanda de repaus. Pentru a stoca cunoștințele despre starea sa înainte de comanda de repaus, datele pot fi stocate în memoria flash, utilizând fie funcțiile EEPROM, fie scriind un fișier folosind SPIFFS. Cu toate acestea, memoria flash are o limitare a numărului de cicluri de scriere, de ordinul 10 000 până la 100 000. Aceasta înseamnă că, dacă microcontrolerul trece printr-un ciclu de repaus-trezire la fiecare câteva secunde, poate depăși scrierea memoriei admisibilă limită în câteva luni. Stocarea câtorva biți de date în BMP280 nu are o astfel de limitare.

Datele stocate în registrele F4 și F5 pot fi recuperate atunci când microcontrolerul se trezește folosind comenzile

readF4Sleep ();

readF5Sleep ();

Aceste funcții citesc registrul corespunzător, schimbă conținutul pentru a elimina cele 2 LSB-uri și a returna restul de 6 biți. Aceste funcții sunt utilizate în exemplul de schiță powerSaverPressureAndTemperatureESP.ino după cum urmează:

// citiți valoarea EventCounter înapoi de la bmp0

octet bmp0F4value = bmp0.readF4Sleep (); // 0 la 63 octeți bmp0F5value = bmp0.readF5Sleep (); // 0 la 63 eventCounter = bmp0F5value * 64 + bmp0F4value; // 0 la 4095

Aceste funcții citesc registrul corespunzător, deplasează conținutul pentru a elimina cele 2 LSB-uri și returnează restul de 6 biți. Aceste funcții sunt utilizate în exemplul schiță powerSaverPressureAndTemperature.ino după cum urmează:

// citiți valoarea EventCounter înapoi de la bmp1

octet bmp1F4value = bmp1.readF4Sleep (); // 0 la 63 octeți bmp1F5value = bmp1.readF5Sleep (); // 0 la 63 eventCounter = bmp1F5value * 64 + bmp1F4value; // 0 la 4095

Funcții de temperatură și presiune brute

Funcțiile de bază readTemperature, readPressure și readHumidity au două componente. Mai întâi valorile brute de temperatură și presiune de 20 de biți sunt obținute de la BME / P280 sau valoarea brută de 16 biți de umiditate se obține de la BME280. Apoi, algoritmul de compensare este utilizat pentru a genera valorile de ieșire în grade Celsius, hPa sau% RH.

Biblioteca oferă funcții separate pentru aceste componente, astfel încât datele brute de temperatură, presiune și umiditate pot fi obținute și poate fi manipulate într-un fel. De asemenea, este furnizat algoritmul pentru a obține temperatura, presiunea și umiditatea din aceste valori brute. În bibliotecă acești algoritmi sunt implementați folosind aritmetica în virgulă mobilă cu lungime dublă. Funcționează bine pe ESP8266, care este un procesor pe 32 de biți și folosește 64 de biți pentru variabile flotante „duble”. Accesibilitatea acestor funcții poate fi utilă pentru evaluarea și eventual schimbarea calculului pentru alte platforme.

Aceste funcții sunt:

readRawPressure (RawTemperature); // citește datele brute de presiune și temperatură din BME / P280readRawHumidity (rawTemperature, rawPressure); // citeste datele brute de umiditate, temperatura si presiune din BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (RawHumidity, t_fine)

Argumentul „t-fine” pentru aceste funcții merită o explicație. Atât algoritmii de compensare a presiunii, cât și a umidității includ o componentă dependentă de temperatură, care se realizează prin intermediul variabilei t_fine. Funcția calcTemperature scrie o valoare în t_fine bazată pe logica algoritmului de compensare a temperaturii, care este apoi utilizată ca intrare atât în calcPressure cât și în calcHumidity.

Un exemplu de utilizare a acestor funcții poate fi găsit în exemplul schiță rawPressureAndTemperature.ino și, de asemenea, în codul pentru funcția readHumidity () din fișierul.cpp al bibliotecii.

Altitudine și presiunea nivelului mării

Există o relație cunoscută între presiunea atmosferică și altitudine. Vremea influențează și presiunea. Atunci când organizațiile meteorologice publică informații despre presiunea atmosferică, acestea le ajustează de obicei în funcție de altitudine și astfel „diagrama sinoptică” arată izobarele (liniile de presiune constantă) standardizate la nivelul mării. Deci într-adevăr există 3 valori în această relație și cunoașterea a două dintre ele permite derivarea celei de-a treia. Cele 3 valori sunt:

  • altitudine deasupra nivelului mării
  • presiunea reală a aerului la acea altitudine
  • presiunea aerului echivalentă la nivelul mării (mai strict, nivelul mediu al mării, deoarece nivelul instantaneu al mării se schimbă constant)

Această bibliotecă oferă două funcții pentru această relație, după cum urmează:

calcAltitude (presiune, seaLevelhPa);

calcNormalisedPressure (presiune, altitudine);

Există, de asemenea, o versiune simplificată, care presupune presiunea standard a nivelului mării de 1013,15 hPa.

calcAltitudine (presiune); // standard seaLevelPressure presupus

Pasul 3: Detalii dispozitiv BMP280

Detalii dispozitiv BMP280
Detalii dispozitiv BMP280

Capabilități hardware

BMP280 are 2 octeți de date de configurare (la adresele de registru 0xF4 și 0xF5) care sunt utilizate pentru a controla mai multe opțiuni de măsurare și ieșire a datelor. De asemenea, oferă 2 biți de informații de stare și 24 de octeți de parametri de calibrare care sunt utilizați pentru conversia valorilor brute de temperatură și presiune în unități convenționale de temperatură și presiune. BME280 are date suplimentare după cum urmează:

  • 1 octet suplimentar de date de configurare la adresa de registru 0xF2 utilizat pentru controlul mai multor măsurători de umiditate;
  • 8 octeți suplimentari de parametri de calibrare utilizați pentru conversia valorii umidității brute în procent de umiditate relativă.

Registrele de temperatură, presiune și stare pentru BME280 sunt aceleași ca și pentru BMP280, cu mici excepții, după cum urmează:

  • biții „ID” ai BME280 sunt setați la 0x60, deci se pot distinge de BMP280 care poate fi 0x56, 0x57 sau 0x58
  • controlul timpului de somn (t_sb) este modificat astfel încât cele două perioade lungi din BMP280 (2000 ms și 4000 ms) să fie înlocuite în BME280 cu timpi scurți de 10 ms și 20 ms. Timpul maxim de somn în BME280 este de 1000 ms.
  • În BME280, valorile brute de temperatură și presiune sunt întotdeauna de 20 de biți dacă se aplică filtrarea. Utilizarea valorilor de 16 până la 19 biți este limitată la cazurile fără filtrare (de exemplu, filtrul = 0).

Temperatura și presiunea sunt valori de 20 de biți, care trebuie convertite în temperatură și presiune convenționale printr-un algoritm destul de complex, utilizând 3 parametri de calibrare de 16 biți pentru temperatură și 9 parametri de calibrare de 16 biți plus temperatura pentru presiune. Granulatitatea măsurării temperaturii este de 0,0003 grade Celsius pentru o schimbare de biți cel puțin semnificativă (citire de 20 de biți), crescând la 0,0046 grade Celsius dacă se utilizează citirea de 16 biți.

Umiditatea este o valoare de 16 biți care trebuie convertită în umiditate relativă printr-un alt algoritm complex folosind 6 parametri de calibrare care sunt un amestec de 8, 12 și 16 biți.

Fișa tehnică arată exactitatea absolută a citirii temperaturii ca + -0,5 C la 25 C și + -1 C în intervalul 0 - 65 C.

Granularitatea măsurării presiunii este de 0,15 Pascali (adică 0,0015 hectoPascali) la rezoluția de 20 biți sau 2,5 Pascali la rezoluția de 16 biți. Valoarea presiunii brute este afectată de temperatură, astfel încât în jurul valorii de 25C, o creștere a temperaturii de 1 grad C scade presiunea măsurată cu 24 Pascali. Sensibilitatea la temperatură este luată în considerare în algoritmul de calibrare, astfel încât valorile presiunii livrate trebuie să fie exacte la diferite temperaturi.

Fișa tehnică arată exactitatea absolută a citirii presiunii ca + -1 hPa pentru temperaturi cuprinse între 0 C și 65 C.

Precizia umidității este dată în fișa tehnică ca + -3% HR și + -1% histerezis.

Cum functioneaza

Cele 24 de octeți de date de calibrare a temperaturii și presiunii, precum și, în cazul BME280, cei 8 octeți de date de calibrare a umidității, trebuie citite de pe dispozitiv și stocate în variabile. Aceste date sunt programate individual în dispozitiv din fabrică, astfel încât diferite dispozitive au valori diferite - cel puțin pentru unii dintre parametri. Un BME / P280 poate fi în una din cele două stări. Într-o stare măsoară. În cealaltă stare așteaptă (doarme).

În ce stare se poate verifica verificând bitul 3 din registrul 0xF3.

Rezultatele celei mai recente măsurători pot fi obținute în orice moment prin citirea valorii corespunzătoare a datelor, indiferent dacă dispozitivul doarme sau măsoară.

Există, de asemenea, două moduri de operare a BME / P280. Unul este modul continuu (numit mod normal în foaia de date) care trece în mod repetat între stările de măsurare și de somn. În acest mod, dispozitivul efectuează un set de măsurători, apoi se culcă, apoi se trezește pentru un alt set de măsurători și așa mai departe. Numărul de măsurători individuale și durata părții de somn a ciclului pot fi controlate prin registrele de configurare.

Cealaltă modalitate de operare a BME / P280 este modul Single Shot (numit modul Forțat în foaia de date). În acest mod, dispozitivul este trezit din repaus printr-o comandă de măsurat, face un set de măsurători, apoi revine în repaus. Numărul de măsurători individuale din set este controlat în comanda de configurare care trezește dispozitivul.

În BMP280, dacă se face o singură măsurare, cei 16 biți cei mai semnificativi din valoare sunt populați, iar cei patru biți cel mai puțin semnificativi din citirea valorii sunt toate zerouri. Numărul de măsurători poate fi setat la 1, 2, 4, 8 sau 16 și pe măsură ce numărul de măsurători este crescut, numărul de biți populat cu date crește, astfel încât, cu 16 măsurători, toți cei 20 de biți sunt populate cu date de măsurare. Fișa tehnică se referă la acest proces ca supra-eșantionare.

În BME280, același aranjament se aplică atât timp cât rezultatul nu este filtrat. Dacă se utilizează filtrarea, valorile sunt întotdeauna de 20 de biți, indiferent de câte măsurători sunt luate în fiecare ciclu de măsurare.

Fiecare măsurare individuală durează aproximativ 2 milisecunde (valoare tipică; valoarea maximă este de 2,3 ms). Adăugați la aceasta o cheltuială fixă de aproximativ 2 ms (de obicei puțin mai puțin) înseamnă că o secvență de măsurare, care poate consta de la 1 la 32 de măsurători individuale, poate dura de la 4 ms până la 66 ms.

Fișa tehnică oferă un set de combinații recomandate de supraeșantionare de temperatură și presiune pentru diverse aplicații.

Registre de control al configurației

Cele două registre de control de configurație din BMP280 sunt la adresele de registru 0xF4 și 0xF5 și sunt mapate pe 6 valori de control de configurație individuale. 0xF4 constă din:

  • 3 biți osrs_t (măsurați temperatura 0, 1, 2, 4, 8 sau 16 ori);
  • 3 biți osrs_p (măsurați presiunea de 0, 1, 2, 4, 8 sau 16 ori); și
  • Mod de 2 biți (Sleep, Forțat (adică Single Shot), Normal (adică continuu).

0xF5 constă din:

  • 3 biți t_sb (timp de așteptare, de la 0,5 ms la 4000 ms);
  • Filtru de 3 biți (vezi mai jos); și
  • 1 bit spiw_en care selectează SPI sau I2C.

Parametrul filtrului controlează un tip de algoritm de descompunere exponențială sau filtrul de răspuns la impuls infinit (IIR), aplicat valorilor brute de măsurare a presiunii și temperaturii (dar nu și valorilor umidității). Ecuația este dată în fișa tehnică. O altă prezentare este:

Valoare (n) = valoare (n-1) * (K-1) / K + măsurare (n) / K

unde (n) indică cea mai recentă valoare de măsurare și ieșire; iar K este parametrul de filtrare. Parametrul filtrului K și poate fi setat la 1, 2, 4, 8 sau 16. Dacă K este setat la 1, ecuația devine doar Valoare (n) = măsurare (n). Codificarea parametrului filtrului este:

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

BME 280 adaugă un registru suplimentar de control al configurației la adresa 0xF2, "ctrl_hum" cu un singur parametru de 3 biți osrs_h (măsurați umiditatea de 0, 1, 2, 4, 8 sau 16 ori).

Pasul 4: măsurare și sincronizare a citirii

Am de gând să adaug acest lucru mai târziu, arătând calendarul comenzilor și răspunsurile de măsurare.

Iddt - curent la măsurarea temperaturii. Valoare tipică 325 uA

Iddp - curent la măsurarea presiunii. Valoare tipică 720 uA, maxim 1120 uA

Iddsb - curent în modul de așteptare. Valoare tipică 0,2 uA, maxim 0,5 uA

Iddsl - curent în modul de repaus. Valoare tipică 0,1 uA, maxim 0,3 uA

Pasul 5: Instrucțiuni software

Ghidul software
Ghidul software
Ghidul software
Ghidul software

Mod I2C Burst

Foaia de date BMP280 oferă îndrumări despre citirea datelor (secțiunea 3.9). Se spune că „este recomandat să folosiți o citire în rafală și să nu abordați fiecare registru în mod individual. Acest lucru va preveni o posibilă confuzie de octeți aparținând diferitelor măsurători și va reduce traficul interfeței”. Nu se oferă îndrumări cu privire la citirea parametrilor de compensare / calibrare. Probabil că acestea nu reprezintă o problemă, deoarece sunt statice și nu se schimbă.

Această bibliotecă citește toate valorile contigue într-o singură operație de citire - 24 octeți în cazul parametrilor de compensare a temperaturii și presiunii, 6 octeți pentru temperatura și presiune combinate și 8 octeți pentru umiditate, temperatură și presiune combinate. Când temperatura este verificată numai, se citesc doar 3 octeți.

Utilizarea macrocomenzilor (#define etc.)

Nu există macrocomenzi în această bibliotecă în afară de macroul obișnuit „include guard” care previne duplicarea.

Toate constantele sunt definite folosind cuvântul cheie const, iar imprimarea de depanare este controlată cu funcții C standard.

A fost sursa unor incertitudini pentru mine, dar sfatul pe care îl primesc din citirea multor postări pe acest subiect este că utilizarea #define pentru declararea constantelor (cel puțin) și (probabil) controlul de imprimare a depanării este inutilă și nedorită.

Cazul pentru utilizarea const mai degrabă decât #define este destul de clar - const folosește aceleași resurse ca și #define (adică nil), iar valorile rezultate respectă regulile de scop, reducând astfel șansa de erori.

Cazul pentru controlul imprimării de depanare este puțin mai clar, deoarece felul în care am făcut-o înseamnă că codul final conține logica declarațiilor de imprimare a depanării, chiar dacă acestea nu sunt niciodată exercitate. Dacă biblioteca trebuie utilizată într-un proiect mare pe un microcontroler cu memorie foarte limitată, aceasta poate deveni o problemă. Deoarece dezvoltarea mea a fost pe un ESP8266 cu o memorie flash mare, acest lucru nu pare să fie o problemă pentru mine.

Pasul 6: Performanța temperaturii

Am de gând să adaug asta mai târziu.

Pasul 7: Performanță de presiune

Am de gând să adaug asta mai târziu.

Recomandat: