Агуулгын хүснэгт:

BMP280 ба BME280 номын сан: 7 алхам
BMP280 ба BME280 номын сан: 7 алхам

Видео: BMP280 ба BME280 номын сан: 7 алхам

Видео: BMP280 ба BME280 номын сан: 7 алхам
Видео: Lesson 30: BMP280 Temperature Sensor with LCD1602 | Arduino Step By Step Course 2024, Долдугаар сарын
Anonim
BMP280 ба BME280 -ийн номын сан
BMP280 ба BME280 -ийн номын сан
BMP280 ба BME280 -ийн номын сан
BMP280 ба BME280 -ийн номын сан
BMP280 ба BME280 -ийн номын сан
BMP280 ба BME280 -ийн номын сан

Танилцуулга

Би энэ номын санг бичих зорилгогүй. Энэ нь BMP280 ашигладаг миний эхлүүлсэн төслийн гаж нөлөө болж "болсон". Тэр төсөл хараахан дуусаагүй байгаа ч номын сан бусадтай хуваалцахад бэлэн байна гэж бодож байна. Дараа нь би BMP280 -ийн даралт, температурын чадварыг чийгшүүлэх хэмжүүрийг нэмдэг BME280 ашиглах шаардлагатай болсон. BME280 нь BMP280 -тэй "хоцрогдолтой нийцдэг" бөгөөд өөрөөр хэлбэл BME280 -аас даралт, температурыг уншихад шаардлагатай бүх регистрүүд болон алхмууд нь BMP280 -д ашигладагтай ижил байна. Зөвхөн BME280 -д хамаарах чийгшилийг уншихад шаардлагатай нэмэлт бүртгэл, алхамууд байдаг. Эндээс хоёуланд нь нэг номын сан эсвэл хоёр тусдаа номын сан гэсэн асуулт гарч ирж байна. Хоёр төрлийн төхөөрөмжийн тоног төхөөрөмжийг бүрэн сольж болно. Борлуулж буй олон модулиудыг хүртэл (жишээлбэл Ebay, AliExpress дээр) BME/P280 гэж тэмдэглэсэн байдаг. Энэ нь ямар төрөл болохыг олж мэдэхийн тулд та мэдрэгчийн бичээсийг (жижиг) харах эсвэл төхөөрөмжийн ID байтыг шалгах хэрэгтэй. Би ганц номын санд орохоор шийдсэн. Зүгээр л ажилласан бололтой.

Санал хүсэлт, ялангуяа сайжруулах санал болгонд талархах болно.

Номын сангийн онцлог, чадвар

Номын сан нь нарийн ширхэгтэй нарийн ширийн бүх нарийн ширийн зүйлийг хийх шаардлагагүй, програмистад төхөөрөмжийн чадавхийг ашиглах боломжийг олгодог програмчлалын интерфейсийг (API) хангадаг програм хангамжийн хэсэг юм. Төхөөрөмжийн чадавхийг бүрэн ашиглах боломжийг олгохын тулд API нь энгийн шаардлагад нийцсэн эхлэгчдэд хялбар байх ёстой. Номын сан нь төхөөрөмж үйлдвэрлэгчээс өгсөн тодорхой удирдамж, ерөнхий програм хангамжийн сайн туршлагыг дагаж мөрдөх ёстой. Би энэ бүхэнд хүрэхийн тулд хичээсэн. BMP280 -ийг эхлүүлэхдээ би 3 өөр номын сан олсон: Adafruit_BMP280; Seeed_BMP280; мөн төхөөрөмж үйлдвэрлэгчээс BMP280 гэж нэрлэдэг. Adafruit эсвэл Seeed хоёулаа сайн ажиллаж, үндсэн програмуудад ашиглахад хялбар байсан ч өргөтгөсөн чадавхитай байдаггүй. Төхөөрөмж үйлдвэрлэгч (Bosch Sensortec) үйлдвэрлэсэн төхөөрөмжийг хэрхэн яаж ашиглахаа бид мэдэхгүй байна. Энэ нь тэдний дутагдал гэхээсээ илүү миний дутагдал байж магадгүй юм. Гэсэн хэдий ч номын сан нь бусад хоёроос хамаагүй илүү төвөгтэй байсан тул би ашиглах заавар, жишээг олж чадаагүй (дараа нь жишээ нь "bmp280_support.c" файлд байсныг олж мэдсэн боловч эдгээр нь надад тийм ч тустай биш байсан).

Эдгээр хүчин зүйлсийн үр дүнд би BMP280 -д зориулж өөрийн номын санг бичихээр шийдсэн.

BME280-ийн номын сангийн нөхцөл байдлыг судалж үзээд Adafruit_BME280, Seed_BME280, Embedded Adventures-ийн бичсэн BME280_MOD-1022 тусдаа номын сангуудыг оллоо. Тэдгээрийн аль нь ч BME280 -ийг ашиглах боломжтой номын санд BMP280 -ийн функцийг нэгтгээгүй. Тэдний хэн нь ч төхөөрөмж болон түүний хяналтын микропроцессор унтаж байх үед төхөөрөмжүүдийн цөөн тооны өгөгдлийг хадгалах чадварыг шууд дэмждэггүй байсан (энэ чадвар нь өгөгдлийн хүснэгтэд харагдаж байгаа бөгөөд миний энд бичсэн, бичсэн номын санд дэмжигдсэн).

Хосолсон номын сан нь BME280 -ийн бүх чадварыг дэмждэг байх ёстой, гэхдээ BMP280 -тэй ашиглахад ашиглагдаагүй функцээс нэмэлт зардал шаардахгүй. Хосолсон номын сангийн давуу талууд нь удирдах цөөн тооны номын сангийн файлууд, нэг төсөлд өөр өөр төхөөрөмжүүдийг хялбархан холих, засвар үйлчилгээ, шинэчлэлтийг хялбаршуулсан өөрчлөлтүүд бөгөөд үүнийг хоёр биш нэг газарт хийх ёстой. Эдгээр нь бүгд маш бага, бүр ач холбогдолгүй байж магадгүй, гэхдээ …

Тоног төхөөрөмжийн чадвар

BMP280 ба BME280 нь 5 мм квадрат, 1 мм өндөртэй гадаргуу дээр суурилуулсан төхөөрөмж юм. 2 тусдаа тэжээлийн оролтын дэвсгэр, хоёр газрын дэвсгэр бүхий 8 интерфэйс дэвсгэртэй. Тэдгээрийг eBay дээр 4 эсвэл 6 тээглүүртэй модуль хэлбэрээр авах боломжтой. 4 зүү модуль нь тогтмол I2C хаягтай бөгөөд SPI протоколыг ашиглахаар тохируулах боломжгүй юм.

6 зүү модуль эсвэл нүцгэн төхөөрөмжийг I2C эсвэл SPI протоколуудын аль алинд нь ашиглаж болно. I2C горимд энэ нь хоёр өөр хаягтай байж болох бөгөөд үүнийг SDO зүүг Ground (үндсэн хаягийн хувьд = 0x76) эсвэл Vdd (үндсэн хаягийн хувьд +1 = 0x77) холбох замаар олж авах боломжтой. SPI горимд ердийн 1 цаг, 2 өгөгдөл (чиглэл тус бүрт нэг), төхөөрөмж сонгох зүү (CS) байдаг.

Миний энд бичсэн, тайлбарласан номын сан зөвхөн I2C -ийг дэмждэг. Adafruit_BMP280 болон BME_MOD-1022 номын сан нь i2C болон SPI-ийг дэмждэг.

Номын санг эндээс татаж авах боломжтой.

github.com/farmerkeith/BMP280-library

Алхам 1: Тоног төхөөрөмжийг тохируулах

Тоног төхөөрөмжийг тохируулах
Тоног төхөөрөмжийг тохируулах

Номын сан ашигтай байхаас өмнө микроконтроллерийг BMP280 (эсвэл хүсвэл тэдгээрийн хоёрт) холбох шаардлагатай.

Би WeMos D1 mini pro ашиглаж байсан тул би түүний холболтыг харуулах болно. Бусад микроконтроллерууд ижил төстэй байх болно, та зүгээр л SDA болон SCL тээглүүрийг зөв холбох хэрэгтэй.

WeMos D1 mini pro -ийн хувьд холболтууд нь:

WeMos pin BMP280 зүү тэмдэглэл

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Nominal 3.3V Ground GND Хаягийн хяналт SDO Ground эсвэл Vdd I2C нь CSB Vdd -ийг сонгоно (GND SPI -ийг сонгоно)

Зарим MP280 модулийн SDO зүү нь SDD гэж тэмдэглэгдсэн бөгөөд Vdd зүү нь VCC гэж хаяглагдсан байж болохыг анхаарна уу. Тэмдэглэл: SDA ба SCL шугамууд нь шугам ба Вин зүүний хооронд татах эсэргүүцэлтэй байх ёстой. Ихэвчлэн 4.7K утга нь OK байх ёстой. Зарим BMP280 ба BME280 модулиуд нь модульд 10K татах эсэргүүцэлтэй байдаг (энэ нь сайн туршлага биш, учир нь I2C автобусанд олон төхөөрөмж оруулах нь хэт их ачаалах магадлалтай). Гэсэн хэдий ч тус бүрдээ 10К резистор бүхий 2 BME/P280 модулийг ашиглах нь нэг автобусанд өөр олон төхөөрөмж байхгүй бол татах резистортой бол практик дээр асуудал үүсгэхгүй.

Тоног төхөөрөмжийг холбосны дараа та төхөөрөмжөө BMP280 эсвэл BME280 эсэхийг хялбархан эндээс олж болох I2CScan_ID ноорог ашиглан шалгаж болно:

Та мөн BMP280 эсвэл BME280 байгаа эсэхийг төхөөрөмжөөс хараад шалгаж болно. Үүнийг хийхийн тулд дижитал микроскоп ашиглах шаардлагатай байсан, гэхдээ хэрэв таны нүдний хараа маш сайн байвал та үүнийг ямар ч тусламжгүйгээр хийх боломжтой байж магадгүй юм. Төхөөрөмжийн бүрхүүл дээр хоёр мөр хэвлэх боломжтой. Түлхүүр нь хоёр дахь мөрний эхний үсэг бөгөөд BMP280 төхөөрөмжүүдийн хувьд "K", BME280 төхөөрөмжүүдийн хувьд "U" байна.

Алхам 2: Номын сангаас өгсөн APIs

Номын сангаас өгсөн APIs
Номын сангаас өгсөн APIs
Номын сангаас өгсөн APIs
Номын сангаас өгсөн APIs

Номын санг ноорог хэлбэрээр оруулах

Номын сангийн мэдэгдлийг ашиглан стандарт хэлбэрээр ноорог хэсэгт оруулсан болно

#"farmerkeith_BMP280.h" -ийг оруулна уу

Энэ мэдэгдлийг setup () функц эхлэхээс өмнө ноорог хэсгийн эхэнд оруулах шаардлагатай.

BME эсвэл BMP програм хангамжийн объект үүсгэх

BMP280 програм хангамжийн объектыг бий болгох 3 түвшин байдаг. Хамгийн энгийн нь зүгээр л

bme280 объектын нэр; эсвэл bmp280 objectName;

жишээ нь, BMP280 bmp0;

Энэ нь 0x76 (өөрөөр хэлбэл газарт холбогдсон SDO -ийн хувьд) үндсэн хаягтай програм хангамжийн объектыг үүсгэдэг.

BME280 эсвэл BMP280 програм хангамжийн объект үүсгэх дараагийн түвшин нь 0 эсвэл 1 гэсэн параметртэй байна.

bme280 objectNameA (0);

bmp280 objectNameB (1);

Параметр (0 эсвэл 1) нь I2C үндсэн хаягаар нэмэгддэг бөгөөд ингэснээр хоёр BME280 эсвэл BMP280 төхөөрөмжийг нэг I2C автобусанд (тус бүрийг оруулаад) ашиглах боломжтой болно.

BME эсвэл BMP280 програм хангамжийн объект үүсгэх гурав дахь түвшин нь хоёр параметртэй байна. Эхний эсвэл 0 гэсэн эхний параметр нь өмнөх тохиолдлын адил хаягийн хувьд зориулагдсан болно. Хоёрдахь параметр нь дибаг хийхийг хэвлэхийг хянадаг. Хэрэв үүнийг 1 гэж тохируулсан бол програм хангамжийн объекттой хийсэн гүйлгээ бүр нь Serial.print гаралтыг гаргадаг бөгөөд энэ нь програмчдад гүйлгээний дэлгэрэнгүй мэдээллийг харах боломжийг олгодог. Жишээлбэл:

bmp280 objectNameB (1, 1);

Хэрэв дибаг хийх хэвлэх параметрийг 0 гэж тохируулсан бол програм хангамжийн объект хэвийн төлөв рүү буцна (хэвлэхгүй).

Энэхүү мэдэгдэл эсвэл мэдэгдлийг #include болон тохируулгын () функцын өмнө оруулах шаардлагатай.

BME эсвэл BMP програм хангамжийн объектыг эхлүүлэх

Хэрэглэхийн өмнө тохируулгын параметрүүдийг төхөөрөмжөөс уншиж, хэмжилтийн аль ч горим, хэт дээж авах, шүүлтүүрийн тохиргоог тохируулах шаардлагатай.

Энгийн, ерөнхий зориулалтаар эхлүүлэхийн тулд мэдэгдэл нь:

objectName.begin ();

Begin () -ийн энэ хувилбар нь тохируулгын параметрүүдийг төхөөрөмжөөс уншиж, osrs_t = 7 (16 температурын хэмжилт), osrs_p = 7 (16 даралтын хэмжилт), горим = 3 (тасралтгүй, Хэвийн), t_sb = 0 (хооронд 0.5 ms унтах) тохируулдаг. хэмжилтийн багц), шүүлтүүр = 0 (K = 1, шүүлтүүр байхгүй) ба spiw_en = 0 (SPI идэвхгүй болсон тул I2C ашиглана уу). BME280 -ийн хувьд 16 чийгшил хэмжих нэмэлт osrs_h = 7 параметр байдаг.

Бүх зургаан (эсвэл 7) параметрийг авдаг begin () -ийн өөр нэг хувилбар байдаг. Дээрх мэдэгдлийн эквивалент нь

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

эсвэл objectName.begin (7, 7, 3, 0, 0, 0, 7); // osrs_t, osrs_p, mode, t_sb, filter, spiw_en, osrs_h

Кодын бүрэн жагсаалт, тэдгээрийн утгыг BME280 ба BMP280 мэдээллийн хуудсан дээр, мөн номын сан дахь.cpp файлын тайлбар дээр оруулсан болно.

Температур ба даралтын энгийн хэмжилт

Температурыг хэмжих хамгийн хялбар арга бол

давхар температур = objectName.readTemperature (); // температурыг хэмжих

Даралтыг хэмжих хамгийн хялбар арга бол

давхар даралт = objectName.readPressure (); // даралтыг хэмжих

Чийглэгийг хэмжих хамгийн хялбар арга бол

давхар чийгшил = objectName.readHumidity (); // чийгшлийг хэмжих (зөвхөн BME280)

Температур ба даралтыг хоёуланг нь авахын тулд дээрх хоёр мэдэгдлийг нэг нэгээр нь ашиглаж болно, гэхдээ өөр нэг сонголт бий:

давхар температур;

давхар даралт = objectName.readPressureure (температур); // даралт ба температурыг хэмжих

Энэхүү мэдэгдэл нь BME280 эсвэл BMP280 төхөөрөмжийн өгөгдлийг зөвхөн нэг удаа уншиж, температур ба даралтыг хоёуланг нь буцаана. Энэ нь I2C автобусыг арай илүү үр ашигтай ашиглах бөгөөд хоёр уншилт нь ижил хэмжилтийн мөчлөгтэй тохирч байгаа эсэхийг баталгаажуулдаг.

BME 280 -ийн хувьд бүх гурван утгыг (чийгшил, температур, даралт) авсан хосолсон мэдэгдэл нь:

давхар температур, даралт; давхар чийгшил = objectName.readHumidity (температур, даралт); // чийгшил, даралт, температурыг хэмжих

Энэ мэдэгдэл нь BMP280 төхөөрөмжөөс авсан өгөгдлийг зөвхөн нэг удаа уншиж, бүх гурван утгыг буцаана. Энэ нь I2C автобусыг арай илүү үр ашигтай ашиглах бөгөөд гурван уншилт нь ижил хэмжилтийн мөчлөгтэй тохирч байгаа эсэхийг баталгаажуулдаг. Хувьсагчдын нэрийг хэрэглэгчийн дуртай зүйл болгон өөрчилж болох боловч дарааллыг нь тогтоодог - температур нэгдүгээрт, даралт хоёрдугаарт ордог гэдгийг анхаарна уу.

Эдгээр ашиглалтын тохиолдлуудыг номын сангаар хангагдсан жишээг тоймд багтаасан болно.

Илүү боловсронгуй температур, даралтыг хэмжих

Дээрх цуврал мэдэгдэл нь асуудалгүй ажиллах боловч хэд хэдэн асуудал байна.

  1. төхөөрөмж тасралтгүй ажиллаж байгаа тул хамгийн их хэмжээнд эрчим хүч зарцуулж байна. Хэрэв энерги нь батерейгаас гарч байгаа бол үүнийг багасгах шаардлагатай байж магадгүй юм.
  2. хэрэглэсэн цахилгааны улмаас төхөөрөмж дулаарах тул хэмжсэн температур нь орчны температураас өндөр байх болно. Би үүнийг дараагийн алхам дээр илүү дэлгэрэнгүй авч үзэх болно.

Бага энерги зарцуулж, хүрээлэн буй орчинд илүү ойрхон температур өгдөг үр дүнг унтраах параметрүүдтэй start () ашиглан олж авах боломжтой (жишээлбэл горим = 0). Жишээлбэл:

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

Дараа нь хэмжилт хийхийг хүссэн тохиолдолд тохиргооны командыг ашиглан сэрээх хэрэгтэй бөгөөд үүнд osrs_h, osrs_t, osrs_p, mode = 1 (нэг удаагийн горим) тохирох утгыг тохируулдаг F2 (шаардлагатай бол) ба F4 -ийг бүртгэнэ. Жишээлбэл:

[objectName.updateF2Control (1);] // osrs_h - BMP280 -д хэзээ ч хэрэггүй, // ба хэрэв хэмжлийн тоо өөрчлөгдөөгүй бол BME280 -д шаардлагагүй болно // begin () -д заасан утгаас. objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, горим

Төхөөрөмжийг сэрээгээд хэмжиж эхлэх боловч зарим миллисекундэд үр дүн гарахгүй болно - заасан хэмжилтийн тооноос хамааран дор хаяж 4 мс, магадгүй 70 мс ба түүнээс дээш. Хэрэв унших командыг нэн даруй илгээсэн бол төхөөрөмж нь өмнөх хэмжээсийн утгыг буцааж өгөх бөгөөд энэ нь зарим аппликешнд зөвшөөрөгдөх боловч ихэнх тохиолдолд шинэ хэмжүүр бэлэн болтол хойшлуулах нь зүйтэй болов уу.

Энэ саатлыг хэд хэдэн аргаар хийж болно.

  1. хамгийн удаан хүлээгдэж буй хоцролтыг нөхөхийн тулд тодорхой хугацаа хүлээх
  2. хэмжилт хийх хамгийн дээд хэмжих хугацаанаас (өөрөөр хэлбэл 2.3 мс) хэмжлийн тооноос, нэмэлт зардал, маржингаас тооцоолсон хугацааг хүлээнэ үү.
  3. Дээрх байдлаар тооцоолсон богино хугацааг хүлээ, гэхдээ хэмжилтийн нэрлэсэн хугацааг (өөрөөр хэлбэл 2 мс) нэмээд нэмэлт зардлыг ашиглаад статусын бүртгэл дэх "Би хэмжиж байна" битийг шалгаж эхлээрэй. Статусын бит 0 -ийг уншихад (өөрөөр хэлбэл хэмжихгүй) температур ба даралтын заалтыг авна.
  4. статусын бүртгэлийг нэн даруй шалгаж эхлэх ба статусын бит 0,

Үүнийг хийх нэг аргын жишээг би дараа нь үзүүлэх болно.

Тохиргооны бүртгэлийн үйлдлүүд

Энэ бүхнийг хэрэгжүүлэхийн тулд бидэнд хараахан танилцуулаагүй байгаа хэд хэдэн хэрэгсэл хэрэгтэй байна. Тэд:

байт унших Бүртгүүлэх (reg)

хүчингүй updateRegister (reg, value)

Эдгээр нь тус бүр номын санд хэд хэдэн үүсмэл командтай байдаг бөгөөд энэ нь тодорхой үйлдлийн програм хангамжийг арай хялбар болгодог.

PowerSaverPressureAndTemperature.ino жишээ нь 3 -р аргыг ашигладаг. Дахин шалгадаг кодын мөр нь

while (bmp0.readRegister (0xF3) >> 3); // давталт untl F3bit 3 == 0

Энэхүү ноорог нь ESP8266 микроконтроллерт зориулагдсан болохыг анхаарна уу. Би WeMos D1 mini pro ашиглаж байсан. Ноорог нь унтах заавар өөр өөр байдаг Atmega микроконтроллертой ажиллахгүй. Энэхүү ноорог нь бусад хэд хэдэн тушаалуудыг дасгалжуулдаг тул энэ тоймыг илүү дэлгэрэнгүй тайлбарлахаас өмнө бүгдийг нь танилцуулах болно.

Микроконтлер BMP280 мэдрэгчтэй зэрэгцэн унтаж байх үед шаардлагатай хэмжилт хийх мэдрэгчийн тохиргоог start () командын 6 параметрийг ашиглан хийж болно. Гэсэн хэдий ч хэрэв микроконтроллер унтаагүй, харин мэдрэгч байгаа бол хэмжих үед мэдрэгчийг сэрээж, түүний хэмжилтийн тохиргоог хэлэх ёстой. Үүнийг шууд ашиглан хийж болно

updateRegister (бүртгэл, утга)

гэхдээ дараах гурван командын тусламжтайгаар арай хялбар болно.

updateF2Control (osrs_h); // зөвхөн BME280

updateF4Control (osrs_t, osrs_p, горим); updateF5Config (t_sb, шүүлтүүр, spi3W_en);

Хэмжилт хийсний дараа хэрэв ашигласан горим нь нэг удаагийн (Албадан горим) бол төхөөрөмж автоматаар унтах болно. Гэсэн хэдий ч хэрэв хэмжилтийн багц нь тасралтгүй (Хэвийн) горимыг ашиглан олон хэмжилт хийх шаардлагатай бол BMP280 -ийг буцааж унтуулах шаардлагатай болно. Үүнийг дараах хоёр командын аль нэгээр хийж болно.

