Mundarija:

BMP280 va BME280 uchun kutubxona: 7 qadam
BMP280 va BME280 uchun kutubxona: 7 qadam

Video: BMP280 va BME280 uchun kutubxona: 7 qadam

Video: BMP280 va BME280 uchun kutubxona: 7 qadam
Video: Lesson 34: Using MCP9808 Temperature Sensor with TM1637 screen | Arduino Step By Step Course 2024, Iyul
Anonim
BMP280 va BME280 uchun kutubxona
BMP280 va BME280 uchun kutubxona
BMP280 va BME280 uchun kutubxona
BMP280 va BME280 uchun kutubxona
BMP280 va BME280 uchun kutubxona
BMP280 va BME280 uchun kutubxona

Kirish

Men bu kutubxonani yozishni maqsad qilmaganman. Bu men boshlagan loyihaning yon ta'siri sifatida "sodir bo'ldi" BMP280. Bu loyiha hali tugallanmagan, lekin menimcha, kutubxona boshqalar bilan bo'lishishga tayyor. Keyinchalik BMP280 ning bosimi va haroratiga namlik o'lchovini qo'shadigan BME280 -dan foydalanish kerak bo'ldi. BME280 BMP280 bilan "orqaga qarab mos keladi", ya'ni BME280 dan bosim va haroratni o'qish uchun zarur bo'lgan barcha registrlar va qadamlar BMP280 uchun ishlatilganlar bilan bir xil. Namlikni o'qish uchun faqat BME280 uchun qo'llaniladigan qo'shimcha registrlar va qadamlar mavjud. Bu savol tug'iladi, ikkalasi uchun bitta kutubxona yoki ikkita alohida kutubxona. Ikkita turdagi qurilmalar uchun uskunalar to'liq almashtiriladi. Hatto sotiladigan ko'plab modullar (masalan, Ebay va AliExpress -da) BME/P280 bilan belgilanadi. Qaysi turdagi ekanligini bilish uchun siz sensorning o'zida yozilgan (kichik) yozuvga qarashingiz yoki qurilma identifikatori baytini sinab ko'rishingiz kerak. Men bitta kutubxonaga borishga qaror qildim. Yaxshi ishlaganga o'xshaydi.

Fikr -mulohazalar, ayniqsa, takomillashtirish bo'yicha har qanday takliflar minnatdor bo'ladi.

Kutubxonaning xususiyatlari va imkoniyatlari

Kutubxona-bu dasturchi uchun barcha kerakli nozik detallar bilan ishlashga hojat qoldirmasdan, qurilmaning imkoniyatlarini ishga solishi uchun dasturchi uchun dasturiy interfeysni (API) ta'minlaydigan dasturiy ta'minot. Qurilmaning imkoniyatlaridan to'liq foydalanishni ta'minlagan holda, API oddiy talablarni boshlagan kishi uchun oson bo'lishi kerak. Xohlasangiz, kutubxona qurilma ishlab chiqaruvchisining har qanday aniq ko'rsatmalariga, shuningdek umumiy dasturiy ta'minotning yaxshi amaliyotiga amal qilishi kerak. Men bularning barchasiga erishishga harakat qildim. BMP280 bilan ishlashni boshlaganimda, men buning uchun 3 xil kutubxonani topdim: Adafruit_BMP280; Seeed_BMP280; va qurilma ishlab chiqaruvchisidan BMP280 deb nomlangan. Adafruit ham, Seeed ham kengaytirilgan imkoniyatlarni taqdim etmadi, garchi ular yaxshi ishlagan va asosiy dasturlarda ishlatish oson bo'lgan. Qurilma ishlab chiqaruvchisi (Bosch Sensortec) ishlab chiqarganidan qanday foydalanishni tushunolmadim. Bu ularning etishmasligidan ko'ra, mening kamchilikim bo'lishi mumkin. Ammo kutubxona boshqa ikkisiga qaraganda ancha murakkabroq edi, men hech qanday ko'rsatma yoki foydalanish misolini topa olmadim (keyinchalik misollar "bmp280_support.c" faylida topilgan, lekin bu men uchun ayniqsa foydali bo'lmagan).

Bu omillar natijasida men BMP280 uchun o'z kutubxonamni yozishga qaror qildim.

BME280 uchun kutubxona holatini ko'rib, men Adafruit_BME280, Seed_BME280 va Embedded Adventures tomonidan yozilgan BME280_MOD-1022 alohida kutubxonalarini topdim. Ularning hech biri BME280 -ni ishlata oladigan kutubxonada BMP280 funktsiyasini birlashtirmagan. Ularning hech biri qurilma va uning boshqaruvchi mikroprotsessori uxlab yotgan paytda bir nechta ma'lumotlarni saqlash qobiliyatini aniq qo'llab -quvvatlamadi (bu imkoniyat ma'lumotlar jadvalida yaqqol ko'rinib turadi va men yozgan va bu erda tasvirlangan kutubxonada qo'llab -quvvatlanadi).

Birlashtirilgan kutubxona BME280 -ning barcha imkoniyatlarini qo'llab -quvvatlashi kerak, lekin BMP280 bilan ishlatilganda, u ishlatilmaydigan funktsiyalardan ortiqcha yuklamasligi kerak. Kombinatsiyalangan kutubxonaning afzalliklari orasida kutubxona fayllarini boshqarish, bir xil loyihada har xil qurilmalarni osonlikcha aralashtirish va texnik xizmat ko'rsatish yoki yangilash uchun soddalashtirilgan o'zgartirishlar mavjud, ularni faqat ikkitasi emas, balki bir joyda bajarish kerak. Ehtimol, bularning barchasi juda kichik, hatto ahamiyatsiz, lekin …

Qurilmaning imkoniyatlari

BMP280 va BME280-5 mm kvadrat va balandligi taxminan 1 mm bo'lgan sirtga o'rnatiladigan qurilmalar. 8 ta interfeysli prokladkalar mavjud, ular orasida 2 ta alohida kirish joyi va ikkita Ground pad bor. Ular eBay -da 4 yoki 6 ta pinli modul sifatida mavjud. 4-pinli modul I2C sobit manziliga ega va uni SPI protokolidan foydalanish uchun sozlash mumkin emas.

6-pinli modul yoki yalang'och qurilma I2C yoki SPI protokollari bilan ishlatilishi mumkin. I2C rejimida u SDO pinini yerga (asosiy manzil = 0x76 uchun) yoki Vddga (+1 = 0x77 tayanch manzili uchun) ulash orqali erishiladigan ikki xil manzilga ega bo'lishi mumkin. SPI rejimida odatdagidek 1 soat, 2 ta ma'lumotlar (har bir yo'nalish uchun bittadan) va qurilmani tanlash pimi (CS) mavjud.

Men yozgan va ta'riflagan kutubxona faqat I2C ni qo'llab -quvvatlaydi. Adafruit_BMP280 va BME_MOD-1022 kutubxonalari i2C va SPI-ni qo'llab-quvvatlaydi.

Kutubxonani bu yerdan yuklab olish mumkin:

github.com/farmerkeith/BMP280-library

1 -qadam: uskunani sozlash

Uskunani sozlash
Uskunani sozlash

Kutubxona foydali bo'lishi uchun BMP280 (yoki xohlasangiz, ikkitasiga) mikrokontrolerni ulash lozim.

Men WeMos D1 mini pro -dan foydalanganman, shuning uchun uning ulanishlarini ko'rsataman. Boshqa mikrokontrollerlar ham xuddi shunday bo'ladi, siz faqat SDA va SCL pinlarini to'g'ri ulashingiz kerak.

WeMos D1 mini pro bo'lsa, ulanishlar:

Vazifasi WeMos pinli BMP280 pinli eslatmalar

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V GND GND Manzilni boshqarish SDO Ground yoki Vdd I2C CSB Vdd ni tanlang (GND SPI ni tanlaydi)

E'tibor bering, ba'zi MP280 modullaridagi SDO piniga SDD, Vdd piniga esa VCC yozilishi mumkin. Eslatma: SDA va SCL liniyalarida chiziq va Vin pimi o'rtasida tortiladigan qarshilik bo'lishi kerak. Odatda 4.7K qiymati OK bo'lishi kerak. Ba'zi BMP280 va BME280 modullari modulga 10K tortishish rezistorlariga ega (bu yaxshi amaliyot emas, chunki I2C avtobusiga bir nechta qurilmalarni o'rnatish uni ortiqcha yuklashi mumkin). Shu bilan birga, har birida 10K rezistorli 2 ta BME/P280 modulini ishlatish amalda muammo bo'lmasligi kerak.

Uskuna ulangandan so'ng, I2CScan_ID eskizini ishga tushirib, qurilmangiz BMP280 yoki BME280 ekanligini osongina tekshirishingiz mumkin:

Qurilmaning o'ziga qarab, sizda BMP280 yoki BME280 bor -yo'qligini tekshirishingiz mumkin. Men buni amalga oshirish uchun raqamli mikroskopdan foydalanishni zarur deb topdim, lekin agar ko'rish qobiliyatingiz yaxshi bo'lsa, uni hech qanday yordamisiz qilishingiz mumkin. Qurilmaning korpusida ikkita bosma chiziq bor. Kalit - ikkinchi qatorning birinchi harfi, u BMP280 qurilmalarida "K", BME280 qurilmalarida esa "U".

2 -qadam: Kutubxona tomonidan taqdim etilgan API

Kutubxona tomonidan taqdim etilgan API
Kutubxona tomonidan taqdim etilgan API
Kutubxona tomonidan taqdim etilgan API
Kutubxona tomonidan taqdim etilgan API

Kutubxonani eskizda, shu jumladan

Kutubxona standart usulda bayonot yordamida eskizga kiritilgan

#"farmerkeith_BMP280.h" ni qo'shing

Setup () funktsiyasi ishga tushmasidan oldin bu bayon eskizning birinchi qismiga kiritilishi kerak.

BME yoki BMP dasturiy ob'ektini yaratish

BMP280 dasturiy ob'ektini yaratish uchun 3 daraja mavjud. Eng sodda - bu shunchaki

bme280 ob'ekt nomi; yoki bmp280 objectName;

masalan, BMP280 bmp0;

Bu standart manzil 0x76 bo'lgan dasturiy ob'ektni yaratadi (ya'ni erga ulangan SDO uchun).

BME280 yoki BMP280 dasturiy ob'ektini yaratishning keyingi sathi 0 yoki 1 parametrga ega, quyidagicha:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Parametr (0 yoki 1) I2C asosiy manziliga qo'shiladi, shunda ikkita BME280 yoki BMP280 qurilmasi bir xil I2C avtobusida ishlatilishi mumkin (bittasini ham o'z ichiga oladi).

BME yoki BMP280 dasturiy ob'ektini yaratishning uchinchi darajasi ikkita parametrga ega. 0 yoki 1 bo'lgan birinchi parametr, avvalgi holatda bo'lgani kabi, manzil uchun. Ikkinchi parametr disk raskadrovka bosib chiqarishni boshqaradi. Agar u 1 ga o'rnatilgan bo'lsa, dasturiy ob'ekt bilan har bir tranzaksiya Serial.print chiqishiga olib keladi, bu esa dasturchiga tranzaksiya tafsilotlarini ko'rish imkonini beradi. Masalan:

bmp280 objectNameB (1, 1);

Agar disk raskadrovka bosib chiqarish parametri 0 ga o'rnatilgan bo'lsa, dasturiy ta'minot ob'ekti odatdagi xatti -harakatiga qaytadi (chop etilmaydi).

Bu bayonot yoki bayonotlar #include dan keyin va setup () funktsiyasidan oldin kiritilishi kerak.

BME yoki BMP dasturiy ob'ektini ishga tushirish

Ishlatishdan oldin, sozlamalar parametrlarini qurilmadan o'qib chiqish va uni har qanday o'lchash rejimi, ortiqcha namuna olish va filtr parametrlari mos keladigan tarzda sozlash kerak.

Oddiy, umumiy maqsadli ishga tushirish uchun bayonot:

objectName.begin ();

Begin () ning bu versiyasi qurilmadan kalibrlash parametrlarini o'qiydi va osrs_t = 7 (16 harorat o'lchami), osrs_p = 7 (16 bosim o'lchami), rejim = 3 (uzluksiz, Oddiy), t_sb = 0 (0,5 ms uyqu oralig'ida) o'rnatadi. o'lchov to'plamlari), filter = 0 (K = 1, shuning uchun filtrlash yo'q) va spiw_en = 0 (SPI o'chirilgan, shuning uchun I2C dan foydalaning). BME280 holatida 16 namlik o'lchami uchun qo'shimcha parametr osrs_h = 7 mavjud.

Start () ning boshqa olti (yoki 7) parametrini oladigan boshqa versiyasi mavjud. Yuqoridagi bayonotning ekvivalenti

objectName.begin (7, 7, 3, 0, 0, 0); // osrs_t, osrs_p, rejim, t_sb, filtr, spiw_en

yoki objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, rejim, t_sb, filtr, spiw_en, osrs_h

Kodlar va ularning ma'nosi to'liq ro'yxati BME280 va BMP280 ma'lumotlar varaqasida, shuningdek kutubxonadagi.cpp faylidagi izohlarda keltirilgan.

Harorat va bosimni oddiy o'lchash

Haroratni o'lchashning eng oddiy usuli

er -xotin harorat = objectName.readTemperature (); // haroratni o'lchash

Bosim o'lchovini olishning eng oddiy usuli

er -xotin bosim = objectName.readPressure (); // bosimni o'lchash

Namlikni o'lchashning eng oddiy usuli

ikki marta namlik = objectName.readHumidity (); // namlikni o'lchash (faqat BME280)

Haroratni ham, bosimni ham olish uchun yuqoridagi ikkita iborani ketma -ket ishlatish mumkin, lekin boshqa variant ham bor:

ikki tomonlama harorat;

er -xotin bosim = objectName.readPressure (harorat); // bosim va haroratni o'lchash

Bu bayonot BME280 yoki BMP280 qurilmasidagi ma'lumotlarni faqat bir marta o'qiydi va harorat va bosimni qaytaradi. Bu I2C avtobusidan biroz samaraliroq foydalanish va ikkita o'qishning bir xil o'lchash davriga to'g'ri kelishini ta'minlaydi.

BME 280 uchun uchta qiymatni (namlik, harorat va bosim) oladigan birlashtirilgan bayonot:

ikki marta harorat, bosim; ikki marta namlik = objectName.readHumidity (harorat, bosim); // namlik, bosim va haroratni o'lchash

Bu bayonot BMP280 qurilmasidagi ma'lumotlarni faqat bir marta o'qiydi va barcha uchta qiymatni qaytaradi. Bu I2C avtobusidan biroz samaraliroq foydalanish va uchta o'qishning bir xil o'lchash davriga to'g'ri kelishini ta'minlaydi. E'tibor bering, o'zgaruvchilar nomlari foydalanuvchi xohlagan narsaga o'zgartirilishi mumkin, lekin ularning tartibi aniqlangan - harorat birinchi, bosim esa ikkinchi o'rinda turadi.

Bu foydalanish holatlari kutubxona bilan ta'minlangan namunaviy eskizlarda keltirilgan: basicTemperature.ino, basicPressure.ino, basicHumidity.ino, basicTemperatureAndPressure.ino va basicHumidityAndTemperatureAndPressure.ino.

Harorat va bosimni yanada murakkab o'lchash

Yuqoridagi bayonotlar muammosiz ishlasa -da, bir nechta muammolar bor:

  1. qurilma uzluksiz ishlaydi va shuning uchun maksimal darajada quvvat sarflaydi. Agar energiya batareyadan kelayotgan bo'lsa, uni kamaytirish kerak bo'ladi.
  2. iste'mol qilingan quvvat tufayli, qurilma isib ketadi va shuning uchun o'lchangan harorat atrof -muhit haroratidan yuqori bo'ladi. Men buni keyingi bosqichda batafsilroq yoritaman.

Kamroq quvvat sarflaydigan va atrof -muhitga yaqinroq harorat beradigan natijani start () yordamida uni uyqu holatiga keltiruvchi parametrlar yordamida olish mumkin (masalan, rejim = 0). Masalan:

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

So'ngra, o'lchov zarur bo'lganda, osrs_h, osrs_t va osrs_p va plus rejimi = 1 (bitta tortishish rejimi) ning mos qiymatlarini o'rnatadigan F2 (agar kerak bo'lsa) va F4 registrlarini sozlash uchun konfiguratsiya buyrug'i bilan qurilmani uyg'oting. Masalan:

[objectName.updateF2Control (1);] // osrs_h - BMP280 uchun hech qachon kerak emas, // va agar o'lchovlar soni o'zgarmasa // BME280 uchun kerak emas // begin () da berilgan qiymatdan. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, rejim

Qurilmani uyg'otgandan so'ng, u o'lchashni boshlaydi, lekin natija ba'zi millisekundlarda bo'lmaydi - ko'rsatilgan o'lchovlar soniga qarab kamida 4 ms, ehtimol 70 ms yoki undan ko'p. Agar o'qish buyrug'i darhol yuborilsa, qurilma oldingi o'lchovdagi qiymatlarni qaytaradi - bu ba'zi ilovalarda ma'qul bo'lishi mumkin, lekin ko'p hollarda yangi o'lchov mavjud bo'lguncha kechiktirish yaxshiroqdir.

Bu kechikish bir necha usul bilan amalga oshirilishi mumkin.

  1. kutilgan eng uzoq kechikishni qoplash uchun ma'lum vaqt kuting
  2. O'lchovlar sonining maksimal o'lchash vaqtidan (ya'ni 2,3 ms) o'lchovlar sonidan, qo'shimcha xarajatlardan tashqari marjdan hisoblangan vaqtni kuting.
  3. Qisqa vaqtni yuqoridagi kabi hisoblang, lekin nominal o'lchash vaqtini (ya'ni 2 ms) va ortiqcha yukni ishlating, so'ng holat registridagi "Men o'lchayman" bitini tekshirishni boshlang. Vaziyat biti 0 ga teng bo'lsa (ya'ni, o'lchov emas), harorat va bosim ko'rsatkichlarini oling.
  4. darhol status registrini tekshirishni boshlang va status biti 0 bo'lsa, harorat va bosim ko'rsatkichlarini oling,

Buni qanday qilishning misolini birozdan keyin ko'rsataman.

Konfiguratsiya registri operatsiyalari

Bularning barchasini amalga oshirish uchun bizga hali tanishtirmagan bir nechta vositalar kerak. Ular:

bayt o'qish Ro'yxatdan o'tish (reg)

void updateRegister (reg, value)

Ularning har birida kutubxonada bir nechta olingan buyruqlar mavjud bo'lib, ular ma'lum harakatlar uchun dasturiy ta'minotni biroz soddalashtiradi.

Misol PowerSaverPressureAndTemperature.ino 3 -usuldan foydalanadi. Takroriy tekshirishni bajaradigan kod qatori

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

E'tibor bering, bu eskiz ESP8266 mikrokontroller uchun. Men WeMos D1 mini pro -dan foydalandim. Eskiz Atmega mikrokontrolderlari bilan ishlamaydi, ularda uxlash uchun har xil ko'rsatmalar mavjud. Bu eskiz boshqa bir nechta buyruqlarni bajaradi, shuning uchun men bu eskizni batafsil tasvirlashdan oldin ularning hammasi bilan tanishtiraman.

Mikrokontoller BMP280 sensori bilan parallel ravishda uxlab yotganida, kerakli o'lchovlar uchun sensorning konfiguratsiyasi start () buyrug'ida 6 parametr yordamida amalga oshirilishi mumkin. Ammo, agar mikrokontroller uxlamasa, lekin sensor bo'lsa, o'lchash vaqtida sensorni uyg'otib, uning o'lchov konfiguratsiyasini aytib berish kerak. Buni to'g'ridan -to'g'ri bilan qilish mumkin

updateRegister (reg, qiymat)

lekin quyidagi uchta buyruq bilan biroz osonroq:

updateF2Control (osrs_h); // faqat BME280

updateF4Control (osrs_t, osrs_p, rejim); updateF5Config (t_sb, filtr, spi3W_en);

O'lchov tugagandan so'ng, agar ishlatilgan rejim Bir martalik (Majburiy rejim) bo'lsa, u holda qurilma avtomatik ravishda uyqu holatiga qaytadi. Ammo, agar o'lchovlar to'plami uzluksiz (Oddiy) rejim yordamida bir nechta o'lchovlarni o'z ichiga olsa, BMP280ni yana uyquga qo'yish kerak bo'ladi. Buni quyidagi ikkita buyruq yordamida amalga oshirish mumkin:

updateF4Control16xSleep ();

updateF4ControlSleep (qiymat);

Bularning ikkalasi ham rejim bitlarini 00 ga o'rnatgan (ya'ni uyqu rejimi). Ammo birinchisi osrs_t va osrs_p ni 111 ga o'rnatadi (ya'ni 16 o'lchov), ikkinchisi "qiymat" dan past 6 bitni 0xF4 registrining 7: 2 bitlariga saqlaydi.

Xuddi shunday, quyidagi bayonotda "qiymat" ning past olti biti 0xF5 registrining 7: 2 bitlarida saqlanadi.

updateF5ConfigSleep (qiymat);

Bu oxirgi buyruqlardan foydalanish BMP280 F4 va F5 registrlarida 12 bit ma'lumotni saqlashga imkon beradi. Hech bo'lmaganda, ESP8266 holatida, mikrokontroller bir muddat uyqudan keyin uyg'onganida, u eskizning boshidanoq uyqu buyrug'idan oldin uning holati to'g'risida ma'lumotsiz boshlanadi. Uyqu buyrug'idan oldin uning holati haqidagi ma'lumotni saqlash uchun ma'lumotlarni flesh xotirada saqlash mumkin, bu EEPROM funktsiyalari yordamida yoki SPIFFS yordamida fayl yozish orqali. Biroq, flesh-xotirada yozish tsikllari soni cheklangan, 10 000 dan 100 000 gacha. Bu shuni anglatadiki, agar mikrokontroller har bir necha soniyada uyqudan uyg'onish davridan o'tib ketsa, bu ruxsat etilgan xotira yozuvidan oshib ketishi mumkin. bir necha oy ichida cheklash. BMP280 -da bir necha bit ma'lumotni saqlash bunday cheklovga ega emas.

F4 va F5 registrlarida saqlangan ma'lumotlar mikrokontroller buyruqlar yordamida uyg'onganda tiklanishi mumkin.

readF4Sleep ();

readF5Sleep ();

Bu funktsiyalar tegishli registrni o'qiydi, 2 LSBni olib tashlash va qolgan 6 bitni qaytarish uchun tarkibni o'zgartiradi. Bu funktsiyalar powerSaverPressureAndTemperatureESP.ino eskiz misolida quyidagicha ishlatiladi:

// EventCounter qiymatini bmp0 dan o'qing

bayt bmp0F4value = bmp0.readF4Sleep (); // 0 dan 63 baytgacha bmp0F5value = bmp0.readF5Sleep (); // 0 dan 63 gacha eventCounter = bmp0F5value*64+bmp0F4value; // 0 dan 4095 gacha

Bu funktsiyalar tegishli registrni o'qiydi, 2 LSBni olib tashlash va qolgan 6 bitni qaytarish uchun tarkibni o'zgartiradi. Bu funktsiyalar powerSaverPressureAndTemperature.ino eskiz misolida quyidagicha ishlatiladi:

// bmp1 dan EventCounter qiymatini o'qing

bayt bmp1F4value = bmp1.readF4Sleep (); // 0 dan 63 baytgacha bmp1F5value = bmp1.readF5Sleep (); // 0 dan 63 gacha eventCounter = bmp1F5value*64+bmp1F4value; // 0 dan 4095 gacha

Xom harorat va bosim funktsiyalari

Asosiy o'qish harorati, o'qish bosimi va o'qish namligi funktsiyalari ikkita komponentdan iborat. Birinchidan, xom-20-bitli harorat va bosim qiymatlari BME/P280 yoki 16-bitli namlik qiymati BME280-dan olinadi. Keyin kompensatsiya algoritmi chiqish qiymatlarini Selsiy, hPa yoki %RHda hosil qilish uchun ishlatiladi.

Kutubxona ushbu komponentlar uchun alohida funktsiyalarni taqdim etadi, shuning uchun xomashyo harorati, bosim va namlik ma'lumotlarini olish va, ehtimol, qandaydir tarzda boshqarish mumkin. Bu xom ashyolardan harorat, bosim va namlikni olish algoritmi ham berilgan. Kutubxonada bu algoritmlar ikki uzunlikdagi suzuvchi nuqta arifmetikasi yordamida amalga oshiriladi. U 32 bitli protsessor bo'lgan ESP8266 da yaxshi ishlaydi va "ikki tomonlama" o'zgaruvchan o'zgaruvchilar uchun 64 bitdan foydalanadi. Bu funktsiyalarni ochish boshqa platformalar uchun hisob -kitoblarni baholash va o'zgartirish uchun foydali bo'lishi mumkin.

Bu funktsiyalar:

readRawPressure (rawTemperature); // BME/P280readRawHumidity dan xom bosim va harorat ma'lumotlarini o'qiydi (rawTemperature, rawPressure); // xom namlik, harorat va bosim ma'lumotlarini BME280 calcTemperature (rawTemperature, t_fine) dan o'qiydi; kaltsiy bosimi (xom bosim, t_fine); calcHumidity (rawHumidity, t_fine)

Bu funktsiyalarning "nozik" argumenti biroz tushuntirishga arziydi. Bosim va namlikni qoplash algoritmlari t_fine o'zgaruvchisi orqali erishiladigan haroratga bog'liq komponentni o'z ichiga oladi. CalcTemperature funktsiyasi haroratni kompensatsiya qilish algoritmi mantig'iga asoslanib t_fine qiymatini yozadi, bu esa keyinchalik calcPressure va calcHumidity -ga kirish sifatida ishlatiladi.

Bu funktsiyalardan foydalanish misolini rawPressureAndTemperature.ino eskiz misolida, shuningdek, kutubxonaning.cpp faylidagi readHumidity () funktsiyasining kodida topish mumkin.

Dengiz sathidan balandlikdagi bosim

Ma'lumki, atmosfera bosimi va balandlik. Ob -havo ham bosimga ta'sir qiladi. Ob -havo tashkilotlari atmosfera bosimi to'g'risidagi ma'lumotlarni e'lon qilganda, ular odatda balandlikka moslashadi, shuning uchun "sinoptik xaritada" dengiz sathi uchun standartlashtirilgan izobarlar (doimiy bosim chiziqlari) ko'rsatilgan. Haqiqatan ham, bu munosabatlarda 3 ta qiymat mavjud va ularning ikkitasini bilish uchinchisini chiqarishga imkon beradi. 3 qiymat:

  • dengiz sathidan balandligi
  • bu balandlikdagi haqiqiy havo bosimi
  • dengiz sathidagi ekvivalent havo bosimi (aniqrog'i, o'rtacha dengiz sathi, chunki dengiz sathi doimo o'zgarib turadi)

Ushbu kutubxona ushbu munosabatlar uchun ikkita funktsiyani taqdim etadi:

kaltsiy balandligi (bosim, dengiz darajasi);

normallashgan bosim (bosim, balandlik);

Dengiz sathining 1013,15 gPa standart bosimini nazarda tutadigan soddalashtirilgan versiya ham mavjud.

kaltsiy balandligi (bosim); // standart seaLevelPressure qabul qilindi

3 -qadam: BMP280 qurilmasi tafsilotlari

BMP280 qurilma tafsilotlari
BMP280 qurilma tafsilotlari

Uskuna imkoniyatlari

BMP280 2 baytli konfiguratsiya ma'lumotlariga ega (0xF4 va 0xF5 registrli manzillar bo'yicha), bu bir nechta o'lchash va ma'lumotlarni chiqarish variantlarini boshqarish uchun ishlatiladi. Shuningdek, u 2 bitlik holat ma'lumotlarini va 24 bayt kalibrlash parametrlarini ta'minlaydi, ular xom harorat va bosim qiymatlarini an'anaviy harorat va bosim birliklariga aylantirishda ishlatiladi. BME280 qo'shimcha ma'lumotlarga ega:

  • Namlikning ko'p o'lchovlarini nazorat qilish uchun ishlatiladigan 0xF2 registr manzilidagi konfiguratsiya ma'lumotlarining 1 qo'shimcha bayti;
  • Xom namlik qiymatini nisbiy namlik foiziga aylantirishda ishlatiladigan 8 qo'shimcha bayt kalibrlash parametrlari.

BME280 uchun harorat, bosim va holat registrlari BMP280 bilan bir xil, kichik istisnolardan tashqari:

  • BME280 ning "ID" bitlari 0x60 ga o'rnatiladi, shuning uchun uni BMP280 dan ajratish mumkin, ular 0x56, 0x57 yoki 0x58 bo'lishi mumkin.
  • uyqu vaqtini boshqarish (t_sb) shunday o'zgartirilganki, BMP280 (2000 ms va 4000 ms) da ikkita uzoq vaqt BME280da 10 ms va 20 ms qisqa vaqtlarga almashtiriladi. BME280da maksimal uyqu vaqti - 1000 ms.
  • BME280 -da, agar filtrlash qo'llanilsa, harorat va bosimning xom qiymati har doim 20 bitni tashkil qiladi. 16 dan 19 bitgacha bo'lgan qiymatlar faqat filtrlanmagan holatlarda (ya'ni filtr = 0) cheklangan.

Harorat va bosim har 20 bitli qiymatlar bo'lib, ularni harorat uchun 3 16 bitli kalibrlash parametrlari va 9 16 bitli kalibrlash parametrlari va bosim uchun harorat yordamida oddiy algoritm yordamida an'anaviy harorat va bosimga aylantirish kerak. Haroratni o'lchashning granulyatliligi eng kichik bit o'zgarishida (20 bit o'qish) 0.0003 daraja Selsiy, agar 16 bitli o'qish ishlatilsa, 0.0046 darajaga ko'tariladi.

Namlik - bu 16 bitli qiymat, uni 8, 12 va 16 bitli 6 kalibrlash parametrlari yordamida boshqa murakkab algoritm yordamida nisbiy namlikka aylantirish kerak.

Ma'lumotlar varag'i haroratni o'qishning mutlaq aniqligini 25 ° C da +-0,5 C va 0 dan 65 S gacha bo'lgan diapazonda +-1 C ni ko'rsatadi.

Bosim o'lchovining donadorligi 20 bitli aniqlikda 0,15 Paskal (ya'ni 0,0015 gektoPaskal) yoki 16 bitli aniqlikda 2,5 Paskalni tashkil qiladi. Xom bosim qiymatiga harorat ta'sir qiladi, shuning uchun 25C atrofida, harorat 1 daraja C ga ko'tarilganda o'lchangan bosim 24 Paskalga kamayadi. Harorat sezuvchanligi kalibrlash algoritmida hisobga olinadi, shuning uchun etkazib berilgan bosim qiymatlari har xil haroratda aniq bo'lishi kerak.

Ma'lumotlar varag'i 0 C dan 65 S gacha bo'lgan harorat uchun +1 hPa bosim ko'rsatkichining mutlaq aniqligini ko'rsatadi.

Namlik aniqligi ma'lumot varag'ida +3% RH va +-1% histerezis sifatida berilgan.

U qanday ishlaydi

24 baytlik harorat va bosim kalibrlash ma'lumotlari, shuningdek, BME280 uchun 8 bayt namlik kalibrlash ma'lumotlarini qurilmadan o'qish va o'zgaruvchilarda saqlash kerak. Bu ma'lumotlar zavodda qurilmaga alohida dasturlashtirilgan, shuning uchun har xil qurilmalar har xil qiymatlarga ega - hech bo'lmaganda ba'zi parametrlar uchun. BME/P280 ikkita davlatdan birida bo'lishi mumkin. Bir davlatda u o'lchanadi. Boshqa holatda u kutmoqda (uxlamoqda).

Qaysi holatda ekanligini 0xF3 registrining 3 -bitiga qarab tekshirish mumkin.

Oxirgi o'lchov natijalarini istalgan vaqtda, qurilma uxlayotganidan yoki o'lchashidan qat'i nazar, tegishli ma'lumot qiymatini o'qish orqali olish mumkin.

BME/P280 bilan ishlashning ikkita usuli mavjud. Ulardan biri - o'lchash va uxlash holatlari o'rtasida bir necha marta aylanib turadigan uzluksiz rejim (ma'lumotlar varag'ida Oddiy rejim deb ataladi). Bu rejimda qurilma o'lchovlar majmuasini bajaradi, keyin uyquga ketadi, keyin boshqa o'lchovlar to'plami uchun uyg'onadi va hokazo. Shaxsiy o'lchovlar soni va tsiklning uyqu qismining davomiyligi konfiguratsiya registrlari orqali boshqarilishi mumkin.

BME/P280 -ni ishlatishning boshqa usuli - bu bitta rasmli rejim (ma'lumotlar varag'ida majburiy rejim deb ataladi). Bu rejimda qurilma o'lchash buyrug'i bilan uyqudan uyg'otiladi, u bir qator o'lchovlarni bajaradi va keyin yana uyquga ketadi. To'plamdagi individual o'lchovlar soni qurilmani uyg'otadigan konfiguratsiya buyrug'ida boshqariladi.

BMP280 -da, agar bitta o'lchov amalga oshirilsa, qiymatning eng muhim 16 biti to'ldiriladi va qiymatni o'qishda eng kam to'rtta muhim bit nolga teng bo'ladi. O'lchovlar sonini 1, 2, 4, 8 yoki 16 ga o'rnatish mumkin va o'lchovlar sonining ko'payishi bilan ma'lumotlar bilan to'ldiriladigan bitlar soni ko'payadi, shuning uchun 16 o'lchovda barcha 20 bit o'lchov ma'lumotlari bilan to'ldiriladi. Ma'lumotlar varag'i bu jarayonni ortiqcha namuna olish deb ataydi.

BME280 -da, natija filtrlanmagan bo'lsa, xuddi shu tartib qo'llaniladi. Agar filtrlash ishlatilsa, har bir o'lchash tsiklida qancha o'lchov o'tkazilganidan qat'i nazar, qiymatlar har doim 20 bitni tashkil qiladi.

Har bir individual o'lchov taxminan 2 millisekundni oladi (odatiy qiymat; maksimal qiymat 2,3 ms). Taxminan 2 ms (odatda biroz kamroq) miqdoridagi sobit yukni qo'shing, bu 1 dan 32 gacha individual o'lchovlardan iborat bo'lgan o'lchovlar ketma -ketligi 4 ms dan 66 milodiygacha bo'lishi mumkin.

Ma'lumotlar varag'i har xil ilovalar uchun tavsiya etilgan harorat va bosimni ortiqcha tanlashning kombinatsiyasini o'z ichiga oladi.

Konfiguratsiyani boshqarish registrlari

BMP280 -dagi ikkita konfiguratsiyani boshqarish registrlari 0xF4 va 0xF5 registr manzillaridadir va 6 ta konfiguratsiyani boshqarishning individual qiymatlari bilan xaritalanadi. 0xF4 quyidagilardan iborat:

  • 3 bit osrs_t (haroratni o'lchash 0, 1, 2, 4, 8 yoki 16 marta);
  • 3 bit osrs_p (bosimni o'lchash 0, 1, 2, 4, 8 yoki 16 marta); va
  • 2 bitli rejim (Kutish, Majburiy (ya'ni bitta tortishish), Oddiy (ya'ni uzluksiz).

0xF5 quyidagilardan iborat:

  • 3 bit t_sb (kutish vaqti, 0,5ms dan 4000 milodiygacha);
  • 3 bitli filtr (pastga qarang); va
  • SPI yoki I2C ni tanlaydigan 1 bit spiw_en.

Filtr parametri xom bosim va haroratni o'lchash qiymatlariga (lekin namlik ko'rsatkichlariga emas) qo'llaniladigan eksponensial parchalanish algoritmini yoki Infinite Impulse Response (IIR) filtrini boshqaradi. Tenglama ma'lumotlar varaqasida berilgan. Boshqa taqdimot:

Qiymat (n) = Qiymat (n-1) * (K-1) / K + o'lchov (n) / K

bu erda (n) eng yangi o'lchov va chiqish qiymatini ko'rsatadi; va K - filtr parametridir. Filtr parametr K va 1, 2, 4, 8 yoki 16 ga o'rnatilishi mumkin. Agar K 1 ga o'rnatilgan bo'lsa, tenglama faqat Value (n) = o'lchov (n) ga aylanadi. Filtr parametrining kodlanishi quyidagicha:

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

BME 280 0xF2, "ctrl_hum" manzilida konfiguratsiyani nazorat qilishning yana bir registrini qo'shadi, bunda bitta 3-bitli osrs_h parametriga ega (namlikni 0, 1, 2, 4, 8 yoki 16 marta o'lchash).

4 -qadam: O'lchash va o'qish vaqti

Men buni buyruqlar va o'lchov javoblari vaqtini ko'rsatib, keyinroq qo'shishni rejalashtirmoqdaman.

Iddt - haroratni o'lchashdagi oqim. Odatda qiymati 325 uA

Iddp - bosim o'lchovidagi oqim. Odatda qiymati 720 uA, maksimal 1120 uA

Iddsb - kutish rejimida oqim. Odatda qiymati 0,2 uA, maksimal 0,5 uA

Iddsl - uyqu rejimida oqim. Odatda qiymati 0,1 uA, maksimal 0,3 uA

5 -qadam: dasturiy ta'minot bo'yicha ko'rsatmalar

Dasturiy ko'rsatmalar
Dasturiy ko'rsatmalar
Dasturiy ko'rsatmalar
Dasturiy ko'rsatmalar

I2C portlash rejimi

BMP280 ma'lumotlar varaqasi ma'lumotlarni o'qish bo'yicha ko'rsatma beradi (3.9 -bo'lim). Unda "har bir registrga alohida-alohida murojaat qilmaslik uchun o'qish tezligini ishlatish tavsiya etiladi. Bu har xil o'lchovlarga tegishli baytlarning mumkin bo'lgan aralashishini oldini oladi va interfeys trafigini kamaytiradi". Kompensatsiya/kalibrlash parametrlarini o'qish bo'yicha ko'rsatma berilmagan. Ehtimol, bu muammo emas, chunki ular statik va o'zgarmaydi.

Bu kutubxona barcha o'qish jarayonida bir -biriga bog'liq bo'lgan qiymatlarni o'qiydi - harorat va bosimni kompensatsiya qilish parametrlari bo'yicha 24 bayt, harorat va bosim uchun 6 bayt, namlik, harorat va bosim uchun 8 bayt. Faqat harorat tekshirilganda, faqat 3 bayt o'qiladi.

Makrolardan foydalanish (#define va boshqalar)

Bu kutubxonada "kutubxonani o'z ichiga oladigan" odatiy kutubxonadan boshqa makrolar yo'q, bu takrorlanishni oldini oladi.

Hamma konstantalar const kalit so'z yordamida aniqlanadi va disk raskadrovka standart C funktsiyalari yordamida boshqariladi.

Bu men uchun qandaydir noaniqlik manbai bo'ldi, lekin men ushbu mavzu bo'yicha ko'plab xabarlarni o'qiganimdan kelib chiqqan maslahat: doimiylarni e'lon qilish uchun #define -dan foydalanish (hech bo'lmaganda) va (ehtimol) disk raskadrovka nazoratini ishlatish keraksiz va istalmagan.

#Define o'rniga constni ishlatish holati juda aniq - const #define (ya'ni nil) bilan bir xil manbalardan foydalanadi va natijada olingan qiymatlar o'lchash qoidalariga amal qiladi va shu bilan xato ehtimolini kamaytiradi.

Nosozliklarni tuzatishni nazorat qilish holati biroz tushunarsizdir, chunki men buni qanday bajargan bo'lsam ham, yakuniy kodda disk raskadrovka chop etish bayonotlari mantig'i mavjud, garchi ular hech qachon ishlatilmasa ham. Agar kutubxona xotirasi cheklangan mikrokontroldagi katta loyihada ishlatilsa, bu muammoga aylanishi mumkin. Mening rivojlanishim katta flesh xotirali ESP8266 -da bo'lganligi sababli, bu men uchun muammo emasdek tuyuldi.

6 -qadam: Haroratning ishlashi

Buni keyinroq qo'shishni rejalashtiryapman.

7 -qadam: bosimning ishlashi

Buni keyinroq qo'shishni rejalashtiryapman.

Tavsiya: