Isi kandungan:

Perpustakaan untuk BMP280 dan BME280: 7 Langkah
Perpustakaan untuk BMP280 dan BME280: 7 Langkah

Video: Perpustakaan untuk BMP280 dan BME280: 7 Langkah

Video: Perpustakaan untuk BMP280 dan BME280: 7 Langkah
Video: Cara Menggunakan Sensor Altimeter, Suhu, dan Tekanan Udara BME280 dan BMP280 2024, November
Anonim
Perpustakaan untuk BMP280 dan BME280
Perpustakaan untuk BMP280 dan BME280
Perpustakaan untuk BMP280 dan BME280
Perpustakaan untuk BMP280 dan BME280
Perpustakaan untuk BMP280 dan BME280
Perpustakaan untuk BMP280 dan BME280

Pengenalan

Saya tidak mahu menulis perpustakaan ini. Ia "berlaku" sebagai kesan sampingan dari projek yang saya mulakan yang menggunakan BMP280. Projek itu belum selesai, tetapi saya rasa perpustakaan sudah siap untuk dikongsi dengan yang lain. Selepas itu saya perlu menggunakan BME280, yang menambahkan pengukuran kelembapan pada keupayaan tekanan dan suhu BMP280. BME280 "kompatibel ke belakang" dengan BMP280 - iaitu, semua register dan langkah-langkah yang diperlukan untuk membaca tekanan dan suhu dari BME280 adalah sama dengan yang digunakan untuk BMP280. Terdapat daftar dan langkah tambahan yang diperlukan untuk membaca kelembapan, hanya berlaku untuk BME280. Ini menimbulkan persoalan, satu perpustakaan untuk kedua, atau dua perpustakaan yang terpisah. Perkakasan untuk dua jenis peranti boleh ditukar ganti sepenuhnya. Malah banyak modul yang dijual (contohnya di Ebay dan AliExpress) dilabel BME / P280. Untuk mengetahui jenisnya, anda mesti melihat tulisan (miniscule) pada sensor itu sendiri, atau menguji bait ID peranti. Saya memutuskan untuk pergi ke perpustakaan tunggal. Nampaknya sudah berjaya.

Maklum balas, terutama cadangan penambahbaikan, akan dihargai.

Ciri dan keupayaan perpustakaan

Perpustakaan adalah perisian yang menyediakan Antaramuka Pengaturcaraan Aplikasi (API) untuk pengaturcara menggunakan kemampuan peranti, tanpa harus berurusan dengan semua butiran halus. Diinginkan, API semestinya mudah untuk pemula dengan syarat mudah untuk memulakan, sambil menyediakan eksploitasi sepenuhnya keupayaan peranti. Sebaiknya perpustakaan harus mengikuti garis panduan khusus dari pengeluar peranti, serta amalan baik perisian umum. Saya telah berusaha untuk mencapai semua ini. Semasa memulakan BMP280, saya menjumpai 3 perpustakaan yang berbeza untuknya: Adafruit_BMP280; Melihat_BMP280; dan yang disebut BMP280 dari pengeluar peranti. Baik Adafruit maupun Seeed memberikan kemampuan yang luas, walaupun mereka bekerja dengan baik dan mudah digunakan untuk aplikasi asas. Saya tidak dapat mengetahui cara menggunakan kaedah yang dihasilkan oleh pengeluar peranti (Bosch Sensortec). Ini mungkin kekurangan saya, dan bukannya kekurangan mereka. Walau bagaimanapun perpustakaan jauh lebih rumit daripada dua yang lain, saya tidak dapat menemui arahan atau contoh penggunaannya (kemudian saya dapati contohnya terdapat dalam fail "bmp280_support.c", namun ini tidak begitu membantu saya).

Hasil daripada faktor-faktor ini, saya memutuskan untuk menulis perpustakaan saya sendiri untuk BMP280.

Melihat keadaan perpustakaan untuk BME280, saya menjumpai perpustakaan berasingan Adafruit_BME280, Seed_BME280 dan satu lagi BME280_MOD-1022 yang ditulis oleh Embedded Adventures. Tidak ada satupun yang menggabungkan fungsi untuk BMP280 di perpustakaan yang mampu menggunakan BME280. Tidak satu pun dari mereka secara jelas menyokong keupayaan peranti untuk menyimpan beberapa bit data semasa peranti dan mikroprosesornya sedang dalam keadaan tidur (kemampuan ini terbukti dalam lembar data dan disokong di perpustakaan yang telah saya tulis dan terangkan di sini).