updateF4Control16xSleep ();

updateF4ControlSleep (утга);

Эдгээр хоёулаа горимын битүүдийг 00 болгож тохируулдаг (өөрөөр хэлбэл унтах горим). Гэсэн хэдий ч эхнийх нь osrs_t ба osrs_p -ийг 111 (өөрөөр хэлбэл 16 хэмжилт) болгож, хоёр дахь нь "утга" -аас бага 6 битийг 0xF4 регистрийн 7: 2 бит болгон хадгалдаг.

Үүний нэгэн адил дараах мэдэгдэл нь "утга" -ын хамгийн бага зургаан битийг 0xF5 регистрийн 7: 2 бит болгон хадгалдаг.

updateF5ConfigSleep (утга);

Эдгээр сүүлийн тушаалуудыг ашиглах нь BMP280 F4 ба F5 регистрүүдэд 12 бит мэдээллийг хадгалах боломжийг олгодог. Наад зах нь ESP8266 -ийн хувьд, микроконтроллер хэсэг хугацааны дараа унтсаны дараа нойрны командын өмнө ямар байдгийг мэдэхгүйгээр ноорогны эхнээс эхэлдэг. Унтах командын өмнө түүний төлөв байдлын талаархи мэдлэгийг хадгалахын тулд өгөгдлийг флэш санах ойд хадгалах боломжтой бөгөөд үүнийг EEPROM функцийг ашиглан эсвэл SPIFFS ашиглан файл бичих замаар хадгалах боломжтой. Гэсэн хэдий ч флэш санах ой нь бичих мөчлөгийн тоог хязгаарладаг бөгөөд 10 000-аас 100 000 хүртэл байдаг. Энэ нь хэрэв микроконтроллер хэдэн секунд тутамд унтах-сэрэх мөчлөгөөр дамждаг бол санах ойн зөвшөөрөгдөх хэмжээнээс давж болно гэсэн үг юм. хэдэн сарын дотор хязгаарлах. BMP280 дээр хэдэн бит өгөгдөл хадгалахад ийм хязгаарлалт байхгүй.

F4 ба F5 бүртгэлд хадгалагдсан өгөгдлийг микроконтроллер командыг ашиглан сэрэхэд сэргээх боломжтой.

readF4Sleep ();

readF5Sleep ();

Эдгээр функцууд нь холбогдох бүртгэлийг уншиж, 2 LSB -ийг устгахын тулд агуулгыг өөрчилж, үлдсэн 6 битийг буцаана. Эдгээр функцийг powerSaverPressureAndTemperatureESP.ino тойм зураг дээр дараах байдлаар ашигласан болно.

// EventCounter -ийн утгыг bmp0 -ээс буцааж уншина уу

байт bmp0F4value = bmp0.readF4Sleep (); // 0 -ээс 63 байт bmp0F5value = bmp0.readF5Sleep (); // 0 -ээс 63 хүртэлх eventCounter = bmp0F5value*64+bmp0F4value; // 0 -ээс 4095 хүртэл

Эдгээр функцууд нь холбогдох бүртгэлийг уншиж, 2 LSB -ийг устгахын тулд агуулгыг өөрчилж, үлдсэн 6 битийг буцаана. Эдгээр функцийг powerSaverPressureAndTemperature.ino тойм зураг дээр дараах байдлаар ашигласан болно.

// EventCounter -ийн утгыг bmp1 -ээс буцааж уншина уу

байт bmp1F4value = bmp1.readF4Sleep (); // 0 -ээс 63 байт bmp1F5value = bmp1.readF5Sleep (); // 0 -ээс 63 хүртэлх eventCounter = bmp1F5value*64+bmp1F4value; // 0 -ээс 4095 хүртэл

Түүхий температур ба даралтын функцууд

Унших үндсэн температур Температур, унших даралт ба унших чийгшил хоёр бүрэлдэхүүн хэсэгтэй. Эхлээд түүхий 20 битийн температур ба даралтын утгыг BME/P280-аас, эсвэл түүхий 16 битийн чийгшлийн утгыг BME280-аас авна. Дараа нь нөхөн олговрын алгоритм нь гаралтын утгыг Цельсийн градус, hPa эсвэл %RH -ээр үүсгэхэд ашиглагддаг.

Номын сан нь эдгээр бүрэлдэхүүн хэсгүүдэд тусдаа функцээр хангадаг бөгөөд ингэснээр түүхий температур, даралт, чийгшлийн өгөгдлийг олж авах, эсвэл ямар нэгэн байдлаар удирдах боломжтой байдаг. Эдгээр түүхий утгаас температур, даралт, чийгшлийг олж авах алгоритмыг мөн өгсөн болно. Номын санд эдгээр алгоритмыг хоёр урттай хөвөгч цэгийн арифметик ашиглан хэрэгжүүлдэг. Энэ нь 32 битийн процессор бөгөөд "давхар" хөвөх хувьсагчдад 64 бит ашигладаг ESP8266 дээр сайн ажилладаг. Эдгээр функцийг хүртээмжтэй болгох нь бусад платформуудын тооцоог үнэлэх, өөрчлөхөд тустай байж магадгүй юм.

Эдгээр функцууд нь:

readRawPressure (rawTemperature); // түүхий даралт ба температурын өгөгдлийг BME/P280readRawHumidity (rawTemperature, rawPressure) -ээс уншдаг; // түүхий чийг, температур, даралтын өгөгдлийг BME280 calcTemperature (rawTemperature, t_fine) -ээс уншдаг; кальцийн даралт (түүхий даралт, t_fine); кальцийн чийгшил (түүхий чийгшил, t_fine)

Эдгээр функцүүдийн "t-fine" аргументийг жаахан тайлбарлах нь зүйтэй болов уу. Даралт ба чийгшлийн нөхөн олговрын алгоритмууд нь t_fine хувьсагчийн тусламжтайгаар хүрэх температураас хамааралтай бүрэлдэхүүн хэсгүүдийг агуулдаг. CalcTemperature функц нь температурын нөхөн олговрын алгоритмын логик дээр үндэслэн t_fine гэсэн утгыг бичдэг бөгөөд үүнийг дараа нь calcPressure болон calcHumidity хоёуланд нь оролт болгон ашигладаг.

Эдгээр функцийг ашиглах жишээг rawPressureAndTemperature.ino ноорог дээрээс болон номын сангийн.cpp файл дахь readHumidity () функцын кодоос олж болно.

Өндөр ба далайн түвшний даралт

Агаар мандлын даралт ба өндрийн хооронд тодорхой холбоо байдаг. Цаг агаар нь дарамтанд нөлөөлдөг. Цаг агаарын байгууллагууд агаар мандлын даралтын мэдээллийг нийтлэхдээ ихэвчлэн өндөрт тохируулдаг тул "синоптик диаграмм" нь далайн түвшний стандартад нийцсэн изобаруудыг (тогтмол даралтын шугамууд) харуулдаг. Үнэхээр энэ харилцаанд 3 үнэ цэнэ байдаг бөгөөд тэдгээрийн хоёрыг нь мэдэх нь гуравдахь утгыг гаргах боломжийг олгодог. 3 утга нь:

  • далайн түвшнээс дээш өндөр
  • тухайн өндөрт байгаа агаарын бодит даралт
  • далайн түвшний агаарын даралт

Энэхүү номын сан нь энэхүү харилцааны хоёр функцийг дараах байдлаар гүйцэтгэдэг.

calcAltitude (даралт, далайн түвшин);

кальцийн хэвийн даралт (даралт, өндөр);

Далайн түвшний стандарт даралтыг 1013.15 гПа гэж үздэг хялбаршуулсан хувилбар бас бий.

calcAltitude (даралт); // далайн түвшний стандарт даралтыг тооцсон

Алхам 3: BMP280 төхөөрөмжийн дэлгэрэнгүй мэдээлэл

BMP280 төхөөрөмжийн дэлгэрэнгүй мэдээлэл
BMP280 төхөөрөмжийн дэлгэрэнгүй мэдээлэл

Тоног төхөөрөмжийн чадвар

BMP280 нь 2 байт тохиргооны өгөгдөлтэй (0xF4 ба 0xF5 регистрийн хаягаар) өгөгдөл дамжуулах, хэмжих олон сонголтыг хянахад ашиглагддаг. Түүхий температур ба даралтын утгыг ердийн температур ба даралтын нэгж болгон хөрвүүлэхэд ашигладаг 2 битийн статусын мэдээлэл, 24 байт тохируулгын параметрүүдийг өгдөг. BME280 нь дараах байдлаар нэмэлт өгөгдөлтэй байна.

  • Олон тооны чийгшлийн хэмжилтийг хянахад ашигладаг 0xF2 регистрийн хаягийн тохиргооны 1 нэмэлт байт;
  • Түүхий чийгшлийн утгыг харьцангуй чийгшлийн хувь болгон хөрвүүлэхэд ашигладаг 8 нэмэлт байт шалгалт тохируулгын параметрүүд.

BME280 -ийн температур, даралт, төлөв байдлын бүртгэл нь BMP280 -тэй адил бөгөөд үүнээс бусад тохиолдолд бага зэрэг үл хамаарна.

  • BME280 -ийн "ID" битүүдийг 0x60 гэж тохируулсан тул BMP280 -аас 0x56, 0x57 эсвэл 0x58 байж болно.
  • унтах цагийн хяналтыг (t_sb) өөрчилснөөр BMP280 (2000 ms ба 4000 ms) хоёр урт хугацааг BME280 -д 10 ms ба 20 ms богино хугацаанд солино. BME280 дахь унтах хамгийн дээд хугацаа нь 1000 мс байна.
  • BME280 -д шүүлтүүр хэрэглэвэл температур ба даралтын түүхий утга үргэлж 20 бит байна. 16-19 битийн утгыг ашиглах нь шүүлтүүргүй тохиолдолд л хязгаарлагддаг (өөрөөр хэлбэл шүүлтүүр = 0).

Температур ба даралт нь 20 битийн утгууд бөгөөд тэдгээрийг температурын 16 16 битийн тохируулгын параметрүүд, 9 16 битийн тохируулгын параметрүүд ба даралтын температурыг ашиглан нэлээд төвөгтэй алгоритмаар уламжлалт температур ба даралт болгон хөрвүүлэх шаардлагатай байдаг. Температурын хэмжээсийн тоосонцор нь хамгийн бага битийн өөрчлөлт (20 битийн уншилт) -ын хувьд 0.0003 градус бөгөөд 16 битийн уншилтыг ашиглах тохиолдолд 0.0046 градус хүртэл нэмэгддэг.

Чийглэг нь 16 битийн утга бөгөөд 8, 12, 16 битийн холимог болох 6 шалгалт тохируулгын параметрийг ашиглан өөр нэг төвөгтэй алгоритмаар харьцангуй чийгшил болгон хөрвүүлэх шаардлагатай болно.

Өгөгдлийн хүснэгтэд температурын уншилтын үнэмлэхүй нарийвчлалыг 25 С-д +-0.5 С, 0-65 С-ийн хооронд +-1 хэм байна.

Даралтын хэмжилтийн нарийвчлал нь 20 битийн нарийвчлалтайгаар 0.15 Паскал (өөрөөр хэлбэл 0.0015 гектоПаскаль) буюу 16 битийн нарийвчлалтайгаар 2.5 Паскал байна. Түүхий даралтын утга нь температурт нөлөөлдөг тул 25С орчим, 1 градусын температурын өсөлт нь хэмжсэн даралтыг 24 Паскалаар бууруулдаг. Температурын мэдрэмжийг тохируулгын алгоритмд тооцдог тул өөр өөр температурт даралтын утгыг нарийвчлалтай өгөх ёстой.

Өгөгдлийн хүснэгтэд даралтын уншилтын үнэмлэхүй нарийвчлалыг 0 С ба 65 С-ийн температурт +-1 hPa гэж харуулав.

Чийгийн нарийвчлалыг мэдээллийн хуудсанд +3% RH, +-1% гистерезис гэж тусгасан болно.

Хэрхэн ажилладаг

Температур ба даралтын шалгалт тохируулгын 24 байт, мөн BME280 -ийн хувьд 8 байт чийгшлийн шалгалт тохируулгын өгөгдлийг төхөөрөмжөөс уншиж, хувьсагч хэлбэрээр хадгалах ёстой. Эдгээр өгөгдлийг үйлдвэрт тус тусад нь төхөөрөмж болгон програмчилдаг тул өөр өөр төхөөрөмжүүд өөр өөр утгатай байдаг - наад зах нь зарим параметрүүдийн хувьд. BME/P280 нь хоёр мужид байж болно. Нэг мужид үүнийг хэмждэг. Нөгөө мужид хүлээж байна (унтаж байна).

0xF3 регистрийн 3 битийг хараад ямар төлөвт байгааг шалгаж болно.

Хамгийн сүүлийн үеийн хэмжилтийн үр дүнг төхөөрөмж унтаж байгаа эсэхээс үл хамааран харгалзах өгөгдлийн утгыг унших замаар авах боломжтой.

BME/P280 -ийг ажиллуулах хоёр арга бий. Нэг нь тасралтгүй горим (өгөгдлийн хүснэгтэд ердийн горим гэж нэрлэдэг) бөгөөд хэмжих ба унтах төлөв байдлын хооронд дахин давтагддаг. Энэ горимд төхөөрөмж хэд хэдэн хэмжилт хийж, дараа нь унтдаг, дараа нь өөр хэмжилт хийхээр сэрдэг гэх мэт. Бие даасан хэмжилтийн тоо, мөчлөгийн унтах хэсгийн үргэлжлэх хугацааг тохиргооны бүртгэлээр хянах боломжтой.

BME/P280 -ийг ажиллуулах өөр нэг арга бол Single Shot горим юм (мэдээллийн хуудсанд албадан горим гэж нэрлэдэг). Энэ горимд төхөөрөмжийг хэмжих тушаалаар унтаж байхад нь сэрээж, хэмжилт хийж, дараа нь унтдаг. Багц дахь бие даасан хэмжилтийн тоог төхөөрөмжийг сэрээх тохиргооны командыг хянадаг.

BMP280 -д хэрэв нэг хэмжилт хийвэл хамгийн чухал 16 битийн утгыг бөглөх бөгөөд утгыг уншихад хамгийн бага ач холбогдолтой дөрвөн бит нь тэг юм. Хэмжилтийн тоог 1, 2, 4, 8 эсвэл 16 болгож тохируулж болох бөгөөд хэмжлийн тоог нэмэгдүүлэхийн хэрээр өгөгдөл агуулсан битүүдийн тоо нэмэгдэх бөгөөд ингэснээр 16 хэмжилт хийхэд бүх 20 битийг хэмжилтийн мэдээллээр дүүргэх болно. Мэдээллийн хүснэгтэд энэ процессыг хэт их түүвэрлэлт гэж нэрлэдэг.

BME280 -д үр дүнг шүүгээгүй тохиолдолд мөн адил зохицуулалт хийгдэнэ. Хэрэв шүүлтүүрийг ашиглавал хэмжлийн мөчлөг бүрт хэдэн хэмжилт хийхээс үл хамааран утгууд нь үргэлж 20 бит байна.

Бие даасан хэмжилт бүр ойролцоогоор 2 миллисекунд зарцуулдаг (ердийн утга; хамгийн их утга нь 2.3 мс). Үүн дээр ойролцоогоор 2 мс (ихэвчлэн арай бага) тогтмол нэмэгдэл зардал нэмнэ гэдэг нь 1 -ээс 32 хүртэлх хэмжилтээс бүрдэх хэмжилтийн дараалал нь 4 ms -аас 66 ms хүртэл үргэлжилж болно гэсэн үг юм.

Мэдээллийн хүснэгтэд янз бүрийн хэрэглээнд зориулагдсан температур ба даралтын хэт дээжлэлтийн санал болгосон хослолуудыг оруулсан болно.

Тохиргооны хяналтын бүртгэлүүд

BMP280 дахь тохиргооны хяналтын хоёр регистр нь 0xF4 ба 0xF5 регистрийн хаягууд дээр байрладаг бөгөөд тохиргооны хяналтын 6 тус тусын утгыг харуулдаг. 0xF4 нь дараахь зүйлээс бүрдэнэ.

  • 3 бит osrs_t (температурыг 0, 1, 2, 4, 8 эсвэл 16 удаа хэмжих);
  • 3 бит osrs_p (даралтыг 0, 1, 2, 4, 8 эсвэл 16 удаа хэмжих); ба
  • 2 бит горим (Унтах, албадан (өөрөөр хэлбэл ганц удаагийн), хэвийн (өөрөөр хэлбэл тасралтгүй).

0xF5 нь дараахь зүйлээс бүрдэнэ.

  • 3 бит t_sb (зогсолтын хугацаа, 0.5ms -аас 4000 ms хүртэл);
  • 3 битийн шүүлтүүр (доороос үзнэ үү); ба
  • SPI эсвэл I2C -ийг сонгодог 1 бит spiw_en.

Шүүлтүүрийн параметр нь түүхий даралт ба температурын хэмжилтийн утгуудад (гэхдээ чийгшлийн утгад хамаарахгүй) хэрэглэгддэг экспоненциал задралын алгоритм эсвэл Infinite Impulse Response (IIR) шүүлтүүрийг хянадаг. Тэгшитгэлийг мэдээллийн хуудсан дээр өгсөн болно. Өөр нэг танилцуулга нь:

Утга (n) = Утга (n-1) * (K-1) / K + хэмжилт (n) / K

энд (n) хамгийн сүүлийн үеийн хэмжилт, гаралтын утгыг заана; ба K нь шүүлтүүрийн параметр юм. Шүүлтүүрийн параметр K ба 1, 2, 4, 8 эсвэл 16 болгож тохируулж болно. Хэрэв K -ийг 1 болгож тохируулсан бол тэгшитгэл нь зүгээр л Value (n) = хэмжилт (n) болно. Шүүлтүүрийн параметрийн кодчилол нь:

  • шүүлтүүр = 000, K = 1
  • шүүлтүүр = 001, K = 2
  • шүүлтүүр = 010, K = 4
  • шүүлтүүр = 011, K = 8
  • шүүлтүүр = 1xx, K = 16

BME 280 нь 0xF2 хаяг дахь "ctrl_hum" гэсэн тохиргооны хяналтын бүртгэлийг нэмж, osrs_h гэсэн 3 битийн параметртэй (чийгшлийг 0, 1, 2, 4, 8 эсвэл 16 удаа хэмжинэ).

Алхам 4: Хэмжилт ба унших хугацаа

Би үүнийг дараа нь командын хугацаа, хэмжилтийн хариу үйлдлийг харуулахаар төлөвлөж байна.

Iddt - температур хэмжих үеийн гүйдэл. Ердийн утга 325 uA

Iddp - даралтыг хэмжих үеийн гүйдэл. Ердийн утга 720 uA, хамгийн ихдээ 1120 uA

Iddsb - зогсолтын горимд байгаа. Ердийн утга 0.2 uA, хамгийн их 0.5 uA

Iddsl - одоо унтах горимд байна. Ердийн утга 0.1 uA, хамгийн их 0.3 uA

Алхам 5: Програм хангамжийн удирдамж

Програм хангамжийн удирдамж
Програм хангамжийн удирдамж
Програм хангамжийн удирдамж
Програм хангамжийн удирдамж

I2C тэсрэлтийн горим

BMP280 мэдээллийн хуудас нь өгөгдлийг унших талаар зааварчилгаа өгдөг (хэсэг 3.9). Энэ нь "тэсрэлтийг уншихыг ашиглахыг зөвлөж байна, бүртгэл бүрийг дангаар нь авч үзэхгүй. Энэ нь өөр өөр хэмжигдэхүүнтэй байтуудын холилдохоос сэргийлж, интерфэйсийн урсгалыг багасгах болно." Нөхөн олговор/шалгалт тохируулгын параметрүүдийг унших талаар зааварчилгаа өгөөгүй болно. Эдгээр нь статик бөгөөд өөрчлөгддөггүй тул асуудал биш юм.

Энэхүү номын сан нь температур, даралтын нөхөн олговрын параметрийн хувьд 24 байт, температур ба даралтыг хослуулан 6 байт, чийгшил, температур, даралтыг хослуулан 8 байтыг нэг удаагийн уншихад л уншдаг. Зөвхөн температурыг шалгахад зөвхөн 3 байтыг уншдаг.

Макро ашиглах (#define гэх мэт)

Энэ номын санд давхардал үүсэхээс сэргийлдэг "оруулах хамгаалагч" макроос өөр макро байдаггүй.

Бүх тогтмолуудыг const түлхүүр үг ашиглан тодорхойлдог бөгөөд дибаг хэвлэх ажлыг стандарт С функцээр хянадаг.

Энэ нь миний хувьд тодорхойгүй байдлын эх үүсвэр байсан боловч энэ сэдвээр олон бичлэгийг уншихаас авсан зөвлөгөө бол тогтмол байдлыг тунхаглахад (наад зах нь), (магадгүй) хэвлэх дибаг хийх хяналтыг ашиглахад шаардлагагүй, хүсээгүй зүйл юм.

#Define гэхээсээ илүү const ашиглах тохиолдол маш ойлгомжтой байдаг - const нь #define (өөрөөр хэлбэл nil) -тай ижил нөөцийг ашигладаг бөгөөд үр дүн нь хамрах дүрмийг дагаж мөрддөг бөгөөд ингэснээр алдааны магадлалыг бууруулдаг.

Дебаг хэвлэх хяналтыг хийх тохиолдол арай ойлгомжтой биш байна, учир нь миний хийсэн арга нь эцсийн код нь дибаг хийх хэвлэх мэдэгдлийг хэзээ ч хэрэгжүүлээгүй байсан ч гэсэн логикийг агуулдаг гэсэн үг юм. Хэрэв номын санг санах ой хязгаарлагдмал микроконтроллерийн том төсөлд ашиглах гэж байгаа бол энэ нь асуудал болж магадгүй юм. Миний хөгжүүлэлт нь том флаш санах ойтой ESP8266 дээр хийгдсэн тул энэ нь надад тийм ч чухал биш юм шиг санагдсан.

Алхам 6: Температурын гүйцэтгэл

Үүнийг дараа нэмж оруулахаар төлөвлөж байна.

Алхам 7: Даралтын гүйцэтгэл

Үүнийг дараа нэмж оруулахаар төлөвлөж байна.

Зөвлөмж болгож буй: