概述
Bosch推出了新型BME280傳感器,這是一款具有溫度,大氣壓力和濕度的環(huán)境傳感器,可助您一臂之力!該傳感器非常適合各種天氣/環(huán)境傳感,甚至可以在I2C和SPI中使用!
博世的這種精密傳感器是用于濕度測量的最佳低成本傳感解決方案,精度為±3%精度,絕對精度為±1 hPa的大氣壓力和精度為±1.0°C的溫度。由于壓力會隨高度變化,因此壓力測量值非常好,因此您也可以將其用作高度計,精度為±1米!
BME280是博世的下一代傳感器,是BMP085/BMP180的升級版/BMP183-具有0.25m的低海拔噪聲和相同的快速轉(zhuǎn)換時間。它具有相同的規(guī)格,但可以使用I2C 或 SPI。為了實現(xiàn)簡單易接線,請使用I2C。如果要連接一堆傳感器而不必?fù)?dān)心I2C地址沖突,請使用SPI。
好的傳感器對嗎?因此,我們使您輕松進(jìn)入下一個項目。表面貼裝傳感器焊接到PCB上,并帶有3.3V穩(wěn)壓器和電平轉(zhuǎn)換功能,因此您可以將其與3V或5V邏輯微控制器一起使用而無需擔(dān)心。我們甚至編寫了一個不錯的教程,其中包含接線圖,原理圖,庫和示例,讓您在10分鐘內(nèi)就可以運行!
插腳
電源引腳:
Vin -這是電源引腳。由于傳感器芯片使用3 VDC,因此我們在板載了一個穩(wěn)壓器,該穩(wěn)壓器將采用3-5 VDC,并將其安全地轉(zhuǎn)換下來。要為電路板供電,請為其提供與微控制器邏輯電平相同的功率-例如,對于像Arduino這樣的5V微型電池,請使用5V
3Vo -這是穩(wěn)壓器的3.3V輸出,如果您愿意,您可以從中獲取100mA電流
GND -電源和邏輯的公共接地
SPI邏輯引腳:
所有進(jìn)入分線的引腳均具有電平轉(zhuǎn)換電路,以使其具有3-5V邏輯電平安全性。使用 Vin!
SCK 上的任何邏輯電平-這是 S PI C loc k 引腳,它是芯片的輸入
SDO -這是 S 串行 D ata O ut/ M aster I n S lave O ut針,用于從BMP183發(fā)送到處理器的數(shù)據(jù)
SDI -這是 S 串行 D ata I n/ M aster O ut S lave I n pin,用于從處理器發(fā)送到BME280的數(shù)據(jù)
CS -這是 C hip S 選擇引腳,將其放下低電平以啟動SPI事務(wù)。它是芯片的輸入
如果要將多個BME280連接到一個微控制器,請讓它們共享SDI,SDO和SCK引腳。然后為每個分配一個唯一的CS引腳。
I2C邏輯引腳:
SCK -這也是也是 I2C時鐘引腳,連接到微控制器的I2C時鐘線。
SDI -這也是也是 I2C數(shù)據(jù)引腳,連接到您的微控制器I2C數(shù)據(jù)線。
其余引腳斷開連接
程序集
《表class =“ build-table”》
準(zhǔn)備標(biāo)題欄:
如有必要,將條切成一定長度。如果將其插入面包板,則焊接會更容易-長按針腳
添加分線板:
將分線板放在插針上,以便短插針穿過分線墊
然后焊接!
請務(wù)必焊接所有引腳以實現(xiàn)可靠的電接觸。
(有關(guān)焊接的技巧,請務(wù)必查看我們的 優(yōu)秀焊接指南 )。
tr》
您完成了!目視檢查焊點,然后繼續(xù)進(jìn)行下一步
Arduino測試
您可以輕松地將此分線連接到任何微控制器,我們將使用Arduino。對于另一種微控制器,只要您有4個可用的引腳,就可以“逐位SPI”,也可以使用兩個I2C引腳,但是通常這些引腳固定在硬件中。只需簽出庫,然后移植代碼。
I2C接線
如果要通過I2C接口連接,請使用此接線
將 Vin 連接到3-5V電源很好使用微控制器邏輯所基于的相同電壓。對于大多數(shù)Arduino,這是5V
將 GND 連接到公共電源/數(shù)據(jù)地
將 SCK 引腳連接到I2C在Arduino上的時鐘 SCL 引腳上。在基于UNO和‘328的Arduino上,這也稱為 A5 ,在Mega上也稱為 digital 21 ,在Leonardo/Micro上,也稱為數(shù)字3
將 SDI 引腳連接到Arduino上的I2C數(shù)據(jù) SDA 引腳。在基于UNO&’328的Arduino上,這也稱為 A4 ,在Mega上也稱為 digital 20 ,在Leonardo/Micro上,也稱為數(shù)字2
默認(rèn)情況下,i2c地址為0x77。如果從SDO到GND添加跳線,則地址將更改為0x76。
如果您遇到I2C的間歇性問題,請嘗試跳線CS到Vin。
SPI接線
由于這是具有SPI功能的傳感器,因此我們可以使用硬件或“軟件” SPI。為了使所有Arduino上的接線相同,我們將從“軟件” SPI開始。應(yīng)該使用以下引腳:
將 Vin 連接到電源,可以使用3V或5V。使用微控制器邏輯所基于的相同電壓。對于大多數(shù)Arduino,這是5V
將 GND 連接到公共電源/數(shù)據(jù)地
將 SCK 引腳連接到數(shù)字#13 ,但是以后可以使用任何引腳
將 SDO 引腳連接到數(shù)字#12 ,但是可以使用任何引腳稍后
將 SDI 引腳連接到數(shù)字#11 ,但是以后可以使用任何引腳
連接 CS 銷釘數(shù)字#10 ,但是以后可以使用任何銷釘
稍后,一旦我們開始使用,我們就可以調(diào)整庫以使用硬件如果需要,可以使用SPI,或者將引腳更改為其他
安裝Adafruit_BME280庫
要開始讀取傳感器數(shù)據(jù),您將需要安裝Adafruit_BME280庫(在我們的github存儲庫中的代碼)。可以從Arduino庫管理器中獲得它,因此我們建議使用它。
從IDE中打開庫管理器。..
,然后輸入 adafruit bme280 來查找?guī)臁|c擊安裝
還添加 Adafruit Unified Sensor 庫
我們還提供了有關(guān)Arduino庫安裝的出色教程,網(wǎng)址為:
http://learn.adafruit.com/adafruit-all-about-arduino-libraries-install-use
加載演示
打開文件-》示例-》 Adafruit_BME280 -》 bmp280test 并上傳到連接至傳感器的Arduino
根據(jù)您使用的是I2C還是SPI,更改引腳名稱并注釋或取消注釋以下幾行。
下載:文件
復(fù)制代碼
#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); #define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10
Adafruit_BME280 bme; // I2C
//Adafruit_BME280 bme(BME_CS); // hardware SPI
//Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
上傳到Arduino之后,打開串行控制臺以9600波特率查看數(shù)據(jù)被打印出來
溫度以攝氏度為單位,您可以使用經(jīng)典的F = C * 9/5 + 32方程將其轉(zhuǎn)換為F。
壓力以帕斯卡的SI單位返回。 100帕斯卡= 1 hPa = 1毫巴。通常,大氣壓力以毫巴或英寸汞柱表示。供將來參考,1帕斯卡= 0.000295333727英寸汞柱,或1英寸汞柱= 3386.39帕斯卡。因此,如果將Pascal值(例如100734)除以3386.39,將得到29.72英寸汞柱。
您還可以計算海拔高度。 但是,只有知道您所在位置和一天在海平面上的hPa壓力,您才能真正做得非常準(zhǔn)確!傳感器非常精確,但是如果您沒有更新數(shù)據(jù)對于當(dāng)前一天,則可能很難獲得比10米更高的精度。
庫參考
您可以使用
通過使用任一軟件SPI(其中所有四個引腳可以是任何I/O)創(chuàng)建BME280對象開始。 div》
下載:文件
復(fù)制代碼
Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); Adafruit_BME280 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK);
或者您可以使用硬件SPI。使用硬件SPI,您必須使用Arduino的硬件SPI引腳-每個arduino類型都有不同的引腳!請檢查SPI參考以查看使用哪些引腳。在這種情況下,您可以使用任何CS引腳,但其他三個引腳是固定的
下載:文件
復(fù)制代碼
Adafruit_BME280 bme(BME_CS); // hardware SPI Adafruit_BME280 bme(BME_CS); // hardware SPI
或使用默認(rèn)I2C總線的I2C,未分配任何引腳
下載:文件
復(fù)制代碼
Adafruit_BME280 bme; // I2C Adafruit_BME280 bme; // I2C
啟動后,您可以使用
下載:文件
復(fù)制代碼
if (!bme.begin()) {
Serial.println(“Could not find a valid BME280 sensor, check wiring!”);
while (1);
} if (!bme.begin()) {
Serial.println(“Could not find a valid BME280 sensor, check wiring!”);
while (1);
}
begin()將在找到傳感器后返回True,否則返回False。如果返回假值,請檢查接線!
讀取濕度,溫度和壓力很容易,只需致電:
下載:文件
復(fù)制代碼
bme.readTemperature()
bme.readPressure()
bme.readHumidity() bme.readTemperature()
bme.readPressure()
bme.readHumidity()
溫度在攝氏度中始終是一個浮點。 Pressure是一個32位整數(shù),壓力單位為Pascals。您可能需要轉(zhuǎn)換為其他值,以使其與天氣報告相匹配。濕度以相對濕度%
將BME280轉(zhuǎn)換為高度計也是可能的。如果您知道海平面的壓力,則該庫可以將當(dāng)前的氣壓計入海拔高度
下載:文件
復(fù)制代碼
bmp.readAltitude(seaLevelPressure) bmp.readAltitude(seaLevelPressure)
但是,您實際上只能做得很好如果您知道您所在位置和一天在海平面上的hPa壓力,就可以計算高度!傳感器非常精確,但是如果您沒有當(dāng)天的最新數(shù)據(jù),則可能很難獲得比現(xiàn)在更高的精度10米。
傳入當(dāng)前海平面壓力( hPa )-因此該值大約為1000。您還可以使用通用1013.25值進(jìn)行測試。
Python和CircuitPython測試
很容易將BME280傳感器與Python或CircuitPython和Adafruit CircuitPython BME280模塊一起使用。此模塊可讓您輕松編寫Python代碼,以從傳感器讀取濕度,溫度,壓力等信息。
您可以將此傳感器與任何CircuitPython微控制器板或具有GPIO和Python的計算機(jī)一起使用感謝我們的CircuitPython-for-Python兼容性庫Adafruit_Blinka。
CircuitPython微控制器接線
首先,按照與Arduino前幾頁完全相同的方式將BME280接線到板上。您可以使用I2C或SPI布線,盡管為簡單起見建議使用I2C。以下是使用I2C將Feather M0連接到傳感器的示例:
板3V 到傳感器VIN
板3V 》到傳感器CS
板GND 到傳感器GND
板SCL 到傳感器SCK
板級SDA 到傳感器SDI
》
以及連接了硬件SPI的Feather M0的示例:
板3V 到傳感器VIN
板GND 到傳感器GND
板SC K 到傳感器SCK
BoardMOSI 到傳感器SDI
板MISO 到傳感器SDO
板D5 到傳感器CS (或使用任何其他免費的數(shù)字I/O針)
Python計算機(jī)接線
由于有數(shù)十種Linux計算機(jī)/主板可以使用,因此我們將顯示Raspberry Pi的接線。對于其他平臺,請訪問Linux上的CircuitPython指南,以了解您的平臺是否受支持。
以下是與I2C相連的Raspberry Pi:
Pi 3V3 至傳感器VIN
Pi 3V3 到傳感器CS
Pi GND 到傳感器GND
Pi SCL 到傳感器SCK
Pi SDA 傳感器SDI
以及Raspberry Pi 3 Model B上的示例
Pi 3V3 至傳感器VIN
Pi GND 到傳感器GND
Pi MOSI 到傳感器SDI
Pi MISO 到傳感器SDO
Pi SCLK 到傳感器SCK
Pi#5 到傳感器CS (或使用任何其他免費的GPIO引腳)
BME280的CircuitPython安裝庫
您需要在CircuitPython板上安裝Adafruit CircuitPython BME280庫。
首先請確保您正在為板運行最新版本的Adafruit CircuitPython。
接下來,您需要安裝必要的庫以使用硬件-仔細(xì)按照以下步驟從Adafruit的CircuitPython庫捆綁包中查找和安裝這些庫。我們的CircuitPython入門指南上有一個很棒的頁面,說明如何安裝庫捆綁包。
對于諸如Trinket M0或Gemma M0的非表達(dá)板,您需要從捆綁包中手動安裝必要的庫:
adafruit_bme280.mpy
adafruit_bus_device
在繼續(xù)之前,請確保板的lib文件夾或根文件系統(tǒng)具有 adafruit_bme280.mpy,和 adafruit_bus_device 文件和文件夾 已復(fù)制。
下一步連接到開發(fā)板的串行REPL,這樣您就可以在CircuitPython上出現(xiàn)》》》 提示。
BME280庫的Python安裝
您需要安裝Adafruit_Blinka庫,該庫在Python中提供CircuitPython支持。這可能還需要在您的平臺上啟用I2C并驗證您正在運行Python3。由于每個平臺都略有不同,并且Linux經(jīng)常更改,請訪問Linux上的CircuitPython指南以準(zhǔn)備好您的計算機(jī)!
完成后,從命令行運行以下命令:
sudo pip3 install adafruit-circuitpython-bme280
如果您的默認(rèn)Python是版本3,則可能需要改為運行“ pip”。只要確保您不嘗試在Python 2.x上使用CircuitPython,就不支持它!
CircuitPython和Python的用法
為演示傳感器的用法,我們將對其進(jìn)行初始化,并從電路板上讀取溫度,濕度等信息Python REPL。
如果您使用的是I2C連接,請運行以下代碼以導(dǎo)入必要的模塊并使用傳感器初始化I2C連接:
下載:文件
復(fù)制代碼
import board
import busio
import adafruit_bme280
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c) import board
import busio
import adafruit_bme280
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)
或者,如果您使用的是SPI連接,請運行以下代碼來設(shè)置SPI連接和傳感器:
下載:文件
復(fù)制代碼
import board
import busio
import digitalio
import adafruit_bme280
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
cs = digitalio.DigitalInOut(board.D5)
bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, cs) import board
import busio
import digitalio
import adafruit_bme280
spi = busio.SPI(board.SCK, MOSI=board.MOSI, MISO=board.MISO)
cs = digitalio.DigitalInOut(board.D5)
bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, cs)
現(xiàn)在您可以從中讀取值了使用以下任一屬性的傳感器:
溫度-傳感器的溫度,以攝氏度為單位。
濕度-相對濕度百分比,取值范圍為0到100%。
壓力-以hPa為單位的壓力。
altitude -以米為單位的海拔高度。
例如打印溫度,濕度和壓力:
下載:文件
復(fù)制代碼
print(“ Temperature: %0.1f C” % bme280.temperature)
print(“Humidity: %0.1f %%” % bme280.humidity)
print(“Pressure: %0.1f hPa” % bme280.pressure)
print(“ Temperature: %0.1f C” % bme280.temperature)
print(“Humidity: %0.1f %%” % bme280.humidity)
print(“Pressure: %0.1f hPa” % bme280.pressure)
對于海拔高度,想要在您所在位置設(shè)置海平面壓力以獲得最準(zhǔn)確的測量值(請記住,這些傳感器只能根據(jù)壓力推斷海拔高度,并且需要設(shè)置校準(zhǔn)點)。查看您當(dāng)?shù)氐奶鞖忸A(yù)報以獲取海平面讀數(shù)的壓力,然后設(shè)置 sea_level_pressure 屬性:
下載:文件
復(fù)制代碼
bme280.sea_level_pressure = 1013.4 bme280.sea_level_pressure = 1013.4
然后讀取海拔高度屬性更準(zhǔn)確的海拔高度讀數(shù)(但請記住,該海拔高度會隨氣壓變化而波動!):
下載:文件
復(fù)制代碼
print(“Altitude = %0.2f meters” % bme280.altitude) print(“Altitude = %0.2f meters” % bme280.altitude)
您可以使用BME280的溫度和濕度通過Magnus公式計算露點!對于此示例,您需要import一個附加庫:math。運行以下代碼:
下載:文件
復(fù)制代碼
import math
b = 17.62
c = 243.12
gamma = (b * bme280.temperature /(c + bme280.temperature)) + math.log(bme280.humidity / 100.0)
dewpoint = (c * gamma) / (b - gamma)
print(dewpoint) import math
b = 17.62
c = 243.12
gamma = (b * bme280.temperature /(c + bme280.temperature)) + math.log(bme280.humidity / 100.0)
dewpoint = (c * gamma) / (b - gamma)
print(dewpoint)
將BME280傳感器與CircuitPython一起使用就可以了!
完整示例代碼
下載:Project Zip 或 bme280_simpletest.py | 查看Github
復(fù)制代碼
import time
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location‘s pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
while True:
print(“ Temperature: %0.1f C” % bme280.temperature)
print(“Humidity: %0.1f %%” % bme280.humidity)
print(“Pressure: %0.1f hPa” % bme280.pressure)
print(“Altitude = %0.2f meters” % bme280.altitude)
time.sleep(2)
import time
import board
import busio
import adafruit_bme280
# Create library object using our Bus I2C port
i2c = busio.I2C(board.SCL, board.SDA)
bme280 = adafruit_bme280.Adafruit_BME280_I2C(i2c)
# OR create library object using our Bus SPI port
#spi = busio.SPI(board.SCK, board.MOSI, board.MISO)
#bme_cs = digitalio.DigitalInOut(board.D10)
#bme280 = adafruit_bme280.Adafruit_BME280_SPI(spi, bme_cs)
# change this to match the location’s pressure (hPa) at sea level
bme280.sea_level_pressure = 1013.25
while True:
print(“ Temperature: %0.1f C” % bme280.temperature)
print(“Humidity: %0.1f %%” % bme280.humidity)
print(“Pressure: %0.1f hPa” % bme280.pressure)
print(“Altitude = %0.2f meters” % bme280.altitude)
time.sleep(2)
常見問題解答
為什么海拔高度計算錯誤?我的傳感器壞了嗎?
不,您的傳感器可能還好。高度計算取決于了解海平面的氣壓
如果您在當(dāng)前日期未為您所在的位置設(shè)置正確的海平面壓力,它將無法準(zhǔn)確計算高度
海平面氣壓每天都會根據(jù)天氣而變化!
如果兩次讀取之間有較長的延遲,則第一個數(shù)據(jù)讀取似乎不正確?
BMx280“保存”內(nèi)存中的最后一次讀取供您查詢。只需連續(xù)閱讀兩次并扔掉第一讀!
下載
文檔
此分會中使用的BME280傳感器的數(shù)據(jù)表
Arduino BME280驅(qū)動程序
Adafruit Fritzing庫中的Fritzing對象
上的EagleCAD PCB文件GitHub
K&R Smith校準(zhǔn)說明
替代驅(qū)動程序(Python)
如果將此突破與Raspberry Pi或Pi2一起使用,則還可以查看Adafruit_Python_BME280驅(qū)動程序。
此替代方法驅(qū)動程序使用I2C與BME280進(jìn)行通信,因此將Pi上的SCL與BME上的SCK以及SDA與SDI以及電源(3.3V至VIN)和GND相連。
示意圖
點擊放大
尺寸
以英寸為單位
責(zé)任編輯:wv
-
傳感器
+關(guān)注
關(guān)注
2550文章
51046瀏覽量
753160
發(fā)布評論請先 登錄
相關(guān)推薦
評論