ПРОЕКТИ:

Безкоштовні точки доступу Wi-Fi в Україні

- Пошук людей через Інтернет

Тестуємо Wi-Fi доступ до Інтернету: моніторинг, безпека…__SEO - пошукова оптимізація – ключ до успіху

Безкоштовні телефонні дзвінки через Інтернет__Соціальні мережі, як спосіб знайти однодумців

Безпека при роботі в Інтернеті__Про Київ в Інтернеті

Arduino _

Raspberry Pi  Unix, Linux. Ubuntu, Fedora...- це не так вже й страшно

Знайти драйвер в Інтернеті  Пошук технічної документації

Сценарії для Інтернету   Пошук патентів в Інтернеті

Невидимий Інтернет    Пірингові мережі: видимі і невидимі

Посилання:

Сайт про все: isearch.in.ua

Персональний сайт Пальшина Єгора

Сайт мого учня

Ділова розвідка в Інтернеті

Використання сенсора температури і тиску BME280 з інтерфейсом I2C в Python
Рейтинг статті: / 3
НайгіршеНайкраще 
BME280BME280 - цифровий сенсор барометричного тиску є злегка модернізованою версією BMP180. Він розміщується на невеликому модулі, який забезпечує доступ до датчика через інтерфейс I2C.
Модуль легко підключити до Raspberry Pi та прочитати виміряні дані для температури, тиску і вологості за допомогою Python.
BME280_Board
BME280 виготовляється фірмою Bosch і офіційний технічний опис BME280 включає в себе всі технічні деталі. Пристрій може пропонувати як з SPI, так і з I2C інтерфейсом, тому ви повинні переконатися, що ваш модуль забезпечує інтерфейс, якому віддаєте перевагу.
Модуль, який розглянемо, є невеликою друкованою платою 14x10 мм з роз’ємом I2C на 4 виводи. Порядок виводів може змінюватися в залежності від інших модулів, тому будьте уважні, щоб правильно підключити иводи до RPi.
Налаштування інтерфейсу I2C
Для того, щоб використати цей модуль, ви повинні включити інтерфейс I2C на RPi, оскільки він не включений за замовчуванням. Це досить простий процес і описаний в одній з попередніх статей, в якій розглядались налаштування оновленої ОС для RPi.
Підключення апаратних засобів
У наведеній нижче таблиці показано, як модуль підключений до роз’єма GPIO RPi (P1). Будь ласка, зверніться до діаграми роз’ємаGPIO.
BME280_Pins
Нижче наведена схема макета. Якщо підключаєте чотири контакти модуля безпосередньо до RPi, то вам треба лише чотири провідники з гніздами на кінцях.
BME280_Diagramm
Доступні й інші модулі, які мають відмінні механізми контактів, тому переконайтеся, що підключаєтеся до правильних виводів 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 побачите щось подібне:
BME280_Results
Структура сценарію
Сценарій, наведений вище, є досить прямолінійним, але має в собі деяку математику, яка страшно виглядає. Все це визначено в 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
У рідкісних випадках пристрій може бути несправний, але набагато більш ймовірно, що буде одна з перерахованих вище причин.
(За матеріалами EN: raspberrypi-spy.co.uk)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting
Google Analytics Alternative