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