Perpustakaan gabungan harus mempunyai sokongan untuk semua kemampuan BME280, tetapi ketika digunakan dengan BMP280, ia tidak boleh membebankan overhead dari fungsi yang tidak digunakan. Manfaat perpustakaan gabungan merangkumi lebih sedikit fail perpustakaan untuk diuruskan, pencampuran dan padanan peranti yang berbeza dalam projek yang sama, dan perubahan yang dipermudahkan untuk penyelenggaraan atau peningkatan yang hanya perlu dilakukan di satu tempat dan bukan di dua. Ini semua mungkin sangat kecil, walaupun tidak penting, tetapi …

Keupayaan peranti

BMP280 dan BME280 adalah peranti pemasangan permukaan kira-kira 5mm persegi dan tinggi 1 mm. Terdapat 8 pad antara muka, termasuk 2 pad input kuasa yang terpisah dan dua pad Ground. Mereka boleh didapati di eBay sebagai modul dengan 4 atau 6 pin dibawa keluar. Modul 4-pin mempunyai alamat I2C tetap dan tidak dapat dikonfigurasi untuk menggunakan protokol SPI.

Modul 6-pin atau peranti telanjang boleh digunakan dengan protokol I2C atau SPI. Dalam mod I2C, ia dapat memiliki dua alamat yang berbeda, dicapai dengan menghubungkan pin SDO sama ada ke Ground (untuk alamat pangkalan = 0x76) atau ke Vdd (untuk alamat pangkalan +1 = 0x77). Dalam mod SPI ia memiliki susunan biasa 1 jam, 2 data (satu untuk setiap arah) dan pin pilih peranti (CS).

Perpustakaan yang saya tulis dan terangkan di sini hanya menyokong I2C. Perpustakaan Adafruit_BMP280 dan BME_MOD-1022 mempunyai sokongan untuk i2C dan SPI.

Perpustakaan boleh dimuat turun di sini:

github.com/farmerkeith/BMP280-library

Langkah 1: Menyiapkan Perkakasan

Menyiapkan Perkakasan
Menyiapkan Perkakasan

Sebelum perpustakaan dapat berguna, perlu menyambungkan mikrokontroler ke BMP280 (atau dua daripadanya jika anda mahu).

Saya menggunakan pro mini WeMos D1, jadi saya akan menunjukkan hubungannya. Pengawal mikro lain akan serupa, anda hanya perlu menyambungkan pin SDA dan SCL dengan betul.

Bagi WeMos D1 mini pro, sambungannya adalah:

Fungsi WeMos pin Nota BMP280 pin

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Control address SDO Ground atau Vdd I2C pilih CSB Vdd (GND memilih SPI)

Perhatikan bahawa pin SDO pada beberapa modul MP280 berlabel SDD, dan pin Vdd mungkin dilabel VCC. Catatan: Garis SDA dan SCL harus mempunyai perintang penarik antara garis dan pin Vin. Biasanya nilai 4.7K mestilah OK. Sebilangan modul BMP280 dan BME280 mempunyai resistor penarik 10K yang termasuk dalam modul (yang bukan amalan yang baik, kerana meletakkan beberapa peranti di bas I2C mungkin memuatkannya secara berlebihan). Walau bagaimanapun, menggunakan 2 modul BME / P280 masing-masing dengan perintang 10K tidak seharusnya menjadi masalah dalam praktiknya selagi tidak ada terlalu banyak peranti lain di bas yang sama juga dengan perintang penarik.

Setelah anda menyambungkan perkakasan, anda dapat dengan mudah memeriksa sama ada peranti anda BMP280 atau BME280 dengan menjalankan lakaran I2CScan_ID yang anda dapati di sini:

Anda juga boleh memeriksa sama ada anda mempunyai BMP280 atau BME280 dengan melihat peranti itu sendiri. Saya perlu menggunakan mikroskop digital untuk melakukan ini, tetapi jika penglihatan anda sangat baik, anda mungkin dapat melakukannya tanpa sebarang bantuan. Terdapat dua baris pencetakan pada selongsong peranti. Kuncinya adalah huruf pertama pada baris kedua, yang dalam hal peranti BMP280 adalah "K" dan dalam kes peranti BME280 adalah "U".

Langkah 2: API yang disediakan oleh Perpustakaan

API Disediakan oleh Perpustakaan
API Disediakan oleh Perpustakaan
API Disediakan oleh Perpustakaan
API Disediakan oleh Perpustakaan

Termasuk perpustakaan dalam lakaran

Perpustakaan disertakan dalam lakaran dengan cara standard menggunakan penyataan

#sertakan "petanikeith_BMP280.h"

Pernyataan ini perlu disertakan di bahagian awal lakaran sebelum permulaan fungsi setup ().

Membuat objek perisian BME atau BMP

Terdapat 3 tahap untuk membuat objek perisian BMP280. Yang paling mudah adalah adil

bme280 objekNama; atau bmp280 objekName;

contohnya, BMP280 bmp0;

Ini membuat objek perisian dengan alamat lalai 0x76 (iaitu untuk SDO yang disambungkan ke tanah).

Tahap seterusnya untuk membuat objek perisian BME280 atau BMP280 mempunyai parameter sama ada 0 atau 1, seperti berikut:

bme280 objekNameA (0);

bmp280 objekNameB (1);

Parameter (0 atau 1) ditambahkan ke alamat dasar I2C, sehingga dua peranti BME280 atau BMP280 dapat digunakan pada bus I2C yang sama (termasuk masing-masing).

Tahap ketiga untuk membuat objek perisian BME atau BMP280 mempunyai dua parameter. Parameter pertama, sama ada 0 atau 1, adalah untuk alamat, seperti kes sebelumnya. Parameter kedua mengawal pencetakan debug. Jika diatur ke 1, setiap transaksi dengan objek perisian menghasilkan output Serial.print yang memungkinkan pengaturcara untuk melihat perincian transaksi. Sebagai contoh:

bmp280 objekNameB (1, 1);

Jika parameter pencetakan debug ditetapkan ke 0, objek perisian akan kembali ke tingkah laku normal (tidak ada pencetakan).

Pernyataan atau pernyataan ini perlu disertakan selepas fungsi #include dan sebelum setup ().

Memulakan objek perisian BME atau BMP

Sebelum digunakan, perlu membaca parameter kalibrasi dari perangkat, dan mengkonfigurasinya untuk mod pengukuran, sampel berlebihan, dan tetapan penapis yang sesuai.

Untuk permulaan yang sederhana dan umum, pernyataannya adalah:

objectName.begin ();

Versi mula ini () membaca parameter penentukuran dari peranti dan menetapkan osrs_t = 7 (16 pengukuran suhu), osrs_p = 7 (16 pengukuran tekanan), mod = 3 (berterusan, Normal), t_sb = 0 (tidur 0,5 ms antara set pengukuran), penapis = 0 (K = 1, sehingga tidak ada penapisan) dan spiw_en = 0 (SPI dilumpuhkan, jadi gunakan I2C). Dalam kes BME280, terdapat parameter tambahan osrs_h = 7 untuk 16 pengukuran kelembapan.

Terdapat versi permulaan () yang mengambil semua enam (atau 7) parameter. Setara dengan pernyataan di atas adalah

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

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

Senarai lengkap kod dan maknanya terdapat dalam lembaran data BME280 dan BMP280, dan juga dalam komen dalam fail.cpp di perpustakaan.

Pengukuran suhu dan tekanan sederhana

Untuk mendapatkan pengukuran suhu, kaedah paling mudah adalah

suhu berganda = objectName.readTemperature (); // ukur suhu

Untuk mendapatkan pengukuran tekanan, kaedah paling mudah adalah

tekanan berganda = objectName.readPressure (); // ukur tekanan

Untuk mendapatkan pengukuran kelembapan, kaedah paling mudah adalah

kelembapan berganda = objectName.readHumidity (); // ukur kelembapan (BME280 sahaja)

Untuk mendapatkan suhu dan tekanan, dua pernyataan di atas dapat digunakan satu demi satu, tetapi ada pilihan lain, iaitu:

suhu berganda;

tekanan berganda = objectName.readPressure (suhu); // ukur tekanan dan suhu

Pernyataan ini membaca data dari peranti BME280 atau BMP280 hanya sekali, dan mengembalikan suhu dan tekanan. Ini adalah penggunaan bas I2C yang sedikit lebih cekap dan memastikan bahawa dua bacaan sesuai dengan kitaran pengukuran yang sama.

Untuk BME 280, pernyataan gabungan yang mendapat ketiga-tiga nilai (kelembapan, suhu dan tekanan) adalah:

suhu berganda, tekanan; kelembapan berganda = objekName.readHumidity (suhu, tekanan); // ukur kelembapan, tekanan dan suhu

Pernyataan ini membaca data dari peranti BMP280 hanya sekali, dan mengembalikan ketiga-tiga nilai. Ini adalah penggunaan bas I2C yang sedikit lebih efisien dan memastikan bahawa ketiga-tiga bacaan sesuai dengan kitaran pengukuran yang sama. Perhatikan bahawa nama-nama pemboleh ubah dapat diubah menjadi apa sahaja yang disukai pengguna, tetapi susunannya tetap - suhu didahulukan, dan tekanan di tempat kedua.

Kes penggunaan ini diliputi dalam contoh lakaran yang disediakan dengan perpustakaan, iaitu basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino dan basicHumidityAndTemperatureAndPressure.ino.

Pengukuran suhu dan tekanan yang lebih canggih

