Daftar Isi:

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, Juli
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

pengantar

Saya tidak berangkat untuk menulis perpustakaan ini. Itu "terjadi" sebagai efek samping dari proyek yang saya mulai yang menggunakan BMP280. Proyek itu belum selesai, tapi saya pikir perpustakaan sudah siap untuk berbagi dengan orang lain. Selanjutnya saya harus menggunakan BME280, yang menambahkan pengukuran kelembaban pada kemampuan tekanan dan suhu BMP280. BME280 "kompatibel ke belakang" dengan BMP280 - yaitu, semua register dan langkah-langkah yang diperlukan untuk membaca tekanan dan suhu dari BME280 sama dengan yang digunakan untuk BMP280. Ada register dan langkah tambahan yang diperlukan untuk membaca kelembaban, hanya berlaku untuk BME280. Ini menimbulkan pertanyaan, satu perpustakaan untuk keduanya, atau dua perpustakaan terpisah. Perangkat keras untuk kedua jenis perangkat ini sepenuhnya dapat dipertukarkan. Bahkan banyak modul yang dijual (misalnya di Ebay dan AliExpress) diberi label BME/P280. Untuk mengetahui jenisnya, Anda harus melihat tulisan (miniscule) pada sensor itu sendiri, atau menguji byte ID perangkat. Saya memutuskan untuk pergi ke perpustakaan tunggal. Tampaknya berhasil OK.

Umpan balik, terutama saran untuk perbaikan, akan dihargai.

Fitur dan kemampuan perpustakaan

Pustaka adalah bagian dari perangkat lunak yang menyediakan Antarmuka Pemrograman Aplikasi (API) bagi seorang programmer untuk menggunakan kemampuan perangkat, tanpa harus berurusan dengan semua detail halus. Sebaiknya, API harus mudah bagi pemula dengan persyaratan sederhana untuk memulai, sambil menyediakan eksploitasi penuh dari kemampuan perangkat. Sebaiknya perpustakaan harus mengikuti panduan khusus apa pun dari produsen perangkat, serta praktik umum perangkat lunak yang baik. Saya telah berusaha untuk mencapai semua ini. Saat memulai dengan BMP280, saya menemukan 3 perpustakaan berbeda untuknya: Adafruit_BMP280; Seeed_BMP280; dan satu disebut BMP280 dari produsen perangkat. Baik Adafruit maupun Seeed tidak memberikan kemampuan yang diperluas, meskipun mereka bekerja dengan baik dan mudah digunakan untuk aplikasi dasar. Saya tidak tahu cara menggunakan yang diproduksi oleh produsen perangkat (Bosch Sensortec). Ini mungkin kekurangan saya, bukan kekurangan mereka. Namun perpustakaan jauh lebih rumit daripada dua lainnya, saya tidak dapat menemukan instruksi atau contoh penggunaan (saya kemudian menemukan contoh ada di file "bmp280_support.c", namun ini tidak terlalu membantu saya).

Sebagai hasil dari faktor-faktor ini, saya memutuskan untuk menulis perpustakaan saya sendiri untuk BMP280.

Melihat situasi perpustakaan untuk BME280, saya menemukan perpustakaan terpisah Adafruit_BME280, Seed_BME280 dan satu lagi BME280_MOD-1022 yang ditulis oleh Embedded Adventures. Tak satu pun dari mereka menggabungkan fungsi untuk BMP280 di perpustakaan yang mampu menggunakan BME280. Tak satu pun dari mereka secara eksplisit mendukung kemampuan perangkat untuk menyimpan beberapa bit data saat perangkat dan mikroprosesor pengontrolnya sedang tidur (kemampuan ini terbukti dalam lembar data dan didukung di perpustakaan yang telah saya tulis dan jelaskan di sini).

Pustaka gabungan harus memiliki dukungan untuk semua kemampuan BME280, tetapi bila digunakan dengan BMP280, pustaka tersebut tidak boleh memaksakan overhead apa pun dari fungsi yang tidak digunakan. Manfaat perpustakaan gabungan mencakup lebih sedikit file perpustakaan untuk dikelola, mudah mencampur dan mencocokkan perangkat yang berbeda dalam proyek yang sama, dan perubahan yang disederhanakan untuk pemeliharaan atau peningkatan yang hanya harus dilakukan di satu tempat, bukan di dua tempat. Ini semua mungkin sangat kecil, bahkan tidak signifikan, tapi …

Kemampuan perangkat

BMP280 dan BME280 adalah perangkat pemasangan di permukaan sekitar 5 mm persegi dan tinggi 1 mm. Ada 8 bantalan antarmuka, termasuk 2 bantalan input daya terpisah dan dua bantalan Ground. Mereka tersedia di eBay sebagai modul dengan 4 atau 6 pin yang dikeluarkan. Modul 4-pin memiliki alamat I2C tetap dan tidak dapat dikonfigurasi untuk menggunakan protokol SPI.

Modul 6-pin atau perangkat kosong dapat digunakan dengan protokol I2C atau SPI. Dalam mode I2C dapat memiliki dua alamat yang berbeda, dicapai dengan menghubungkan pin SDO baik ke Ground (untuk alamat dasar = 0x76) atau ke Vdd (untuk alamat dasar +1 = 0x77). Dalam mode SPI memiliki pengaturan biasa 1 jam, 2 data (satu untuk setiap arah) dan pin pilih perangkat (CS).

Pustaka yang saya tulis dan jelaskan di sini hanya mendukung I2C. Pustaka Adafruit_BMP280 dan BME_MOD-1022 memiliki dukungan untuk i2C dan SPI.

Pustaka dapat diunduh di sini:

github.com/farmerkeith/BMP280-library

Langkah 1: Menyiapkan Perangkat Keras

Menyiapkan Perangkat Keras
Menyiapkan Perangkat Keras

Sebelum perpustakaan dapat berguna, perlu untuk menghubungkan mikrokontroler ke BMP280 (atau ke dua dari mereka jika Anda mau).

Saya menggunakan mini pro WeMos D1, jadi saya akan menunjukkan koneksinya. Mikrokontroler lain akan serupa, Anda hanya perlu menghubungkan pin SDA dan SCL dengan benar.

Untuk WeMos D1 mini pro, koneksinya adalah:

Fungsi WeMos pin BMP280 pin Catatan

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

Perhatikan bahwa pin SDO pada beberapa modul MP280 diberi label SDD, dan pin Vdd mungkin diberi label VCC. Catatan: Saluran SDA dan SCL harus memiliki resistor pull-up antara saluran dan pin Vin. Biasanya nilai 4.7K seharusnya OK. Beberapa modul BMP280 dan BME280 memiliki resistor pull-up 10K yang disertakan dalam modul (yang bukan praktik yang baik, karena menempatkan beberapa perangkat pada bus I2C dapat memuatnya secara berlebihan). Namun menggunakan 2 modul BME/P280 masing-masing dengan resistor 10K seharusnya tidak menjadi masalah dalam praktiknya selama tidak terlalu banyak perangkat lain pada bus yang sama juga dengan resistor pull-up.

Setelah perangkat keras terhubung, Anda dapat dengan mudah memeriksa apakah perangkat Anda adalah BMP280 atau BME280 dengan menjalankan sketsa I2CScan_ID yang dapat Anda temukan di sini:

Anda juga dapat memeriksa apakah Anda memiliki BMP280 atau BME280 dengan melihat perangkat itu sendiri. Saya merasa perlu menggunakan mikroskop digital untuk melakukan ini, tetapi jika penglihatan Anda sangat baik, Anda mungkin dapat melakukannya tanpa bantuan apa pun. Ada dua garis pencetakan pada casing perangkat. Kuncinya adalah huruf pertama pada baris kedua, yang dalam kasus perangkat BMP280 adalah "K" dan dalam kasus perangkat BME280 adalah "U".

Langkah 2: API yang Disediakan oleh Perpustakaan

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

Termasuk perpustakaan dalam sketsa

Perpustakaan disertakan dalam sketsa dengan cara standar menggunakan pernyataan

#sertakan "farmerkeith_BMP280.h"

Pernyataan ini perlu disertakan di bagian awal sketsa sebelum dimulainya fungsi setup().

Membuat objek perangkat lunak BME atau BMP

Ada 3 level untuk membuat objek software BMP280. Yang paling sederhana adalah

bme280 nama objek; atau bmp280 objectName;

misalnya, BMP280 bmp0;

Ini membuat objek perangkat lunak dengan alamat default 0x76 (yaitu untuk SDO yang terhubung ke ground).

Level selanjutnya untuk membuat objek perangkat lunak BME280 atau BMP280 memiliki parameter 0 atau 1, sebagai berikut:

bme280 objectNameA(0);

bmp280 objectNameB(1);

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

Tingkat ketiga untuk membuat objek perangkat lunak BME atau BMP280 memiliki dua parameter. Parameter pertama, yaitu 0 atau 1, adalah untuk alamat, seperti untuk kasus sebelumnya. Parameter kedua mengontrol pencetakan debug. Jika disetel ke 1, setiap transaksi dengan objek perangkat lunak menghasilkan output Serial.print yang memungkinkan programmer melihat detail transaksi. Sebagai contoh:

bmp280 objectNameB(1, 1);

Jika parameter pencetakan debug diatur ke 0, objek perangkat lunak kembali ke perilaku normal (tidak ada pencetakan).

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

Menginisialisasi objek perangkat lunak BME atau BMP

Sebelum digunakan, perlu untuk membaca parameter kalibrasi dari perangkat, dan mengkonfigurasinya untuk mode pengukuran apa pun, pengambilan sampel berlebih, dan pengaturan filter yang sesuai.

Untuk inisialisasi tujuan umum yang sederhana, pernyataannya adalah:

namaobjek.mulai();

Versi begin() ini membaca parameter kalibrasi dari perangkat dan menetapkan osrs_t=7 (16 pengukuran suhu), osrs_p=7 (16 pengukuran tekanan), mode=3 (berkelanjutan, Normal), t_sb=0 (0,5 ms tidur antara set pengukuran), filter=0 (K=1, jadi tidak ada pemfilteran) dan spiw_en=0 (SPI dinonaktifkan, jadi gunakan I2C). Dalam kasus BME280, ada parameter tambahan osrs_h=7 untuk 16 pengukuran kelembaban.

Ada versi lain dari begin() yang mengambil semua enam (atau 7) parameter. Persamaan dari 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

Daftar lengkap kode dan artinya ada di lembar data BME280 dan BMP280, dan juga di komentar di file.cpp di perpustakaan.

Pengukuran suhu dan tekanan sederhana

Untuk mendapatkan pengukuran suhu cara paling sederhana adalah

double temperature=objectName.readTemperature(); // mengukur suhu

Untuk mendapatkan pengukuran tekanan cara paling sederhana adalah

double pressure=objectName.readPressure(); // mengukur tekanan

Untuk mendapatkan pengukuran kelembaban cara yang paling sederhana adalah

kelembaban ganda=objectName.readHumidity(); // mengukur kelembaban (hanya BME280)

Untuk mendapatkan suhu dan tekanan, kedua pernyataan di atas dapat digunakan satu demi satu, tetapi ada opsi lain, yaitu:

suhu ganda;

double pressure=objectName.readPressure (suhu); // mengukur tekanan dan suhu

Pernyataan ini membaca data dari perangkat BME280 atau BMP280 hanya sekali, dan mengembalikan suhu dan tekanan. Ini adalah penggunaan bus I2C yang sedikit lebih efisien dan memastikan bahwa kedua pembacaan sesuai dengan siklus pengukuran yang sama.

Untuk BME 280, pernyataan gabungan yang mendapatkan ketiga nilai (kelembaban, suhu dan tekanan) adalah:

suhu ganda, tekanan;kelembaban ganda=objectName.readHumidity (suhu, tekanan); // mengukur kelembaban, tekanan dan suhu

Pernyataan ini membaca data dari perangkat BMP280 hanya sekali, dan mengembalikan ketiga nilai tersebut. Ini adalah penggunaan bus I2C yang sedikit lebih efisien dan memastikan bahwa ketiga pembacaan sesuai dengan siklus pengukuran yang sama. Perhatikan bahwa nama variabel dapat diubah menjadi apa pun yang disukai pengguna, tetapi urutannya tetap - suhu didahulukan, dan tekanan di urutan kedua.

Kasus penggunaan ini tercakup dalam contoh sketsa yang disediakan dengan perpustakaan, menjadi basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino, dan basicHumidityAndTemperatureAndPressure.ino.

Pengukuran suhu dan tekanan yang lebih canggih

Meskipun rangkaian pernyataan di atas akan berfungsi tanpa masalah, ada beberapa masalah:

  1. perangkat berjalan terus menerus, dan oleh karena itu menghabiskan daya pada tingkat maksimumnya. Jika energi berasal dari baterai, mungkin perlu untuk menguranginya.
  2. karena daya yang dikonsumsi, perangkat akan mengalami pemanasan, dan oleh karena itu suhu yang diukur akan lebih tinggi dari suhu sekitar. Saya akan membahas ini lebih lanjut di langkah selanjutnya.

Hasil yang menggunakan lebih sedikit daya, dan memberikan suhu yang lebih mendekati ambient, dapat diperoleh dengan menggunakan begin() dengan parameter yang membuatnya tertidur (misalnya 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 yang sesuai untuk osrs_h, osrs_t dan osrs_p, plus mode=1 (mode bidikan tunggal). Sebagai contoh:

[objectName.updateF2Control(1);] // osrs_h - tidak pernah diperlukan untuk BMP280, // dan tidak diperlukan untuk BME280 jika Jumlah pengukuran tidak diubah // dari nilai yang diberikan di begin(). objectName.updateF4Control(1, 1, 1); // osrs_t, osrs_p, mode

Setelah membangunkan perangkat, itu akan mulai mengukur, tetapi hasilnya tidak akan tersedia selama beberapa milidetik - setidaknya 4 ms, mungkin hingga 70 ms atau lebih, tergantung pada jumlah pengukuran yang telah ditentukan. Jika perintah baca segera dikirim, perangkat akan mengembalikan nilai dari pengukuran sebelumnya - yang mungkin dapat diterima di beberapa aplikasi, tetapi dalam banyak kasus mungkin lebih baik untuk menunda hingga pengukuran baru tersedia.

Penundaan ini dapat dilakukan dengan beberapa cara.

  1. menunggu jumlah waktu yang tetap untuk menutupi penundaan terlama yang diharapkan
  2. menunggu sejumlah waktu yang dihitung dari waktu pengukuran maksimum per pengukuran (yaitu 2,3 ms) dikalikan jumlah pengukuran, ditambah overhead, ditambah margin.
  3. tunggu waktu yang lebih singkat dihitung seperti di atas, tetapi menggunakan waktu pengukuran nominal (yaitu 2 ms) ditambah overhead, dan kemudian mulai memeriksa bit "Saya sedang mengukur" di register status. Ketika bit status membaca 0 (yaitu, tidak mengukur), dapatkan pembacaan suhu dan tekanan.
  4. segera mulai memeriksa register status, dan dapatkan pembacaan suhu dan tekanan ketika bit status membaca 0,

Saya akan menunjukkan contoh salah satu cara untuk melakukan ini nanti.

Operasi register konfigurasi

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

byte readRegister(reg)

void updateRegister(reg, nilai)

Masing-masing memiliki beberapa perintah turunan di perpustakaan, yang membuat perangkat lunak untuk tindakan tertentu sedikit lebih sederhana.

Contoh powerSaverPressureAndTemperature.ino menggunakan metode No. 3. Baris kode yang melakukan pengecekan berulang adalah

while (bmp0.readRegister(0xF3)>>3); // loop sampai F3bit 3 ==0

Perhatikan bahwa sketsa ini untuk mikrokontroler ESP8266. Saya menggunakan mini pro WeMos D1. Sketsa tidak akan berfungsi dengan mikrokontroler Atmega, yang memiliki instruksi berbeda untuk tidur. Sketsa ini melatih beberapa perintah lain, jadi saya akan memperkenalkan semuanya sebelum menjelaskan sketsa itu secara lebih rinci.

Saat mikrokontroler tidur secara paralel dengan sensor BMP280, konfigurasi sensor untuk pengukuran yang diperlukan dapat dilakukan dalam perintah begin(), menggunakan 6 parameter. Namun jika mikrokontroler tidak tidur, tetapi sensornya, maka pada saat pengukuran sensor harus dibangunkan dan diberitahukan konfigurasi pengukurannya. Ini dapat dilakukan secara langsung dengan

updateRegister(reg, nilai)

tetapi sedikit lebih mudah dengan tiga perintah berikut:

updateF2Control(osrs_h); // hanya BME280

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

Setelah pengukuran selesai, jika mode yang digunakan adalah Single shot (Forced mode), maka secara otomatis perangkat akan kembali tidur. Namun, jika set pengukuran melibatkan beberapa pengukuran menggunakan mode kontinu (Normal), maka BMP280 perlu ditidurkan kembali. Ini dapat dilakukan dengan salah satu dari dua perintah berikut:

updateF4Control16xSleep();

updateF4ControlSleep(nilai);

Keduanya mengatur bit mode ke 00 (yaitu mode tidur). Namun yang pertama menetapkan osrs_t dan osrs_p ke 111 (yaitu 16 pengukuran) sedangkan yang kedua menyimpan 6 bit rendah dari "nilai" menjadi bit 7:2 dari register 0xF4.

Demikian pula pernyataan berikut menyimpan enam bit rendah dari "nilai" ke dalam bit 7:2 dari register 0xF5.

updateF5ConfigSleep(nilai);

Penggunaan perintah terakhir ini memungkinkan penyimpanan 12 bit informasi dalam register BMP280 F4 dan F5. Setidaknya dalam kasus ESP8266, ketika mikrokontroler bangun setelah periode tidur, ia memulai dari awal sketsa tanpa mengetahui statusnya sebelum perintah tidur. Untuk menyimpan pengetahuan tentang statusnya sebelum perintah tidur, data dapat disimpan dalam memori flash, baik menggunakan fungsi EEPROM atau dengan menulis file menggunakan SPIFFS. Namun memori flash memiliki batasan jumlah siklus tulis, dari urutan 10.000 hingga 100.000. Ini berarti bahwa jika mikrokontroler mengalami siklus tidur-bangun setiap beberapa detik, itu dapat melebihi memori tulis yang diizinkan. batas dalam beberapa bulan. Menyimpan beberapa bit data di BMP280 tidak memiliki batasan seperti itu.

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

bacaF4Tidur();

bacaF5Tidur();

Fungsi-fungsi ini membaca register yang sesuai, menggeser konten untuk menghapus 2 LSB dan mengembalikan 6 bit yang tersisa. Fungsi-fungsi ini digunakan dalam contoh sketsa powerSaverPressureAndTemperatureESP.ino sebagai berikut:

// baca nilai EventCounter kembali dari bmp0

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

Fungsi-fungsi ini membaca register yang sesuai, menggeser konten untuk menghapus 2 LSB dan mengembalikan 6 bit yang tersisa. Fungsi-fungsi ini digunakan dalam contoh sketsa powerSaverPressureAndTemperature.ino sebagai berikut:

// baca nilai EventCounter kembali dari bmp1

byte bmp1F4value= bmp1.readF4Sleep(); // 0 hingga 63 byte 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 dasar memiliki dua komponen. Pertama, nilai suhu dan tekanan 20-bit mentah diperoleh dari BME/P280, atau nilai kelembaban 16-bit mentah diperoleh dari BME280. Kemudian algoritma kompensasi digunakan untuk menghasilkan nilai output dalam derajat Celcius, hPa atau %RH.

Pustaka menyediakan fungsi terpisah untuk komponen ini, sehingga data suhu, tekanan, dan kelembapan mentah dapat diperoleh, dan mungkin dimanipulasi dengan cara tertentu. Algoritme untuk menurunkan suhu, tekanan, dan kelembapan dari nilai mentah ini juga disediakan. Di perpustakaan algoritma ini diimplementasikan menggunakan aritmatika floating point panjang ganda. Ini bekerja dengan baik pada ESP8266 yang merupakan prosesor 32-bit dan menggunakan 64 bit untuk variabel float "ganda". Membuat fungsi-fungsi ini dapat diakses mungkin berguna untuk menilai dan mungkin mengubah perhitungan untuk platform lain.

Fungsi-fungsi ini adalah:

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

Argumen "t-baik" untuk fungsi-fungsi ini perlu sedikit penjelasan. Baik algoritma kompensasi tekanan dan kelembaban menyertakan komponen yang bergantung pada suhu yang dicapai melalui variabel t_fine. Fungsi calcTemperature menulis nilai dalam t_fine berdasarkan logika algoritma kompensasi suhu, yang kemudian digunakan sebagai input di calcPressure dan calcHumidity.

Contoh penggunaan fungsi ini dapat ditemukan dalam contoh sketsa rawPressureAndTemperature.ino, dan juga dalam kode untuk fungsi readHumidity() dalam file.cpp library.

Ketinggian dan tekanan Permukaan Laut

Ada hubungan yang diketahui antara tekanan atmosfer dan ketinggian. Cuaca juga mempengaruhi tekanan. Ketika organisasi cuaca mempublikasikan informasi tekanan atmosfer, mereka biasanya menyesuaikannya untuk ketinggian sehingga "bagan sinoptik" menunjukkan isobar (garis tekanan konstan) yang distandarisasi untuk rata-rata permukaan laut. Jadi sebenarnya ada 3 nilai dalam hubungan ini, dan mengetahui dua di antaranya memungkinkan derivasi dari yang ketiga. 3 nilai tersebut adalah:

  • ketinggian di atas permukaan laut
  • tekanan udara aktual pada ketinggian tersebut
  • tekanan udara setara di permukaan laut (lebih tepatnya, permukaan laut rata-rata, karena permukaan laut seketika terus berubah)

Pustaka ini menyediakan dua fungsi untuk hubungan ini, sebagai berikut:

calcAltitude (tekanan, seaLevelhPa);

calcNormalizedTekanan (tekanan, ketinggian);

Ada juga versi yang disederhanakan, yang mengasumsikan tekanan permukaan laut standar 1013,15 hPa.

calcAltitude (tekanan); // standar seaLevelPressure diasumsikan

Langkah 3: Detail Perangkat BMP280

Detail Perangkat BMP280
Detail Perangkat BMP280

Kemampuan perangkat keras

BMP280 memiliki 2 byte data konfigurasi (pada alamat register 0xF4 dan 0xF5) yang digunakan untuk mengontrol beberapa opsi pengukuran dan keluaran data. Ini juga menyediakan 2 bit informasi status, dan 24 byte parameter kalibrasi yang digunakan dalam mengubah nilai suhu dan tekanan mentah menjadi unit suhu dan tekanan konvensional. BME280 memiliki data tambahan sebagai berikut:

  • 1 byte tambahan data konfigurasi pada alamat register 0xF2 yang digunakan untuk mengontrol beberapa pengukuran kelembaban;
  • 8 byte tambahan parameter kalibrasi yang digunakan dalam mengubah nilai kelembaban mentah menjadi persentase kelembaban relatif.

Suhu, tekanan, dan register status untuk BME280 sama dengan BMP280 dengan pengecualian kecil sebagai berikut:

  • bit "ID" dari BME280 diatur ke 0x60, sehingga dapat dibedakan dari BMP280 yang mungkin 0x56, 0x57 atau 0x58
  • kontrol waktu tidur (t_sb) diubah sehingga dua waktu lama di BMP280 (2000 ms dan 4000 ms) diganti di BME280 dengan waktu singkat 10 ms dan 20 ms. Waktu tidur maksimum di BME280 adalah 1000 ms.
  • Di BME280, nilai mentah suhu dan tekanan selalu 20 bit jika penyaringan diterapkan. Penggunaan nilai 16 sampai 19 bit terbatas pada kasus tanpa penyaringan (yaitu filter=0).

Suhu dan tekanan masing-masing 20 bit nilai, yang perlu diubah menjadi suhu dan tekanan konvensional melalui algoritma yang agak rumit menggunakan 3 parameter kalibrasi 16 bit untuk suhu, dan 9 parameter kalibrasi 16 bit ditambah suhu untuk tekanan. Granulasi pengukuran suhu adalah 0,0003 derajat Celcius untuk perubahan bit yang paling tidak signifikan (pembacaan 20 bit), meningkat menjadi 0,0046 derajat Celcius jika pembacaan 16 bit digunakan.

Kelembaban adalah nilai 16 bit yang perlu diubah menjadi kelembaban relatif melalui algoritma kompleks lainnya menggunakan 6 parameter kalibrasi yang merupakan campuran 8, 12 dan 16 bit.

Lembar data menunjukkan akurasi absolut dari pembacaan suhu sebagai +-0,5 C pada 25 C dan +-1 C selama rentang 0 hingga 65 C.

Perincian pengukuran tekanan adalah 0,15 Pascal (yaitu 0,0015 hectoPascals) pada resolusi 20 bit, atau 2,5 Pascal pada resolusi 16 bit. Nilai tekanan mentah dipengaruhi oleh suhu, sehingga sekitar 25C, kenaikan suhu 1 derajat C menurunkan tekanan terukur sebesar 24 Pascal. Sensitivitas suhu diperhitungkan dalam algoritme kalibrasi, sehingga nilai tekanan yang diberikan harus akurat pada suhu yang berbeda.

Lembar data menunjukkan akurasi absolut dari pembacaan tekanan sebagai +-1 hPa untuk suhu antara 0 C dan 65 C.

Akurasi kelembaban diberikan dalam lembar data sebagai +-3% RH, dan histeresis +-1%.

Bagaimana itu bekerja

24 byte data kalibrasi suhu dan tekanan, dan juga dalam kasus BME280, 8 byte data kalibrasi kelembaban, harus dibaca dari perangkat dan disimpan dalam variabel. Data ini diprogram secara individual ke dalam perangkat di pabrik, sehingga perangkat yang berbeda memiliki nilai yang berbeda - setidaknya untuk beberapa parameter. BME/P280 dapat berada di salah satu dari dua status. Dalam satu keadaan itu mengukur. Di negara lain sedang menunggu (tidur).

Status mana yang ada dapat diperiksa dengan melihat bit 3 dari register 0xF3.

Hasil pengukuran terbaru dapat diperoleh kapan saja dengan membaca nilai data yang sesuai, terlepas dari apakah perangkat sedang tidur atau mengukur.

Ada juga dua cara mengoperasikan BME/P280. Salah satunya adalah mode Continuous (disebut mode Normal di lembar data) yang berulang kali berputar antara status Pengukuran dan Tidur. Dalam mode ini, perangkat melakukan serangkaian pengukuran, lalu tidur, lalu bangun untuk serangkaian pengukuran lain, dan seterusnya. Jumlah pengukuran individu dan durasi bagian tidur dari siklus semuanya dapat dikontrol melalui register konfigurasi.

Cara lain mengoperasikan BME/P280 adalah mode Pemotretan Tunggal (disebut mode Paksa dalam lembar data). Dalam mode ini perangkat dibangunkan dari tidur dengan perintah untuk mengukur, melakukan serangkaian pengukuran, lalu kembali tidur. Jumlah pengukuran individu dalam set dikontrol dalam perintah konfigurasi yang membangunkan perangkat.

Dalam BMP280, jika pengukuran tunggal dilakukan, 16 bit paling signifikan dalam nilai akan terisi, dan empat bit paling tidak signifikan dalam pembacaan nilai semuanya nol. Jumlah pengukuran dapat diatur ke 1, 2, 4, 8 atau 16 dan dengan bertambahnya jumlah pengukuran, jumlah bit yang diisi dengan data meningkat, sehingga dengan 16 pengukuran semua 20 bit diisi dengan data pengukuran. Lembar data mengacu pada proses ini sebagai oversampling.

Di BME280, pengaturan yang sama berlaku selama hasilnya tidak disaring. Jika penyaringan digunakan, nilainya selalu 20 bit, terlepas dari berapa banyak pengukuran yang dilakukan dalam setiap siklus pengukuran.

Setiap pengukuran individu membutuhkan waktu sekitar 2 milidetik (nilai tipikal; nilai maksimum adalah 2,3 ms). Tambahkan ke overhead tetap sekitar 2 ms (biasanya sedikit kurang) berarti bahwa urutan pengukuran, yang dapat terdiri dari 1 hingga 32 pengukuran individu, dapat berlangsung dari 4 ms hingga 66 ms.

Lembar data menyediakan satu set kombinasi yang direkomendasikan dari oversampling suhu dan tekanan untuk berbagai aplikasi.

Register kontrol konfigurasi

Dua register kontrol konfigurasi di BMP280 berada di alamat register 0xF4 dan 0xF5, dan dipetakan ke 6 nilai kontrol konfigurasi individu. 0xF4 terdiri dari:

  • 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
  • 2 bit Mode (Sleep, Forced (yaitu Single Shot), Normal (yaitu continuous).

0xF5 terdiri dari:

  • 3 bit t_sb (waktu siaga, 0,5 ms hingga 4000 ms);
  • Filter 3 bit (lihat di bawah); dan
  • 1 bit spiw_en yang memilih SPI atau I2C.

Parameter filter mengontrol jenis algoritme peluruhan eksponensial, atau filter Infinite Impulse Response (IIR), diterapkan pada nilai pengukuran tekanan dan suhu mentah (tetapi tidak pada nilai kelembaban). Persamaan diberikan dalam lembar data. Presentasi lainnya adalah:

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

di mana (n) menunjukkan pengukuran dan nilai keluaran terbaru; dan K adalah parameter filter. Parameter filter K dan dapat diatur ke 1, 2, 4, 8 atau 16. Jika K diset ke 1 persamaan menjadi Nilai(n) = pengukuran(n). Pengkodean parameter filter adalah:

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

BME 280 menambahkan register kontrol konfigurasi lebih lanjut di alamat 0xF2, "ctrl_hum" dengan parameter 3-bit tunggal osrs_h (mengukur kelembaban 0, 1, 2, 4, 8 atau 16 kali).

Langkah 4: Pengukuran dan Waktu Pembacaan

Saya berencana untuk menambahkan ini nanti, menunjukkan waktu perintah dan respons pengukuran.

Iddt - arus pada pengukuran suhu. Nilai tipikal 325 uA

Iddp - arus pada pengukuran tekanan. Nilai tipikal 720 uA, maks. 1120 uA

Iddsb - saat ini dalam mode siaga. Nilai tipikal 0,2 uA, maks 0,5 uA

Iddsl - saat ini dalam mode tidur. Nilai tipikal 0,1 uA, maks 0,3 uA

Langkah 5: Panduan Perangkat Lunak

Pedoman Perangkat Lunak
Pedoman Perangkat Lunak
Pedoman Perangkat Lunak
Pedoman Perangkat Lunak

Mode ledakan I2C

Lembar data BMP280 memberikan panduan tentang pembacaan data (bagian 3.9). Dikatakan "sangat disarankan untuk menggunakan burst read dan tidak menangani setiap register satu per satu. Ini akan mencegah kemungkinan tercampurnya byte milik pengukuran yang berbeda dan mengurangi lalu lintas antarmuka." Tidak ada panduan yang diberikan mengenai pembacaan parameter kompensasi/kalibrasi. Agaknya ini bukan masalah karena statis dan tidak berubah.

Pustaka ini membaca semua nilai yang berdekatan dalam satu operasi baca - 24 byte untuk parameter kompensasi suhu dan tekanan, 6 byte untuk gabungan suhu dan tekanan, dan 8 byte untuk gabungan kelembaban, suhu, dan tekanan. Ketika suhu saja diperiksa, hanya 3 byte yang dibaca.

Penggunaan makro (#define dll.)

Tidak ada makro di perpustakaan ini selain dari perpustakaan biasa "termasuk penjaga" makro yang mencegah duplikasi.

Semua konstanta didefinisikan menggunakan kata kunci const, dan pencetakan debug dikontrol dengan fungsi C standar.

Ini telah menjadi sumber ketidakpastian bagi saya, tetapi saran yang saya dapatkan dari membaca banyak posting tentang hal ini adalah bahwa penggunaan #define untuk deklarasi konstanta (setidaknya) dan (mungkin) kontrol pencetakan debug tidak perlu dan tidak diinginkan.

Kasus penggunaan const daripada #define cukup jelas - const menggunakan sumber daya yang sama seperti #define (yaitu nil) dan nilai yang dihasilkan mengikuti aturan pelingkupan, sehingga mengurangi kemungkinan kesalahan.

Kasus untuk kontrol pencetakan debug agak kurang jelas, karena cara saya melakukannya berarti bahwa kode terakhir berisi logika untuk pernyataan pencetakan debug, meskipun tidak pernah dijalankan. Jika perpustakaan akan digunakan dalam proyek besar pada mikrokontroler dengan memori yang sangat terbatas, ini mungkin menjadi masalah. Karena pengembangan saya menggunakan ESP8266 dengan memori flash yang besar, ini sepertinya tidak menjadi masalah bagi saya.

Langkah 6: Kinerja Suhu

Saya berencana untuk menambahkan ini nanti.

Langkah 7: Kinerja Tekanan

Saya berencana untuk menambahkan ini nanti.

Direkomendasikan: