Mục lục:

Thư viện cho BMP280 và BME280: 7 bước
Thư viện cho BMP280 và BME280: 7 bước

Video: Thư viện cho BMP280 và BME280: 7 bước

Video: Thư viện cho BMP280 và BME280: 7 bước
Video: Lesson 29: Introduction to BMP280 Temperature Sensor| Arduino Step By Step Course 2024, Tháng mười một
Anonim
Thư viện cho BMP280 và BME280
Thư viện cho BMP280 và BME280
Thư viện cho BMP280 và BME280
Thư viện cho BMP280 và BME280
Thư viện cho BMP280 và BME280
Thư viện cho BMP280 và BME280

Giới thiệu

Tôi đã không đặt ra để viết thư viện này. Nó "xảy ra" như một tác dụng phụ của một dự án tôi bắt đầu sử dụng BMP280. Dự án đó vẫn chưa kết thúc, nhưng tôi nghĩ rằng thư viện đã sẵn sàng để chia sẻ với những người khác. Sau đó, tôi có nhu cầu sử dụng BME280, bổ sung tính năng đo độ ẩm cho khả năng áp suất và nhiệt độ của BMP280. BME280 "tương thích ngược" với BMP280 - nghĩa là, tất cả các thanh ghi và các bước cần thiết để đọc áp suất và nhiệt độ từ BME280 đều giống như các thanh ghi được sử dụng cho BMP280. Có các thanh ghi bổ sung và các bước cần thiết để đọc độ ẩm, chỉ áp dụng cho BME280. Điều này đặt ra câu hỏi, một thư viện cho cả hai hay hai thư viện riêng biệt. Phần cứng của hai loại thiết bị hoàn toàn có thể hoán đổi cho nhau. Thậm chí nhiều mô-đun đang được bán (ví dụ trên Ebay và AliExpress) được dán nhãn BME / P280. Để biết đó là loại nào, bạn phải nhìn vào chữ viết (rất nhỏ) trên chính cảm biến hoặc kiểm tra byte ID của thiết bị. Tôi quyết định đi đến một thư viện duy nhất. Nó dường như đã làm việc tốt.

Phản hồi, đặc biệt là bất kỳ đề xuất cải tiến nào, sẽ được đánh giá cao.

Các tính năng và khả năng của thư viện

Thư viện là một phần mềm cung cấp Giao diện lập trình ứng dụng (API) để lập trình viên thực hiện các khả năng của thiết bị mà không nhất thiết phải xử lý tất cả các chi tiết nhỏ. Đáng mong đợi, API phải dễ dàng cho người mới bắt đầu với các yêu cầu đơn giản để bắt đầu, đồng thời cung cấp khả năng khai thác đầy đủ các khả năng của thiết bị. Đáng mong đợi, thư viện phải tuân theo bất kỳ hướng dẫn cụ thể nào từ nhà sản xuất thiết bị, cũng như thông lệ tốt về phần mềm nói chung. Tôi đã nỗ lực để đạt được tất cả những điều này. Khi bắt đầu với BMP280, tôi đã tìm thấy 3 thư viện khác nhau cho nó: Adafruit_BMP280; Đã xem_BMP280; và một cái tên là BMP280 từ nhà sản xuất thiết bị. Cả Adafruit và Seeed đều không cung cấp các khả năng mở rộng, mặc dù chúng hoạt động tốt và dễ sử dụng cho các ứng dụng cơ bản. Tôi không thể tìm ra cách sử dụng thiết bị do nhà sản xuất thiết bị (Bosch Sensortec) sản xuất. Đây có thể là sự thiếu hụt của tôi, hơn là của họ. Tuy nhiên, thư viện phức tạp hơn nhiều so với hai thư viện kia, tôi không thể tìm thấy bất kỳ hướng dẫn hoặc ví dụ nào về cách sử dụng (sau đó tôi tìm thấy các ví dụ trong tệp "bmp280_support.c", tuy nhiên chúng không đặc biệt hữu ích đối với tôi).

Do những yếu tố này, tôi quyết định viết thư viện của riêng mình cho BMP280.

Xem xét tình hình thư viện cho BME280, tôi tìm thấy các thư viện riêng biệt Adafruit_BME280, Seed_BME280 và một thư viện khác BME280_MOD-1022 được viết bởi Embedded Adventures. Không ai trong số họ kết hợp các chức năng cho BMP280 trong một thư viện có khả năng sử dụng BME280. Không ai trong số họ hỗ trợ rõ ràng khả năng của các thiết bị để lưu trữ một vài bit dữ liệu trong khi thiết bị và bộ vi xử lý điều khiển của nó đang ngủ (khả năng này được hiển thị rõ ràng trong biểu dữ liệu và được hỗ trợ trong thư viện mà tôi đã viết và mô tả ở đây).

Một thư viện kết hợp nên có hỗ trợ cho tất cả các khả năng của BME280, nhưng khi được sử dụng với BMP280, nó sẽ không áp đặt bất kỳ chi phí nào từ các chức năng không sử dụng. Lợi ích của thư viện kết hợp bao gồm ít tệp thư viện hơn để quản lý, dễ dàng kết hợp và kết hợp các thiết bị khác nhau trong cùng một dự án và các thay đổi được đơn giản hóa để bảo trì hoặc nâng cấp chỉ phải thực hiện ở một nơi thay vì hai. Đây có lẽ là những thứ khá nhỏ, thậm chí không đáng kể, nhưng…

Khả năng của thiết bị

BMP280 và BME280 là các thiết bị gắn trên bề mặt có kích thước khoảng 5mm vuông và cao 1mm. Có 8 tấm đệm giao diện, bao gồm 2 tấm đệm đầu vào nguồn điện riêng biệt và hai tấm nền tiếp đất. Chúng có sẵn trên eBay dưới dạng mô-đun có 4 hoặc 6 chân được đưa ra. Mô-đun 4 chân có địa chỉ I2C cố định và không thể được cấu hình để sử dụng giao thức SPI.

Mô-đun 6 chân hoặc thiết bị trần có thể được sử dụng với giao thức I2C hoặc SPI. Trong chế độ I2C, nó có thể có hai địa chỉ khác nhau, đạt được bằng cách kết nối chân SDO với Ground (đối với địa chỉ cơ sở = 0x76) hoặc với Vdd (đối với địa chỉ cơ sở +1 = 0x77). Trong chế độ SPI, nó có sự sắp xếp thông thường gồm 1 đồng hồ, 2 dữ liệu (một cho mỗi hướng) và một chân chọn thiết bị (CS).

Thư viện tôi đã viết và mô tả ở đây chỉ hỗ trợ I2C. Thư viện Adafruit_BMP280 và BME_MOD-1022 có hỗ trợ cho cả i2C và SPI.

Thư viện có thể được tải xuống tại đây:

github.com/farmerkeith/BMP280-library

Bước 1: Thiết lập phần cứng

Thiết lập phần cứng
Thiết lập phần cứng

Trước khi thư viện có thể hữu ích, cần phải kết nối vi điều khiển với BMP280 (hoặc với hai trong số chúng nếu bạn muốn).

Tôi đã sử dụng WeMos D1 mini pro, vì vậy tôi sẽ hiển thị các kết nối của nó. Các vi điều khiển khác cũng sẽ tương tự như vậy, bạn chỉ cần kết nối đúng các chân SDA và SCL là được.

Trong trường hợp của WeMos D1 mini pro, các kết nối là:

Chức năng WeMos pin BMP280 pin Ghi chú

SDA D2 SDA SCL D1 SCL Vdd 3V3 Vin Danh nghĩa 3.3V Mặt đất GND Điều khiển địa chỉ SDO Mặt đất hoặc Vdd I2C chọn CSB Vdd (GND chọn SPI)

Lưu ý rằng chân SDO trên một số mô-đun MP280 được gắn nhãn SDD và chân Vdd có thể được gắn nhãn VCC. Lưu ý: Đường dây SDA và SCL phải có điện trở kéo lên giữa đường dây và chân Vin. Thông thường, giá trị 4,7K là OK. Một số mô-đun BMP280 và BME280 có điện trở kéo lên 10K được bao gồm trong mô-đun (điều này không tốt, vì đặt nhiều thiết bị trên bus I2C có thể tải nó quá mức). Tuy nhiên, việc sử dụng 2 mô-đun BME / P280, mỗi mô-đun có điện trở 10K sẽ không có vấn đề gì trong thực tế miễn là không có quá nhiều thiết bị khác trên cùng một bus cũng có điện trở kéo lên.

Khi bạn đã kết nối phần cứng, bạn có thể dễ dàng kiểm tra xem thiết bị của mình là BMP280 hay BME280 bằng cách chạy I2CScan_ID phác thảo mà bạn có thể tìm thấy tại đây:

Bạn cũng có thể kiểm tra xem mình có BMP280 hay BME280 hay không bằng cách nhìn vào chính thiết bị. Tôi thấy cần thiết phải sử dụng kính hiển vi kỹ thuật số để làm điều này, nhưng nếu thị lực của bạn rất tốt, bạn có thể làm được điều đó mà không cần bất kỳ dụng cụ hỗ trợ nào. Có hai dòng in trên vỏ của thiết bị. Chìa khóa là chữ cái đầu tiên trên dòng thứ hai, trong trường hợp thiết bị BMP280 là "K" và trong trường hợp thiết bị BME280 là "U".

Bước 2: API do Thư viện cung cấp

API do Thư viện cung cấp
API do Thư viện cung cấp
API do Thư viện cung cấp
API do Thư viện cung cấp

Bao gồm cả thư viện trong một bản phác thảo

Thư viện được bao gồm trong một bản phác thảo theo cách tiêu chuẩn bằng cách sử dụng câu lệnh

#include "farmkeith_BMP280.h"

Câu lệnh này cần được đưa vào phần đầu của bản phác thảo trước khi bắt đầu hàm setup ().

Tạo đối tượng phần mềm BME hoặc BMP

Có 3 cấp độ để tạo đối tượng phần mềm BMP280. Đơn giản nhất chỉ là