Walaupun siri pernyataan di atas akan berfungsi tanpa masalah, terdapat beberapa masalah:

  1. peranti ini berjalan berterusan, dan oleh itu menggunakan kuasa pada tahap maksimum. Sekiranya tenaga datang dari bateri, mungkin diperlukan untuk mengurangkan ini.
  2. kerana kuasa yang habis, peranti akan mengalami pemanasan, dan oleh itu suhu yang diukur akan lebih tinggi daripada suhu persekitaran. Saya akan membahas perkara ini dengan lebih terperinci lagi.

Hasil yang menggunakan daya yang lebih sedikit, dan memberikan suhu yang lebih dekat ke ambien, dapat diperoleh dengan menggunakan begin () dengan parameter yang membuatnya mati (mis. Mode = 0). Sebagai contoh:

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

Kemudian, ketika pengukuran diinginkan, bangunkan perangkat dengan perintah konfigurasi untuk mendaftarkan F2 (jika diperlukan) dan F4 yang menetapkan nilai osrs_h, osrs_t dan osrs_p yang sesuai, mod plus = 1 (mod tembakan tunggal). Sebagai contoh:

[objectName.updateF2Control (1);] // osrs_h - tidak pernah diperlukan untuk BMP280, // dan tidak diperlukan untuk BME280 jika Pengukuran tidak diubah // dari nilai yang diberikan pada permulaan (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mod

Setelah bangunkan peranti, alat ini akan mulai mengukur, tetapi hasilnya tidak akan tersedia untuk beberapa milisaat - sekurang-kurangnya 4 ms, mungkin hingga 70 ms atau lebih, bergantung pada jumlah pengukuran yang telah ditentukan. Sekiranya arahan baca segera dihantar, peranti akan mengembalikan nilai dari pengukuran sebelumnya - yang mungkin dapat diterima dalam beberapa aplikasi, tetapi dalam kebanyakan kes, lebih baik ditangguhkan sehingga pengukuran baru tersedia.

Kelewatan ini dapat dilakukan dengan beberapa cara.

  1. tunggu jumlah masa yang tetap untuk menampung jangkaan kelewatan yang paling lama
  2. tunggu jumlah masa yang dikira dari masa pengukuran maksimum setiap pengukuran (iaitu 2.3ms) kali jumlah pengukuran, ditambah overhead, ditambah margin.
  3. tunggu jumlah masa yang lebih pendek dikira seperti di atas, tetapi menggunakan masa pengukuran nominal (iaitu 2 ms) ditambah overhead, dan kemudian mulakan memeriksa bit "Saya sedang mengukur" dalam daftar status. Apabila bit status membaca 0 (iaitu, tidak mengukur), dapatkan bacaan suhu dan tekanan.
  4. segera mula periksa daftar status, dan dapatkan bacaan suhu dan tekanan ketika bit status membaca 0,

Saya akan menunjukkan satu contoh cara melakukan ini sedikit kemudian.

Operasi daftar konfigurasi

Untuk mewujudkan semua ini, kita memerlukan beberapa alat yang belum saya perkenalkan. Mereka adalah:

byte readRegister (reg)

batal kemas kiniPendaftaran (reg, nilai)

Masing-masing mempunyai beberapa perintah yang diturunkan di perpustakaan, yang menjadikan perisian untuk tindakan tertentu sedikit lebih sederhana.

Contoh powerSaverPressureAndTemperature.ino menggunakan kaedah No. 3. Garis kod yang melakukan pemeriksaan berulang adalah

sementara (bmp0.readRegister (0xF3) >> 3); // gelung hingga F3bit 3 == 0

Perhatikan bahawa lakaran ini adalah untuk mikrokontroler ESP8266. Saya menggunakan pro mini WeMos D1. Sketsa tidak akan berfungsi dengan pengawal mikro Atmega, yang mempunyai arahan berbeza untuk tidur. Sketsa ini menggunakan beberapa arahan lain, jadi saya akan memperkenalkan semuanya sebelum menerangkan lakaran tersebut dengan lebih terperinci.

Ketika mikrokontroler tidur selari dengan sensor BMP280, konfigurasi sensor untuk pengukuran yang diperlukan dapat dilakukan pada perintah mulai (), menggunakan 6 parameter. Tetapi jika mikrokontroler tidak tidur, tetapi sensornya, maka pada saat pengukuran sensor harus bangun dan diberitahu konfigurasi pengukurannya. Ini boleh dilakukan secara langsung dengan

updateRegister (reg, nilai)

tetapi sedikit lebih mudah dengan tiga arahan berikut:

kemas kiniF2Control (osrs_h); // BME280 sahaja

kemas kiniF4Control (osrs_t, osrs_p, mod); kemas kiniF5Config (t_sb, filter, spi3W_en);

Setelah pengukuran dilakukan, jika mod yang digunakan adalah Pukulan tunggal (Mod Paksa), maka peranti secara automatik akan kembali tidur. Walau bagaimanapun, jika set pengukuran melibatkan beberapa pengukuran menggunakan mod berterusan (Normal) maka BMP280 perlu ditidurkan. Ini dapat dilakukan dengan salah satu daripada dua perintah berikut:

kemas kiniF4Control16xSleep ();

kemas kiniF4ControlSleep (nilai);

Kedua-duanya menetapkan bit mod ke 00 (iaitu mod tidur). Walau bagaimanapun yang pertama menetapkan osrs_t dan osrs_p ke 111 (iaitu 16 pengukuran) sementara yang kedua menyimpan 6 bit rendah dari "nilai" menjadi bit 7: 2 dari daftar 0xF4.

Begitu juga pernyataan berikut menyimpan enam bit "nilai" yang rendah ke dalam bit 7: 2 dari daftar 0xF5.

kemas kiniF5ConfigSleep (nilai);

Penggunaan perintah terakhir ini membolehkan penyimpanan 12 bit maklumat dalam daftar BMP280 F4 dan F5. Sekurang-kurangnya dalam kes ESP8266, ketika pengawal mikro bangun setelah tidur, ia bermula pada awal lakaran tanpa mengetahui keadaannya sebelum perintah tidur. Untuk menyimpan pengetahuan tentang keadaannya sebelum perintah tidur, data dapat disimpan dalam memori kilat, menggunakan fungsi EEPROM atau dengan menulis file menggunakan SPIFFS. Walau bagaimanapun, memori kilat mempunyai batasan bilangan kitaran penulisan, dari 10, 000 hingga 100, 000. Ini bermaksud bahawa jika mikrokontroler menjalani kitaran tidur-bangun setiap beberapa saat, ia boleh melebihi penulisan memori yang dibenarkan had dalam beberapa bulan. Menyimpan beberapa bit data dalam BMP280 tidak mempunyai batasan seperti itu.

Data yang disimpan di register F4 dan F5 dapat dipulihkan ketika mikrokontroler bangun menggunakan perintah

bacaF4Sleep ();

bacaF5Sleep ();

Fungsi-fungsi ini membaca daftar yang sesuai, mengalihkan kandungannya untuk membuang 2 LSB dan mengembalikan baki 6 bit. Fungsi-fungsi ini digunakan dalam contoh sketsa powerSaverPressureAndTemperatureESP.ino seperti berikut:

// baca nilai EventCounter kembali dari bmp0

bait bmp0F4value = bmp0.readF4Sleep (); // 0 hingga 63 bait bmp0F5value = bmp0.readF5Sleep (); // 0 hingga 63 eventCounter = nilai bmp0F5 * 64 + nilai bmp0F4; // 0 hingga 4095

Fungsi-fungsi ini membaca daftar yang sesuai, mengalihkan kandungannya untuk membuang 2 LSB dan mengembalikan baki 6 bit. Fungsi-fungsi ini digunakan dalam contoh sketsa powerSaverPressureAndTemperature.ino seperti berikut:

// membaca nilai EventCounter kembali dari bmp1

bait bmp1F4value = bmp1.readF4Sleep (); // 0 hingga 63 bait bmp1F5value = bmp1.readF5Sleep (); // 0 hingga 63 eventCounter = nilai bmp1F5 * 64 + nilai bmp1F4; // 0 hingga 4095

Fungsi suhu dan tekanan mentah

Fungsi readTemperature, readPressure dan readHumidity asas mempunyai dua komponen. Mula-mula nilai suhu dan tekanan 20-bit mentah diperoleh dari BME / P280, atau nilai kelembapan 16-bit mentah diperoleh dari BME280. Kemudian algoritma pampasan digunakan untuk menghasilkan nilai output dalam darjah Celsius, hPa atau% RH.

Perpustakaan menyediakan fungsi terpisah untuk komponen ini, sehingga data suhu, tekanan dan kelembapan mentah dapat diperoleh, dan mungkin dimanipulasi dengan beberapa cara. Algoritma untuk mendapatkan suhu, tekanan dan kelembapan dari nilai mentah ini juga disediakan. Di perpustakaan algoritma ini dilaksanakan menggunakan aritmetik titik terapung panjang dua kali. Ia berfungsi dengan baik pada ESP8266 yang merupakan pemproses 32-bit dan menggunakan 64 bit untuk pemboleh ubah float "berganda". Membuat fungsi ini dapat diakses mungkin berguna untuk menilai dan mungkin mengubah pengiraan untuk platform lain.

Fungsi-fungsi ini adalah:

readRawPressure (rawTemperature); // membaca data tekanan dan suhu mentah dari BME / P280readRawHumidity (rawTemperature, rawPressure); // membaca data kelembapan, suhu dan tekanan mentah dari BME280 calcTemperature (rawTemperature, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (kelembapan mentah, t_fine)

Argumen "t-fine" untuk fungsi-fungsi ini perlu dijelaskan sedikit. Kedua-dua algoritma pampasan tekanan dan kelembapan merangkumi komponen bergantung pada suhu yang dicapai melalui pemboleh ubah t_fine. Fungsi calcTemperature menulis nilai dalam t_fine berdasarkan logik algoritma pampasan suhu, yang kemudian digunakan sebagai input dalam calcPressure dan calcHumidity.

Contoh penggunaan fungsi ini boleh didapati dalam contoh lakaran rawPressureAndTemperature.ino, dan juga dalam kod untuk fungsi readHumidity () dalam fail.cpp perpustakaan.

Tekanan ketinggian dan permukaan laut

Terdapat hubungan yang diketahui antara tekanan atmosfera dan ketinggian. Cuaca juga mempengaruhi tekanan. Apabila organisasi cuaca menerbitkan maklumat tekanan atmosfera, mereka biasanya menyesuaikannya dengan ketinggian dan "carta sinoptik" menunjukkan isobar (garis tekanan berterusan) yang diseragamkan untuk bermaksud permukaan laut. Oleh itu, terdapat 3 nilai dalam hubungan ini, dan mengetahui dua daripadanya memungkinkan terjadinya nilai ketiga. 3 nilai tersebut adalah:

  • ketinggian dari aras laut
  • tekanan udara sebenar pada ketinggian itu
  • tekanan udara yang setara di permukaan laut (lebih tegas, rata-rata permukaan laut, kerana permukaan laut seketika sentiasa berubah)

Perpustakaan ini menyediakan dua fungsi untuk hubungan ini, seperti berikut:

calcAltitude (tekanan, seaLevelhPa);

calcNormalisedPressure (tekanan, ketinggian);

Terdapat juga versi yang disederhanakan, yang menganggap tekanan permukaan laut standard 1013.15 hPa.

calcAltitude (tekanan); // standard seaLevelPressure diandaikan

Langkah 3: Butiran Peranti BMP280

Perincian BMP280 Peranti
Perincian BMP280 Peranti

Keupayaan perkakasan

BMP280 mempunyai 2 bait data konfigurasi (di alamat register 0xF4 dan 0xF5) yang digunakan untuk mengendalikan beberapa pilihan pengukuran dan output data. Ini juga memberikan 2 bit informasi status, dan 24 bait parameter penentukuran yang digunakan dalam mengubah nilai suhu dan tekanan mentah menjadi unit suhu dan tekanan konvensional. BME280 mempunyai data tambahan seperti berikut:

  • 1 bait tambahan data konfigurasi pada alamat daftar 0xF2 yang digunakan untuk mengawal beberapa pengukuran kelembapan;
  • 8 bait tambahan parameter penentukuran yang digunakan dalam menukar nilai kelembapan mentah menjadi peratusan kelembapan relatif.

Daftar suhu, tekanan dan status untuk BME280 adalah sama seperti untuk BMP280 dengan pengecualian kecil seperti berikut:

  • bit "ID" BME280 ditetapkan ke 0x60, sehingga dapat dibezakan dari BMP280 yang mungkin 0x56, 0x57 atau 0x58
  • kawalan waktu tidur (t_sb) diubah sehingga dua masa panjang di BMP280 (2000 ms dan 4000 ms) diganti di BME280 dengan masa pendek 10 ms dan 20 ms. Waktu tidur maksimum dalam BME280 adalah 1000 ms.
  • Dalam BME280 suhu dan nilai mentah tekanan selalu 20 bit jika penapisan diterapkan. Penggunaan nilai 16 hingga 19 bit terhad pada kes tanpa penapisan (iaitu penapis = 0).

Suhu dan tekanan masing-masing adalah nilai 20 bit, yang perlu diubah menjadi suhu dan tekanan konvensional melalui algoritma yang agak kompleks menggunakan 3 parameter penentukuran 16 bit untuk suhu, dan parameter penentukuran 9 16 bit ditambah suhu untuk tekanan. Butiran pengukuran suhu adalah 0.0003 darjah Celsius untuk perubahan bit paling sedikit (bacaan 20 bit), meningkat kepada 0.0046 darjah Celsius jika bacaan 16 bit digunakan.

Kelembapan adalah nilai 16 bit yang perlu ditukar menjadi kelembapan relatif melalui algoritma kompleks lain menggunakan 6 parameter penentukuran yang merupakan campuran 8, 12 dan 16 bit.

Lembaran data menunjukkan ketepatan mutlak pembacaan suhu sebagai + -0.5 C pada 25 C dan + -1 C pada julat 0 hingga 65 C.

Butiran pengukuran tekanan adalah 0.15 Pascals (iaitu 0.0015 hectoPascals) pada resolusi 20 bit, atau 2.5 Pascal pada resolusi 16 bit. Nilai tekanan mentah dipengaruhi oleh suhu, sehingga sekitar 25C, peningkatan suhu 1 derajat C menurunkan tekanan yang diukur sebanyak 24 Pascal. Sensitiviti suhu diperhitungkan dalam algoritma penentukuran, jadi nilai tekanan yang disampaikan harus tepat pada suhu yang berbeza.

Lembaran data menunjukkan ketepatan mutlak pembacaan tekanan sebagai + -1 hPa untuk suhu antara 0 C dan 65 C.

Ketepatan kelembapan diberikan dalam lembaran data sebagai + -3% RH, dan + -1% histeresis.

Bagaimana ia berfungsi

24 bait data penentukuran suhu dan tekanan, dan juga dalam hal BME280, 8 bait data penentukuran kelembapan, harus dibaca dari peranti dan disimpan dalam pemboleh ubah. Data ini diprogramkan secara individu ke dalam peranti di kilang, jadi peranti yang berlainan mempunyai nilai yang berbeza - sekurang-kurangnya untuk beberapa parameter. BME / P280 boleh berada di salah satu daripada dua keadaan. Dalam satu keadaan ia mengukur. Dalam keadaan lain sedang menunggu (tidur).

Keadaan mana ia boleh diperiksa dengan melihat bit 3 register 0xF3.

Hasil pengukuran terbaru dapat diperoleh pada bila-bila masa dengan membaca nilai data yang sesuai, tanpa mengira sama ada peranti sedang tidur atau mengukur.

Terdapat juga dua cara mengendalikan BME / P280. Salah satunya ialah mod Berterusan (disebut mod Normal dalam lembaran data) yang berulang kali berpusing antara keadaan Mengukur dan Tidur. Dalam mod ini, peranti melakukan satu set pengukuran, kemudian tidur, kemudian bangun untuk satu set pengukuran lain, dan seterusnya. Jumlah pengukuran individu dan jangka masa tidur dalam kitaran semuanya dapat dikendalikan melalui daftar konfigurasi.

Cara lain untuk mengoperasikan BME / P280 adalah mod Single Shot (dipanggil mod Paksa dalam lembaran data). Dalam mod ini, perangkat terbangun dari tidur dengan perintah untuk mengukur, melakukan satu set pengukuran, kemudian kembali tidur. Bilangan pengukuran individu dalam set dikawal dalam perintah konfigurasi yang membangunkan peranti.

Dalam BMP280, jika satu pengukuran dibuat, 16 bit paling signifikan dalam nilai dihuni, dan empat bit paling tidak signifikan dalam pembacaan nilai adalah semua nol. Bilangan pengukuran dapat ditetapkan menjadi 1, 2, 4, 8 atau 16 dan seiring bertambahnya jumlah pengukuran, jumlah bit yang diisi dengan data meningkat, sehingga dengan 16 pengukuran, semua 20 bit diisi dengan data pengukuran. Lembar data merujuk kepada proses ini sebagai sampel berlebihan.

Dalam BME280, susunan yang sama berlaku selagi hasilnya tidak disaring. Sekiranya penyaringan digunakan, nilainya selalu 20 bit, tanpa mengira berapa ukuran yang diambil dalam setiap kitaran pengukuran.

Setiap ukuran individu mengambil masa kira-kira 2 milisaat (nilai tipikal; nilai maksimum ialah 2.3 ms). Tambahkan ini, overhead tetap sekitar 2 ms (biasanya sedikit kurang) bermaksud bahawa urutan pengukuran, yang boleh terdiri dari 1 hingga 32 pengukuran individu, dapat berlangsung dari 4 ms hingga 66 ms.

Lembar data menyediakan sekumpulan kombinasi suhu dan tekanan yang disarankan secara berlebihan untuk pelbagai aplikasi.

Daftar kawalan konfigurasi

Dua daftar kawalan konfigurasi di BMP280 berada di alamat daftar 0xF4 dan 0xF5, dan dipetakan ke 6 nilai kawalan konfigurasi individu. 0xF4 terdiri daripada:

  • 3 bit osrs_t (mengukur suhu 0, 1, 2, 4, 8 atau 16 kali);
  • 3 bit osrs_p (mengukur tekanan 0, 1, 2, 4, 8 atau 16 kali); dan
  • Mod 2 bit (Tidur, Paksa (iaitu Tembakan Tunggal), Normal (iaitu berterusan).

0xF5 terdiri daripada:

  • 3 bit t_sb (masa bersedia, 0.5ms hingga 4000 ms);
  • Penapis 3 bit (lihat di bawah); dan
  • 1 bit spiw_en yang memilih SPI atau I2C.

Parameter penapis mengawal jenis algoritma peluruhan eksponensial, atau saringan Infinite Impulse Response (IIR), yang diterapkan pada nilai pengukuran tekanan dan suhu mentah (tetapi tidak pada nilai kelembapan). Persamaan diberikan dalam lembaran data. Persembahan lain adalah:

Nilai (n) = Nilai (n-1) * (K-1) / K + pengukuran (n) / K

di mana (n) menunjukkan nilai pengukuran dan output terkini; dan K adalah parameter penapis. Parameter penapis K dan boleh diatur ke 1, 2, 4, 8 atau 16. Sekiranya K diatur ke 1 maka persamaan menjadi Nilai (n) = pengukuran (n). Pengekodan parameter penapis adalah:

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

BME 280 menambah daftar kawalan konfigurasi selanjutnya di alamat 0xF2, "ctrl_hum" dengan satu parameter 3-bit osrs_h (mengukur kelembapan 0, 1, 2, 4, 8 atau 16 kali).

Langkah 4: Pengukuran dan Waktu Pembacaan

Saya merancang untuk menambahkannya kemudian, menunjukkan masa arahan dan tindak balas pengukuran.

Iddt - arus pada pengukuran suhu. Nilai tipikal 325 uA

Iddp - arus pada pengukuran tekanan. Nilai biasa 720 uA, maksimum 1120 uA

Iddsb - semasa dalam mod siap sedia. Nilai tipikal 0.2 uA, maksimum 0.5 uA

Iddsl - semasa dalam mod tidur. Nilai tipikal 0.1 uA, maksimum 0.3 uA

Langkah 5: Garis Panduan Perisian

Garis Panduan Perisian
Garis Panduan Perisian
Garis Panduan Perisian
Garis Panduan Perisian

Mod Burst I2C

Lembaran data BMP280 memberikan panduan mengenai pembacaan data (bahagian 3.9). Ia mengatakan "sangat disarankan untuk menggunakan bacaan cepat dan tidak menangani setiap daftar secara berasingan. Ini akan mencegah kemungkinan percampuran bait yang tergolong dalam ukuran yang berbeza dan mengurangkan lalu lintas antara muka." Tidak ada panduan yang diberikan mengenai pembacaan parameter pampasan / penentukuran. Agaknya ini bukan masalah kerana ia statik dan tidak berubah.

Perpustakaan ini membaca semua nilai bersebelahan dalam operasi baca tunggal - 24 bait dalam hal parameter pampasan suhu dan tekanan, 6 bait untuk gabungan suhu dan tekanan, dan 8 bait untuk gabungan kelembapan, suhu dan tekanan. Apabila suhu sahaja diperiksa, hanya 3 bait dibaca.

Penggunaan makro (#tentukan dll)

Tidak ada makro di perpustakaan ini selain daripada makro "include guard" perpustakaan yang biasa yang menghalang penduaan.

Semua pemalar didefinisikan menggunakan kata kunci const, dan pencetakan debug dikendalikan dengan fungsi C standard.

Ini menjadi sumber ketidakpastian bagi saya, tetapi nasihat yang saya dapat dari membaca banyak catatan mengenai perkara ini ialah penggunaan #define untuk pengisytiharan pemalar (sekurang-kurangnya) dan (mungkin) kawalan pencetakan debug tidak perlu dan tidak diingini.

Kes penggunaan const daripada #define cukup jelas - const menggunakan sumber yang sama dengan #define (iaitu nihil) dan nilai yang dihasilkan mengikuti peraturan merangkumi, sehingga mengurangkan kemungkinan kesalahan.

Kes untuk kawalan pencetakan debug agak kurang jelas, kerana cara saya melakukannya bermaksud bahawa kod akhir mengandungi logik untuk pernyataan pencetakan debug, walaupun tidak pernah dilaksanakan. Sekiranya perpustakaan akan digunakan dalam projek besar pada mikrokontroler dengan memori yang sangat terhad, ini mungkin menjadi masalah. Oleh kerana perkembangan saya menggunakan ESP8266 dengan memori kilat yang besar, ini nampaknya tidak menjadi masalah bagi saya.

Langkah 6: Prestasi Suhu

Saya merancang untuk menambahkannya kemudian.

Langkah 7: Prestasi Tekanan

Saya merancang untuk menambahkannya kemudian.

Disyorkan: