Raspberry Pi: Датчик температуры, влажности и давления BME280 (Python)

Узнайте, как подключить датчик BME280 к Raspberry Pi для получения показаний температуры, влажности и давления. Вы узнаете, как подключить датчик к плате Raspberry Pi и написать Python-скрипт, который считывает данные с датчика и отображает их в терминале.

Raspberry Pi - начало работы с датчиком давления, температуры и влажности BME280 на Python

В этом руководстве мы рассмотрим следующие темы:

Предварительные требования

Перед тем как продолжить работу с этим руководством, проверьте следующие предварительные требования.

  1. Ознакомьтесь с платой Raspberry Pi — если вы не знакомы с Raspberry Pi, вы можете прочитать наше :doc:`руководство по началу работы с Raspberry Pi </raspberry/rnt/getting-started-with-raspberry-pi/index>`_.

  2. Вы должны знать, как запускать и создавать Python-файлы на вашем Raspberry Pi. Мы предпочитаем программировать Raspberry Pi удалённо через SSH, используя расширение в VS Code. У нас есть подробное руководство по этой теме: :doc:`Программирование Raspberry Pi удалённо с помощью VS Code (Remote-SSH) </raspberry/rnt/raspberry-pi-remote-ssh-vs-code/index>`_.

  3. Знайте, как использовать GPIO Raspberry Pi, чтобы правильно собрать схему. Прочитайте следующее руководство: :doc:`Распиновка Raspberry Pi: Как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

Знакомство с модулем датчика BME280

Модуль датчика BME280 считывает барометрическое давление, температуру и влажность. Поскольку давление изменяется с высотой, вы также можете оценить высоту над уровнем моря. Существует несколько версий этого модуля датчика. Мы используем модуль, показанный на рисунке ниже.

Модуль датчика BME280 I2C - считывает давление, температуру и влажность

Этот датчик обменивается данными по протоколу I2C, поэтому подключение очень простое. Вы можете использовать стандартные выводы I2C на Raspberry Pi, как показано в следующей таблице:

BME280

Raspberry Pi

Vin

3.3V

GND

GND

SCL

GPIO 3

SDA

GPIO 2

Узнайте больше о GPIO Raspberry Pi: :doc:`Распиновка Raspberry Pi: Как использовать GPIO Raspberry Pi? </raspberry/rnt/raspberry-pi-pinout-gpios/index>`_

Необходимые компоненты

Raspberry Pi с датчиком BME280

Вот список компонентов, необходимых для сборки схемы:

Вы можете использовать приведённые выше ссылки или перейти непосредственно на MakerAdvisor.com/tools, чтобы найти все компоненты для ваших проектов по лучшей цене!

Включение I2C на Raspberry Pi

По умолчанию связь по I2C не включена. Вам нужно включить её вручную. Откройте окно терминала на вашем Raspberry Pi и введите следующую команду:

sudo raspi-config

Откроется следующее меню. Выберите Interface Options.

Raspberry Pi - включение связи I2C

Затем выберите пункт I2C.

Raspberry Pi - включение связи I2C

Наконец, включите I2C, выбрав Yes.

Raspberry Pi - включение связи I2C

I2C должен быть успешно включён.

Raspberry Pi - связь I2C включена

После включения I2C перезагрузите Raspberry Pi, выполнив следующую команду:

sudo reboot

Подключение BME280 к Raspberry Pi

Подключите BME280 к стандартным выводам I2C на Raspberry Pi.

Raspberry Pi - схема подключения BME280

BME280

Raspberry Pi

Vin

3.3V

GND

GND

SCL

GPIO 3

SDA

GPIO 2

Получение I2C-адреса датчика

После подключения датчика к Raspberry Pi давайте проверим, правильно ли подключён датчик, найдя его I2C-адрес.

Откройте окно терминала на вашем Raspberry Pi и выполните следующую команду:

sudo i2cdetect -y 1

Она должна показать I2C-адрес вашего датчика:

BME280 - получение I2C-адреса BME280

Установка библиотеки BME280

Существует несколько библиотек, совместимых с Raspberry Pi, для чтения данных с датчика BME280. Мы будем использовать библиотеку RPi.BME280. Эта библиотека доступна для установки через PIP (менеджер пакетов для пакетов Python).

Сначала установите или обновите pip, выполнив следующую команду:

sudo pip install --upgrade pip

Затем выполните следующую команду для установки библиотеки с помощью pip:

sudo pip install RPI.BME280

Python-код для Raspberry Pi с BME280 (температура, влажность и давление)

Следующий скрипт считывает температуру, влажность и давление с датчика BME280 и выводит показания в оболочку Python. Создайте новый Python-файл с любым именем, например, bme280_basic.py, и скопируйте следующий код.

import time
import smbus2
import bme280

# BME280 sensor address (default address)
address = 0x76

# Initialize I2C bus
bus = smbus2.SMBus(1)

# Load calibration parameters
calibration_params = bme280.load_calibration_params(bus, address)

def celsius_to_fahrenheit(celsius):
    return (celsius * 9/5) + 32

while True:
    try:
        # Read sensor data
        data = bme280.sample(bus, address, calibration_params)

        # Extract temperature, pressure, and humidity
        temperature_celsius = data.temperature
        pressure = data.pressure
        humidity = data.humidity

        # Convert temperature to Fahrenheit
        temperature_fahrenheit = celsius_to_fahrenheit(temperature_celsius)

        # Print the readings
        print("Temperature: {:.2f} °C, {:.2f} °F".format(temperature_celsius, temperature_fahrenheit))
        print("Pressure: {:.2f} hPa".format(pressure))
        print("Humidity: {:.2f} %".format(humidity))

        # Wait for a few seconds before the next reading
        time.sleep(2)

    except KeyboardInterrupt:
        print('Program stopped')
        break
    except Exception as e:
        print('An unexpected error occurred:', str(e))
        break

Просмотреть исходный код

Как работает код

Продолжайте чтение, чтобы узнать, как работает код, или перейдите к разделу Демонстрация.

Импорт необходимых библиотек

Сначала мы импортируем необходимые библиотеки: time, smbus2 и bme280. Модуль time позволяет добавлять задержки в наш код, smbus2 помогает нам взаимодействовать с устройствами I2C, такими как датчик BME280, а bme280 предоставляет функции для удобного взаимодействия с датчиком.

import time
import smbus2
import bme280

Инициализация датчика BME280

Мы устанавливаем адрес датчика BME280 по умолчанию равным 0x 76. Это адрес, по которому датчик обменивается данными через шину I2C (проверьте предыдущий раздел).

# BME280 sensor address (default address)
address = 0x76

Затем мы инициализируем шину I2C с помощью команды smbus2.SMBus(1).

# Initialize I2C bus
bus = smbus2.SMBus(1)

Далее мы инициализируем датчик, указав шину I2C и его I2C-адрес.

# Load calibration parameters
calibration_params = bme280.load_calibration_params(bus, address)

Преобразование Цельсия в Фаренгейт

Мы определяем функцию celsius_to_fahrenheit(celsius), которая преобразует температуру из градусов Цельсия в градусы Фаренгейта. Затем мы можем вызвать эту функцию позже в нашем коде для преобразования температуры.

def celsius_to_fahrenheit(celsius):
    return (celsius * 9/5) + 32

Получение показаний датчика

Мы входим в бесконечный цикл с помощью while True для многократного считывания и отображения данных с датчика.

while True:

Мы используем функцию bme280.sample(bus, address, calibration_params) для считывания данных с датчика.

data = bme280.sample(bus, address, calibration_params)

Мы извлекаем температуру, давление и влажность из данных, возвращённых датчиком, и сохраняем каждое показание в переменной: temperature_celsius, pressure и humidity.

# Extract temperature, pressure, and humidity
temperature_celsius = data.temperature
pressure = data.pressure
humidity = data.humidity

Мы преобразуем температуру из Цельсия в Фаренгейт с помощью функции, которую мы создали ранее, и сохраняем результат в переменной temperature_fahrenheit.

# Convert temperature to Fahrenheit
temperature_fahrenheit = celsius_to_fahrenheit(temperature_celsius)

Наконец, мы выводим показания, отформатированные до двух десятичных знаков:

# Print the readings
print("Temperature: {:.2f} °C, {:.2f} °F".format(temperature_celsius, temperature_fahrenheit))
print("Pressure: {:.2f} hPa".format(pressure))
print("Humidity: {:.2f} %".format(humidity))

Новые показания выводятся каждые две секунды. Вы можете изменить время между каждым считыванием, указав другое число в методе sleep().

time.sleep(2)

Обработка прерываний и исключений

Мы используем обработку исключений для перехвата прерываний с клавиатуры (когда пользователь нажимает Ctrl + C) и других исключений. Если это происходит, мы выводим сообщение об ошибке и используем команду break для выхода из цикла.

except KeyboardInterrupt:
    print('Program stopped')
    break
except Exception as e:
    print('An unexpected error occurred:', str(e))
    break

Демонстрация

Сохраните ваш Python-файл. Затем запустите его на вашем Raspberry Pi. Выполните следующую команду в каталоге, где находится ваш Python-файл:

python bme280_basic.py

Вы должны получать новые показания температуры, влажности и давления в оболочке Python или в терминале Raspberry Pi каждые три секунды.

Raspberry Pi BME280 - показания в терминале Python

Вы можете остановить выполнение программы, нажав CTRL + C.

Заключение

В этом руководстве вы узнали, как подключить датчик температуры, влажности и давления BME280 к Raspberry Pi и как написать Python-программу для получения и отображения показаний. Это один из самых простых примеров для начала работы с датчиком BME280.

Мы надеемся, что это руководство было полезным. Если вы новичок в работе с Raspberry Pi, вы можете начать со следующих руководств:

Вы можете посмотреть все наши проекты для Raspberry Pi по следующей ссылке:

Наконец, если вы хотите подключить BME280 к другим микроконтроллерам, у нас есть руководства для ESP32, ESP8266 и Arduino:

Спасибо за чтение.