|
There are no translations available.
BME280 - цифровий сенсор барометричного тиску є злегка модернізованою версією BMP180. Він розміщується на невеликому модулі, який забезпечує доступ до датчика через інтерфейс I2C.
Модуль легко підключити до Raspberry Pi та прочитати виміряні дані для температури, тиску і вологості за допомогою Python.
BME280 виготовляється фірмою Bosch і офіційний технічний опис BME280 включає в себе всі технічні деталі. Пристрій може пропонувати як з SPI, так і з I2C інтерфейсом, тому ви повинні переконатися, що ваш модуль забезпечує інтерфейс, якому віддаєте перевагу.
Модуль, який розглянемо, є невеликою друкованою платою 14x10 мм з роз’ємом I2C на 4 виводи. Порядок виводів може змінюватися в залежності від інших модулів, тому будьте уважні, щоб правильно підключити иводи до RPi.
Налаштування інтерфейсу I2C
Для того, щоб використати цей модуль, ви повинні включити інтерфейс I2C на RPi, оскільки він не включений за замовчуванням. Це досить простий процес і описаний в одній з попередніх статей, в якій розглядались налаштування оновленої ОС для RPi.
Підключення апаратних засобів
У наведеній нижче таблиці показано, як модуль підключений до роз’єма GPIO RPi (P1). Будь ласка, зверніться до діаграми роз’ємаGPIO.
Нижче наведена схема макета. Якщо підключаєте чотири контакти модуля безпосередньо до RPi, то вам треба лише чотири провідники з гніздами на кінцях.
Доступні й інші модулі, які мають відмінні механізми контактів, тому переконайтеся, що підключаєтеся до правильних виводів RPi, якщо ваша плата відрізняється від зображеної тут.
З підключеним пристроєм і поданим живленням на RPi команда i2cdetect повинна показати пристрій з адресою 0x76 або 0x77.
Завантаження сценарію для BME280
Щоб завантажити сценарій Python для BME280 зі сховища Bitbucket автора можете використати:
wget -O bme280.py http://bit.ly/bme280py
або
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/bme280.py
або клацніть правою кнопкою миші на цьому посиланні в адресному рядку браузера і збережіть файл локально.
Текст сценарію bme280.py
#!/usr/bin/python
#
# bme280.py
# Читання даних з цифрового сенсора тиску.
#
# Офіційний datasheet доступний на:
# https://www.bosch-sensortec.com/bst/products/all_products/bme280
#
# Автор : Matt Hawkins
# Дата : 25/07/2016
#
# http://www.raspberrypi-spy.co.uk/
#
#--------------------------------------
import smbus
import time
from ctypes import c_short
from ctypes import c_byte
from ctypes import c_ubyte
DEVICE = 0x76 # Адреса пристрою I2C за замовчуванням
bus = smbus.SMBus(1) # Rev 2 Pi, Pi 2 & Pi 3 використовують шину 1
# Rev 1 Pi використовує шину 0
def getShort(data, index):
# Повертається два байти даних як 16-ти бітове число зі знаком
return c_short((data[index+1] << 8) + data[index]).value
def getUShort(data, index):
# Повертається два байти даних як 16-ти бітове число без знака
return (data[index+1] << 8) + data[index]
def getChar(data,index):
# Повертається один байт даних як символ зі знаком
result = data[index]
if result > 127:
result -= 256
return result
def getUChar(data,index):
# Повертається один байт даних як символ без знаку
result = data[index] & 0xFF
return result
def readBME280ID(addr=DEVICE):
# Адреса регістру ID мікросхеми
REG_ID = 0xD0
(chip_id, chip_version) = bus.read_i2c_block_data(addr, REG_ID, 2)
return (chip_id, chip_version)
def readBME280All(addr=DEVICE):
# Адреси регістрів
REG_DATA = 0xF7
REG_CONTROL = 0xF4
REG_CONFIG = 0xF5
REG_HUM_MSB = 0xFD
REG_HUM_LSB = 0xFE
# Налаштування передискретизації даних - сторінка 27 datasheet
OVERSAMPLE_TEMP = 2
OVERSAMPLE_PRES = 2
MODE = 1
control = OVERSAMPLE_TEMP<<5 | OVERSAMPLE_PRES<<2 | MODE
bus.write_byte_data(addr, REG_CONTROL, control)
# Читання блоків даних калібрування з EEPROM
# Див. сторінку 22 datasheet
cal1 = bus.read_i2c_block_data(addr, 0x88, 24)
cal2 = bus.read_i2c_block_data(addr, 0xA1, 1)
cal3 = bus.read_i2c_block_data(addr, 0xE1, 7)
# Перетворення байта даних в слово значення
dig_T1 = getUShort(cal1, 0)
dig_T2 = getShort(cal1, 2)
dig_T3 = getShort(cal1, 4)
dig_P1 = getUShort(cal1, 6)
dig_P2 = getShort(cal1, 8)
dig_P3 = getShort(cal1, 10)
dig_P4 = getShort(cal1, 12)
dig_P5 = getShort(cal1, 14)
dig_P6 = getShort(cal1, 16)
dig_P7 = getShort(cal1, 18)
dig_P8 = getShort(cal1, 20)
dig_P9 = getShort(cal1, 22)
dig_H1 = getUChar(cal2, 0)
dig_H2 = getShort(cal3, 0)
dig_H3 = getUChar(cal3, 2)
dig_H4 = getChar(cal3, 3)
dig_H4 = (dig_H4 << 24) >> 20
dig_H4 = dig_H4 | (getChar(cal3, 4) & 0x0F)
dig_H5 = getChar(cal3, 5)
dig_H5 = (dig_H5 << 24) >> 20
dig_H5 = dig_H5 | (getUChar(cal3, 4) >> 4 & 0x0F)
dig_H6 = getChar(cal3, 6)
# Читання температури/тиску/вологості
data = bus.read_i2c_block_data(addr, REG_DATA, 8)
pres_raw = (data[0] << 12) | (data[1] << 4) | (data[2] >> 4)
temp_raw = (data[3] << 12) | (data[4] << 4) | (data[5] >> 4)
hum_raw = (data[6] << 8) | data[7]
#Визначення температури
var1 = ((((temp_raw>>3)-(dig_T1<<1)))*(dig_T2)) >> 11
var2 = (((((temp_raw>>4) - (dig_T1)) * ((temp_raw>>4) - (dig_T1))) >> 12) * (dig_T3)) >> 14
t_fine = var1+var2
temperature = float(((t_fine * 5) + 128) >> 8);
# Визначення тиску і узгодження з температурою
var1 = t_fine / 2.0 - 64000.0
var2 = var1 * var1 * dig_P6 / 32768.0
var2 = var2 + var1 * dig_P5 * 2.0
var2 = var2 / 4.0 + dig_P4 * 65536.0
var1 = (dig_P3 * var1 * var1 / 524288.0 + dig_P2 * var1) / 524288.0
var1 = (1.0 + var1 / 32768.0) * dig_P1
if var1 == 0:
pressure=0
else:
pressure = 1048576.0 - pres_raw
pressure = ((pressure - var2 / 4096.0) * 6250.0) / var1
var1 = dig_P9 * pressure * pressure / 2147483648.0
var2 = pressure * dig_P8 / 32768.0
pressure = pressure + (var1 + var2 + dig_P7) / 16.0
# Визначення вологості
humidity = t_fine - 76800.0
humidity = (hum_raw - (dig_H4 * 64.0 + dig_H5 / 16384.8 * humidity)) * (dig_H2 / 65536.0 * (1.0 + dig_H6 / 67108864.0 * humidity * (1.0 + dig_H3 / 67108864.0 * humidity)))
humidity = humidity * (1.0 - dig_H1 * humidity / 524288.0)
if humidity > 100:
humidity = 100
elif humidity < 0:
humidity = 0
return temperature/100.0,pressure/100.0,humidity
def main():
(chip_id, chip_version) = readBME280ID()
print "Chip ID :", chip_id
print "Version :", chip_version
temperature,pressure,humidity = readBME280All()
print "Temperature : ", temperature, "C"
print "Pressure : ", pressure, "hPa"
print "Humidity : ", humidity, "%"
if __name__=="__main__":
main()
Запуск сценарію
Перед запуском сценарію ви повинні перевірити, чи підключений пристрій. Якщо ви встановили пакет i2c-tools, як частину установки i2c, то повинні скористатися командою i2cdetect, щоб перевірити, чи повертається адреса пристрою. Сценарій передбачає, що адреса 0x76. Ви можете змінити це значення шляхом редагування змінної DEVICE в bme280.py за допомогою свого улюбленого текстового редактора.
Запустіть сценарій за допомогою:
python bme280.py
На своєму RPi побачите щось подібне:
Структура сценарію
Сценарій, наведений вище, є досить прямолінійним, але має в собі деяку математику, яка страшно виглядає. Все це визначено в datasheet і вам не треба занадто багато турбуватися, як воно працює! Автор наводиться нижче грубу анотацію сценарію, якщо хочете трохи більш докладно відстежити його до кінця:
• імпорт деяких бібліотек
• визначення деяких функцій
• функція main використовує функцію readBME280ID, щоб отримати ідентифікатор пристрою
• функція main потім викликає readBME280All, з якою ...
o встановлює передискретизацію і режим
o зчитує калібрувальні дані з пристрою, який був попередньо налаштований на заводі
o зчитує вихідні дані температури, тиску і вологості
o переробляє дані, використовуючи математику з таблиці
o повертає значення до main()
Увімкніть власний сценарій
Ви можете просто змінити функцію main в наведеному сценарії, але ви можете захотіти включити свою власну функціональність. Для цього можете імпортувати розглянутий сценарій, а потім посилатися на функції readBME280ID і readBME280All, як в прикладі нижче:
import bme280
(chip_id, chip_version) = bme280.readBME280ID()
print "Chip ID :", chip_id
print "Version :", chip_version
temperature,pressure,humidity = bme280.readBME280All()
print "Temperature : ", temperature, "C"
print "Pressure : ", pressure, "hPa"
print "Humidity : ", humidity, "%"
Решта вниз за вашою уявою.
Вирішення проблем
• Якщо результати команди i2cdetect видають помилку, то або не встановлено i2c-tools, або вам потрібно використовувати 0, а не 1
• Якщо пристрій не виявлений і ви не бачите адресу, то або ви неправильно підключили пристрій, або неправильно включений інтерфейс i2c
• Двічі перевірте з’єднання і перезавантажте RPi
У більшості випадків експеримент з i2c не працювало тому, що:
• i2c не включений
• Пристрій не підключено належним чином
• i2c-tools не був встановлений, тому недоступна команда i2cdetect
У рідкісних випадках пристрій може бути несправний, але набагато більш ймовірно, що буде одна з перерахованих вище причин.
|