bme280 objectName; hoặc bmp280 objectName;

ví dụ: BMP280 bmp0;

Điều này tạo ra một đối tượng phần mềm có địa chỉ mặc định là 0x76 (tức là cho SDO được kết nối với mặt đất).

Cấp tiếp theo để tạo đối tượng phần mềm BME280 hoặc BMP280 có tham số là 0 hoặc 1, như sau:

bme280 objectNameA (0);

bmp280 objectNameB (1);

Tham số (0 hoặc 1) được thêm vào địa chỉ cơ sở I2C, để hai thiết bị BME280 hoặc BMP280 có thể được sử dụng trên cùng một bus I2C (bao gồm một trong mỗi thiết bị).

Mức thứ ba để tạo đối tượng phần mềm BME hoặc BMP280 có hai tham số. Tham số đầu tiên, là 0 hoặc 1, dành cho địa chỉ, như đối với trường hợp trước. Tham số thứ hai điều khiển quá trình in gỡ lỗi. Nếu nó được đặt thành 1, mỗi giao dịch với đối tượng phần mềm sẽ dẫn đến kết quả đầu ra Serial.print cho phép lập trình viên xem chi tiết của giao dịch. Ví dụ:

bmp280 objectNameB (1, 1);

Nếu thông số in gỡ lỗi được đặt thành 0, đối tượng phần mềm sẽ trở lại hoạt động bình thường (không in).

Câu lệnh này hoặc các câu lệnh cần được bao gồm sau #include và trước hàm setup ().

Khởi tạo đối tượng phần mềm BME hoặc BMP

Trước khi sử dụng, cần phải đọc các thông số hiệu chuẩn từ thiết bị và cấu hình thiết bị cho bất kỳ chế độ đo nào, cài đặt lấy mẫu quá mức và bộ lọc phù hợp.

Đối với khởi tạo đơn giản, mục đích chung, câu lệnh là:

objectName.begin ();

Phiên bản này của begin () đọc các thông số hiệu chuẩn từ thiết bị và đặt osrs_t = 7 (16 phép đo nhiệt độ), osrs_p = 7 (16 phép đo áp suất), mode = 3 (liên tục, Bình thường), t_sb = 0 (0,5 ms nghỉ giữa bộ đo lường), bộ lọc = 0 (K = 1, do đó không có bộ lọc) và spiw_en = 0 (SPI bị vô hiệu hóa, vì vậy hãy sử dụng I2C). Trong trường hợp của BME280, có thêm một tham số osrs_h = 7 cho 16 phép đo độ ẩm.

Có một phiên bản khác của begin () có tất cả sáu (hoặc 7) tham số. Tương đương với câu lệnh trên là

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

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

Danh sách đầy đủ các mã và ý nghĩa của chúng có trong bảng dữ liệu BME280 và BMP280, cũng như trong các chú thích trong tệp.cpp trong thư viện.

Đo nhiệt độ và áp suất đơn giản

Để đo nhiệt độ, cách đơn giản nhất là

nhiệt độ kép = objectName.readTempe Heat (); // đo nhiệt độ

Để đo áp suất, cách đơn giản nhất là

áp suất kép = objectName.readPressure (); // đo áp suất

Để đo độ ẩm, cách đơn giản nhất là

độ ẩm kép = objectName.readHumidity (); // đo độ ẩm (chỉ BME280)

Để có được cả nhiệt độ và áp suất, hai câu trên có thể được sử dụng lần lượt, nhưng có một lựa chọn khác, đó là:

nhiệt độ gấp đôi;

áp suất kép = objectName.readPressure (nhiệt độ); // đo áp suất và nhiệt độ

Câu lệnh này chỉ đọc dữ liệu từ thiết bị BME280 hoặc BMP280 một lần và trả về cả nhiệt độ và áp suất. Đây là cách sử dụng bus I2C hiệu quả hơn một chút và đảm bảo rằng hai số đọc tương ứng với cùng một chu kỳ đo.

Đối với BME 280, một tuyên bố kết hợp nhận được cả ba giá trị (độ ẩm, nhiệt độ và áp suất) là:

nhiệt độ, áp suất kép; độ ẩm kép = objectName.readHumidity (nhiệt độ, áp suất); // đo độ ẩm, áp suất và nhiệt độ

Câu lệnh này chỉ đọc dữ liệu từ thiết bị BMP280 một lần và trả về cả ba giá trị. Đây là cách sử dụng bus I2C hiệu quả hơn một chút và đảm bảo rằng ba lần đọc tương ứng với cùng một chu kỳ đo. Lưu ý rằng tên của các biến có thể được thay đổi thành bất kỳ thứ gì người dùng thích, nhưng thứ tự của chúng là cố định - nhiệt độ đứng đầu và áp suất đứng sau.

Các trường hợp sử dụng này được bao gồm trong các bản phác thảo ví dụ được cung cấp cùng với thư viện, là basicTempentic.ino, basicPressure.ino, basicHumidity.ino, basicTempenticAndPressure.ino và basicHumidityAndTempenticAndPressure.ino.

Đo nhiệt độ và áp suất phức tạp hơn

Mặc dù loạt câu lệnh trên sẽ hoạt động mà không có vấn đề gì, nhưng có một số vấn đề:

  1. thiết bị đang chạy liên tục và do đó đang tiêu thụ điện năng ở mức tối đa. Nếu năng lượng đến từ pin, có thể cần phải giảm điều này.
  2. do điện năng tiêu thụ, thiết bị sẽ bị nóng lên, và do đó nhiệt độ đo được sẽ cao hơn nhiệt độ môi trường xung quanh. Tôi sẽ đề cập đến vấn đề này nhiều hơn trong bước sau.

Có thể thu được kết quả sử dụng ít năng lượng hơn và cho nhiệt độ gần với môi trường xung quanh hơn bằng cách sử dụng begin () với các tham số đưa nó vào chế độ ngủ (ví dụ: mode = 0). Ví dụ:

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

Sau đó, khi muốn đo, hãy đánh thức thiết bị bằng lệnh cấu hình để đăng ký F2 (nếu cần) và F4 để đặt các giá trị thích hợp của osrs_h, osrs_t và osrs_p, plus mode = 1 (chế độ chụp một lần). Ví dụ:

[objectName.updateF2Control (1);] // osrs_h - không cần thiết cho BMP280, // và không cần thiết cho BME280 nếu Số phép đo không bị thay đổi // so với giá trị được cung cấp trong begin (). objectName.updateF4Control (1, 1, 1); // osrs_t, osrs_p, mode

Sau khi đánh thức thiết bị, thiết bị sẽ bắt đầu đo, nhưng kết quả sẽ không có trong vài mili giây - ít nhất là 4 ms, có thể lên đến 70 ms hoặc hơn, tùy thuộc vào số lượng phép đo đã được chỉ định. Nếu lệnh đọc được gửi ngay lập tức, thiết bị sẽ trả về các giá trị từ lần đo trước - điều này có thể được chấp nhận trong một số ứng dụng, nhưng trong hầu hết các trường hợp, tốt hơn là nên trì hoãn cho đến khi có phép đo mới.

Sự chậm trễ này có thể được thực hiện theo một số cách.

  1. đợi một khoảng thời gian cố định để bù đắp khoảng thời gian trì hoãn dự kiến dài nhất
  2. đợi một khoảng thời gian được tính từ thời gian đo tối đa cho mỗi lần đo (tức là 2,3 mili giây) nhân với số lần đo, cộng với chi phí, cộng với biên độ.
  3. chờ một khoảng thời gian ngắn hơn được tính như trên, nhưng sử dụng thời gian đo danh nghĩa (tức là 2 ms) cộng với chi phí, và sau đó bắt đầu kiểm tra bit "Tôi đang đo" trong thanh ghi trạng thái. Khi bit trạng thái đọc 0 (tức là không đo), nhận các giá trị nhiệt độ và áp suất.
  4. ngay lập tức bắt đầu kiểm tra thanh ghi trạng thái và nhận các số đọc nhiệt độ và áp suất khi bit trạng thái đọc 0,

Tôi sẽ đưa ra một ví dụ về một cách thực hiện điều này một chút sau.

Hoạt động đăng ký cấu hình

Để thực hiện tất cả những điều này, chúng ta cần một số công cụ mà tôi chưa giới thiệu. Họ đang:

byte readRegister (đăng ký)

void updateRegister (reg, value)

Mỗi lệnh này có một số lệnh dẫn xuất trong thư viện, điều này làm cho phần mềm cho các hành động cụ thể trở nên đơn giản hơn một chút.

Ví dụ powerSaverPressureAndTempentic.ino sử dụng phương pháp số 3. Dòng mã thực hiện việc kiểm tra lặp lại là

while (bmp0.readRegister (0xF3) >> 3); // vòng lặp hủy F3bit 3 == 0

Lưu ý rằng bản phác thảo này dành cho vi điều khiển ESP8266. Tôi đã sử dụng WeMos D1 mini pro. Bản phác thảo sẽ không hoạt động với vi điều khiển Atmega, có các hướng dẫn khác nhau để ngủ. Bản phác thảo này thực hành một số lệnh khác, vì vậy tôi sẽ giới thiệu tất cả chúng trước khi mô tả chi tiết hơn bản phác thảo đó.

Khi bộ vi mạch đang ngủ song song với cảm biến BMP280, cấu hình của cảm biến cho các phép đo cần thiết có thể được thực hiện trong lệnh begin (), sử dụng 6 tham số. Tuy nhiên, nếu bộ vi điều khiển không ngủ mà là cảm biến thì tại thời điểm đo, cảm biến phải được đánh thức và báo cho cấu hình đo của nó. Điều này có thể được thực hiện trực tiếp với

updateRegister (reg, value)

nhưng dễ dàng hơn một chút với ba lệnh sau:

updateF2Control (osrs_h); // Chỉ BME280

updateF4Control (osrs_t, osrs_p, mode); updateF5Config (t_sb, bộ lọc, spi3W_en);

Sau khi đo xong, nếu chế độ được sử dụng là Single shot (Chế độ cưỡng bức), thì thiết bị sẽ tự động chuyển sang chế độ ngủ. Tuy nhiên, nếu bộ đo liên quan đến nhiều phép đo sử dụng chế độ liên tục (Bình thường) thì BMP280 sẽ cần được đưa về chế độ ngủ. Điều này có thể được thực hiện bằng một trong hai lệnh sau:

updateF4Control16xSleep ();

updateF4ControlSleep (giá trị);

Cả hai điều này đều đặt các bit chế độ thành 00 (tức là chế độ ngủ). Tuy nhiên, cái đầu tiên đặt osrs_t và osrs_p thành 111 (tức là 16 phép đo) trong khi cái thứ hai lưu 6 bit thấp từ "giá trị" thành bit 7: 2 của thanh ghi 0xF4.

Tương tự, câu lệnh sau đây lưu trữ sáu bit thấp của "giá trị" thành các bit 7: 2 của thanh ghi 0xF5.

updateF5ConfigSleep (giá trị);

Việc sử dụng các lệnh sau này cho phép lưu trữ 12 bit thông tin trong các thanh ghi BMP280 F4 và F5. Ít nhất là trong trường hợp của ESP8266, khi bộ vi điều khiển thức dậy sau một khoảng thời gian ngủ, nó sẽ bắt đầu ở phần đầu của bản phác thảo mà không biết về trạng thái của nó trước lệnh ngủ. Để lưu trữ kiến thức về trạng thái của nó trước lệnh ngủ, dữ liệu có thể được lưu trữ trong bộ nhớ flash, sử dụng các chức năng EEPROM hoặc bằng cách ghi tệp bằng SPIFFS. Tuy nhiên, bộ nhớ flash có giới hạn về số chu kỳ ghi, theo thứ tự từ 10, 000 đến 100, 000. Điều này có nghĩa là nếu bộ vi điều khiển đang trải qua chu kỳ ngủ - thức cứ sau vài giây, nó có thể vượt quá bộ nhớ cho phép ghi. giới hạn trong một vài tháng. Lưu trữ một vài bit dữ liệu trong BMP280 không có giới hạn như vậy.

Dữ liệu được lưu trữ trong thanh ghi F4 và F5 có thể được phục hồi khi bộ vi điều khiển thức dậy bằng cách sử dụng các lệnh

readF4Sleep ();

readF5Sleep ();

Các hàm này đọc thanh ghi tương ứng, dịch chuyển nội dung để loại bỏ 2 LSB và trả về 6 bit còn lại. Các hàm này được sử dụng trong ví dụ phác thảo powerSaverPressureAndTempeosystemESP.ino như sau:

// đọc lại giá trị của EventCounter từ bmp0

byte bmp0F4value = bmp0.readF4Sleep (); // 0 đến 63 byte bmp0F5value = bmp0.readF5Sleep (); // 0 đến 63 eventCounter = bmp0F5value * 64 + bmp0F4value; // 0 đến 4095

Các hàm này đọc thanh ghi tương ứng, dịch chuyển nội dung để loại bỏ 2 LSB và trả về 6 bit còn lại. Các hàm này được sử dụng trong ví dụ phác thảo powerSaverPressureAndTempentic.ino như sau:

// đọc lại giá trị của EventCounter từ bmp1

byte bmp1F4value = bmp1.readF4Sleep (); // 0 đến 63 byte bmp1F5value = bmp1.readF5Sleep (); // 0 đến 63 eventCounter = bmp1F5value * 64 + bmp1F4value; // 0 đến 4095

Các chức năng nhiệt độ và áp suất thô

Các hàm readTempe Heat, readPressure và readHumidity cơ bản có hai thành phần. Đầu tiên, giá trị nhiệt độ và áp suất 20 bit thô nhận được từ BME / P280 hoặc giá trị độ ẩm 16 bit thô nhận được từ BME280. Sau đó, thuật toán bù được sử dụng để tạo ra các giá trị đầu ra theo độ C, hPa hoặc% RH.

Thư viện cung cấp các chức năng riêng biệt cho các thành phần này để có thể thu được dữ liệu nhiệt độ thô, lực ép và độ ẩm, và có thể được thao tác theo một cách nào đó. Thuật toán để lấy nhiệt độ, áp suất và độ ẩm từ các giá trị thô này cũng được cung cấp. Trong thư viện, các thuật toán này được thực hiện bằng cách sử dụng số học dấu phẩy động có độ dài kép. Nó hoạt động tốt trên ESP8266 là bộ xử lý 32 bit và sử dụng 64 bit cho các biến float "kép". Làm cho các chức năng này có thể truy cập được có thể hữu ích cho việc đánh giá và có thể thay đổi cách tính cho các nền tảng khác.

Các chức năng này là:

readRawPressure (rawTempe Nhiệt độ); // đọc dữ liệu áp suất và nhiệt độ thô từ BME / P280readRawHumidity (rawTempe Heat, rawPressure); // đọc dữ liệu độ ẩm, nhiệt độ và áp suất thô từ BME280 calcTempe Heat (rawTempe Heat, t_fine); calcPressure (rawPressure, t_fine); calcHumidity (rawHumidity, t_fine)

Đối số "t-fine" cho các hàm này đáng để giải thích một chút. Cả hai thuật toán bù áp suất và độ ẩm đều bao gồm thành phần phụ thuộc nhiệt độ đạt được thông qua biến t_fine. Hàm calcTempether ghi một giá trị trong t_fine dựa trên logic thuật toán bù nhiệt độ, sau đó được sử dụng làm đầu vào trong cả calcPressure và calcHumidity.

Ví dụ về việc sử dụng các hàm này có thể được tìm thấy trong ví dụ phác thảo rawPressureAndTempentic.ino và cũng trong mã cho hàm readHumidity () trong tệp.cpp của thư viện.

Độ cao và áp suất mực nước biển

Có một mối quan hệ đã biết giữa áp suất khí quyển và độ cao. Thời tiết cũng ảnh hưởng đến áp suất. Khi các tổ chức thời tiết công bố thông tin về áp suất khí quyển, họ thường điều chỉnh nó theo độ cao và do đó, "biểu đồ khái quát" cho thấy các đường đẳng áp (đường áp suất không đổi) được chuẩn hóa để có nghĩa là mực nước biển. Vì vậy, thực sự có 3 giá trị trong mối quan hệ này, và biết hai trong số chúng sẽ cho phép suy ra giá trị thứ ba. 3 giá trị là:

  • độ cao trên mực nước biển
  • áp suất không khí thực tế ở độ cao đó
  • áp suất không khí tương đương ở mực nước biển (nói đúng hơn là mực nước biển trung bình, vì mực nước biển tức thời liên tục thay đổi)

Thư viện này cung cấp hai hàm cho mối quan hệ này, như sau:

calcAltitude (áp suất, seaLevelhPa);

calcNormalisedPressure (áp suất, độ cao);

Ngoài ra còn có một phiên bản đơn giản, giả định áp suất mực nước biển tiêu chuẩn là 1013,15 hPa.

calcAltitude (áp suất); // tiêu chuẩn seaLevelPressure giả định

Bước 3: Chi tiết thiết bị BMP280

Chi tiết thiết bị BMP280
Chi tiết thiết bị BMP280

Khả năng phần cứng

BMP280 có 2 byte dữ liệu cấu hình (tại địa chỉ thanh ghi 0xF4 và 0xF5) được sử dụng để điều khiển nhiều tùy chọn đo lường và đầu ra dữ liệu. Nó cũng cung cấp 2 bit thông tin trạng thái và 24 byte thông số hiệu chuẩn được sử dụng để chuyển đổi các giá trị nhiệt độ và áp suất thô thành các đơn vị nhiệt độ và áp suất thông thường. BME280 có thêm dữ liệu như sau:

  • Thêm 1 byte dữ liệu cấu hình tại địa chỉ thanh ghi 0xF2 được sử dụng để điều khiển nhiều phép đo độ ẩm;
  • Thêm 8 byte thông số hiệu chuẩn được sử dụng để chuyển đổi giá trị độ ẩm thô thành phần trăm độ ẩm tương đối.

Thanh ghi nhiệt độ, áp suất và trạng thái cho BME280 cũng giống như cho BMP280 với những ngoại lệ nhỏ như sau:

  • các bit "ID" của BME280 được đặt thành 0x60, vì vậy nó có thể được phân biệt với BMP280 có thể là 0x56, 0x57 hoặc 0x58
  • kiểm soát thời gian ngủ (t_sb) được thay đổi để hai thời gian dài trong BMP280 (2000 ms và 4000 ms) được thay thế trong BME280 với thời gian ngắn là 10 ms và 20 ms. Thời gian ngủ tối đa trong BME280 là 1000 ms.
  • Trong BME280, các giá trị thô của nhiệt độ và áp suất luôn là 20 bit nếu áp dụng bộ lọc. Việc sử dụng các giá trị từ 16 đến 19 bit được giới hạn trong các trường hợp không có bộ lọc (tức là bộ lọc = 0).

Nhiệt độ và áp suất là mỗi giá trị 20 bit, cần được chuyển đổi thành nhiệt độ và áp suất thông thường thông qua một thuật toán khá phức tạp sử dụng 3 thông số hiệu chuẩn 16 bit cho nhiệt độ và 9 thông số hiệu chuẩn 16 bit cộng với nhiệt độ cho áp suất. Độ chi tiết của phép đo nhiệt độ là 0,0003 độ C đối với mức thay đổi bit ít đáng kể nhất (mức đọc 20 bit), tăng lên 0,0046 độ C nếu sử dụng mức đọc 16 bit.

Độ ẩm là một giá trị 16 bit cần được chuyển đổi thành độ ẩm tương đối thông qua một thuật toán phức tạp khác sử dụng 6 thông số hiệu chuẩn là sự kết hợp của 8, 12 và 16 bit.

Bảng dữ liệu cho thấy độ chính xác tuyệt đối của kết quả đọc nhiệt độ là + -0,5 C ở 25 C và + -1 C trong phạm vi từ 0 đến 65 C.

Độ chi tiết của phép đo áp suất là 0,15 Pascals (tức là 0,0015 hectoPascals) ở độ phân giải 20 bit, hoặc 2,5 Pascals ở độ phân giải 16 bit. Giá trị áp suất thô bị ảnh hưởng bởi nhiệt độ, do đó ở khoảng 25C, nhiệt độ tăng 1 độ C sẽ làm giảm áp suất đo được 24 Pascals. Độ nhạy nhiệt độ được tính đến trong thuật toán hiệu chuẩn, vì vậy các giá trị áp suất được phân phối phải chính xác ở các nhiệt độ khác nhau.

Bảng dữ liệu cho thấy độ chính xác tuyệt đối của việc đọc áp suất là + -1 hPa đối với nhiệt độ từ 0 C đến 65 C.

Độ chính xác của độ ẩm được đưa ra trong bảng dữ liệu là + -3% RH và + -1% độ trễ.

Làm thế nào nó hoạt động

24 byte dữ liệu hiệu chuẩn nhiệt độ và áp suất, và trong trường hợp của BME280, 8 byte dữ liệu hiệu chuẩn độ ẩm phải được đọc từ thiết bị và được lưu trữ trong các biến. Các dữ liệu này được lập trình riêng vào thiết bị trong nhà máy, vì vậy các thiết bị khác nhau có các giá trị khác nhau - ít nhất là đối với một số tham số. BME / P280 có thể ở một trong hai trạng thái. Ở một trạng thái, nó đang đo. Ở trạng thái khác, nó đang chờ đợi (đang ngủ).

Nó ở trạng thái nào có thể được kiểm tra bằng cách nhìn vào bit 3 của thanh ghi 0xF3.

Kết quả của phép đo gần đây nhất có thể nhận được bất kỳ lúc nào bằng cách đọc giá trị dữ liệu tương ứng, bất kể thiết bị đang ở chế độ ngủ hay đang đo.

Ngoài ra còn có hai cách vận hành BME / P280. Một là chế độ Liên tục (được gọi là chế độ Bình thường trong bảng dữ liệu) lặp đi lặp lại giữa các trạng thái Đo và Ngủ. Ở chế độ này, thiết bị thực hiện một tập hợp các phép đo, sau đó chuyển sang chế độ ngủ, sau đó thức dậy để thực hiện một bộ phép đo khác, v.v. Số lượng các phép đo riêng lẻ và thời gian của phần ngủ của chu kỳ đều có thể được kiểm soát thông qua các thanh ghi cấu hình.

Một cách khác để vận hành BME / P280 là chế độ Single Shot (được gọi là chế độ Cưỡng bức trong bảng dữ liệu). Ở chế độ này, thiết bị được đánh thức từ chế độ ngủ bằng lệnh để đo, nó thực hiện một tập hợp các phép đo, sau đó quay trở lại chế độ ngủ. Số lượng phép đo riêng lẻ trong bộ được kiểm soát trong lệnh cấu hình đánh thức thiết bị.

Trong BMP280, nếu thực hiện một phép đo đơn lẻ, 16 bit quan trọng nhất trong giá trị sẽ được điền và bốn bit quan trọng nhất trong kết quả đọc giá trị đều là số không. Số lượng phép đo có thể được đặt thành 1, 2, 4, 8 hoặc 16 và khi số lượng phép đo được tăng lên, số lượng bit được điền dữ liệu sẽ tăng lên, do đó với 16 phép đo, tất cả 20 bit được điền vào dữ liệu đo lường. Bảng dữ liệu đề cập đến quá trình này là lấy mẫu quá mức.

Trong BME280, cách sắp xếp tương tự cũng được áp dụng miễn là kết quả không được lọc. Nếu sử dụng bộ lọc, các giá trị luôn là 20 bit, bất kể có bao nhiêu phép đo được thực hiện trong mỗi chu kỳ đo.

Mỗi phép đo riêng lẻ mất khoảng 2 mili giây (giá trị điển hình; giá trị lớn nhất là 2,3 ms). Thêm vào đó, chi phí cố định khoảng 2 ms (thường ít hơn một chút) có nghĩa là một chuỗi đo, có thể bao gồm từ 1 đến 32 phép đo riêng lẻ, có thể mất từ 4 ms đến 66 ms.

Bảng dữ liệu cung cấp một tập hợp các tổ hợp nhiệt độ và áp suất được khuyến nghị cho các ứng dụng khác nhau.

Thanh ghi điều khiển cấu hình

Hai thanh ghi điều khiển cấu hình trong BMP280 ở địa chỉ thanh ghi 0xF4 và 0xF5, và được ánh xạ vào 6 giá trị điều khiển cấu hình riêng lẻ. 0xF4 bao gồm:

  • 3 bit osrs_t (đo nhiệt độ 0, 1, 2, 4, 8 hoặc 16 lần);
  • 3 bit osrs_p (đo áp suất 0, 1, 2, 4, 8 hoặc 16 lần); và
  • 2 bits Mode (Sleep, Forced (tức là Single Shot), Normal (tức là liên tục)).

0xF5 bao gồm:

  • 3 bit t_sb (thời gian chờ, 0,5ms đến 4000 ms);
  • Bộ lọc 3 bit (xem bên dưới); và
  • 1 bit spiw_en chọn SPI hoặc I2C.

Tham số bộ lọc kiểm soát một loại thuật toán phân rã theo hàm mũ, hoặc bộ lọc Phản ứng xung vô hạn (IIR), được áp dụng cho các giá trị đo áp suất và nhiệt độ thô (nhưng không áp dụng cho các giá trị độ ẩm). Phương trình được đưa ra trong bảng dữ liệu. Một bài thuyết trình khác là:

Giá trị (n) = Giá trị (n-1) * (K-1) / K + đo lường (n) / K

trong đó (n) cho biết giá trị đầu ra và phép đo gần đây nhất; và K là tham số bộ lọc. Tham số bộ lọc K và có thể được đặt thành 1, 2, 4, 8 hoặc 16. Nếu K được đặt thành 1 thì phương trình sẽ trở thành Giá trị (n) = độ đo (n). Mã hóa của tham số bộ lọc là:

  • bộ lọc = 000, K = 1
  • bộ lọc = 001, K = 2
  • bộ lọc = 010, K = 4
  • bộ lọc = 011, K = 8
  • bộ lọc = 1xx, K = 16

BME 280 bổ sung thêm một thanh ghi điều khiển cấu hình tại địa chỉ 0xF2, "ctrl_hum" với một tham số 3 bit osrs_h (đo độ ẩm 0, 1, 2, 4, 8 hoặc 16 lần).

Bước 4: Đo lường và thời gian đọc

Tôi dự định bổ sung điều này sau, hiển thị thời gian của các lệnh và phản hồi đo lường.

Iddt - dòng điện đo nhiệt độ. Giá trị điển hình 325 uA

Iddp - dòng điện khi đo áp suất. Giá trị điển hình 720 uA, tối đa 1120 uA

Iddsb - dòng điện ở chế độ chờ. Giá trị điển hình 0,2 uA, tối đa 0,5 uA

Iddsl - dòng điện ở chế độ ngủ. Giá trị điển hình 0,1 uA, tối đa 0,3 uA

Bước 5: Nguyên tắc phần mềm

Nguyên tắc phần mềm
Nguyên tắc phần mềm
Nguyên tắc phần mềm
Nguyên tắc phần mềm

Chế độ I2C Burst

Bảng dữ liệu BMP280 cung cấp hướng dẫn về việc đọc dữ liệu (phần 3.9). Nó nói rằng "nên sử dụng đọc liên tục và không giải quyết từng thanh ghi riêng lẻ. Điều này sẽ ngăn chặn sự kết hợp có thể xảy ra giữa các byte thuộc các phép đo khác nhau và giảm lưu lượng giao diện." Không có hướng dẫn nào liên quan đến việc đọc các thông số bù / hiệu chuẩn. Có lẽ đây không phải là vấn đề vì chúng ở trạng thái tĩnh và không thay đổi.

Thư viện này đọc tất cả các giá trị liền kề trong một thao tác đọc - 24 byte trong trường hợp các thông số bù nhiệt độ và áp suất, 6 byte cho nhiệt độ và áp suất kết hợp và 8 byte cho độ ẩm, nhiệt độ và áp suất kết hợp. Khi chỉ kiểm tra nhiệt độ, chỉ có 3 byte được đọc.

Sử dụng macro (#define, v.v.)

Không có macro nào trong thư viện này ngoài macro "bao gồm bảo vệ" của thư viện thông thường để ngăn trùng lặp.

Tất cả các hằng được định nghĩa bằng cách sử dụng từ khóa const và việc in gỡ lỗi được điều khiển bằng các hàm C tiêu chuẩn.

Đó là nguồn gốc của một số sự không chắc chắn đối với tôi, nhưng lời khuyên tôi nhận được khi đọc nhiều bài đăng về chủ đề này là việc sử dụng #define để khai báo hằng số (ít nhất) và (có thể) điều khiển in gỡ lỗi là không cần thiết và không được mong muốn.

Trường hợp sử dụng const thay vì #define là khá rõ ràng - const sử dụng cùng tài nguyên với #define (tức là nil) và các giá trị kết quả tuân theo các quy tắc xác định phạm vi, do đó giảm khả năng xảy ra lỗi.

Trường hợp kiểm soát in gỡ lỗi hơi ít rõ ràng hơn, bởi vì cách tôi đã thực hiện có nghĩa là mã cuối cùng chứa logic cho các câu lệnh in gỡ lỗi, mặc dù chúng chưa bao giờ được thực hiện. Nếu thư viện được sử dụng trong một dự án lớn trên bộ vi điều khiển có bộ nhớ rất hạn chế, điều này có thể trở thành một vấn đề. Vì sự phát triển của tôi là trên ESP8266 với bộ nhớ flash lớn, điều này dường như không phải là vấn đề đối với tôi.

Bước 6: Hiệu suất nhiệt độ

Tôi dự định thêm điều này sau.

Bước 7: Hiệu suất áp suất

Tôi dự định thêm điều này sau.

Đề xuất: