Содержание
</span></span>
Модуль BME280 предназначен для измерения атмосферного давления, температуры и влажности. Это очередной датчик давления фирмы Bosch Sensortec для измерения атмосферного давления и температуры. По сравнению с первыми датчиками серии (BMP085 и BMP180) он имеет лучшие характеристики и меньшие размеры. Отличие от датчика BMP280 – наличие гигрометра, что позволяет измерять относительную влажность воздуха и создать на его основе маленькую метеостанцию.
-
Интерфейс: SPI, I2C;
-
Напряжение питания: 3.3В;
-
Диапазон измерений давления: 300-1100hPa;
-
Диапазон измерений температуры: -40 — +85 °C;
-
Диапазон измерений влажности: 0 — 100 %;
- Энергопотребление:
режим измерений — 2.74 нА;
в спящий режим: — 0.1 нА
- Точность измерений:
Давление — 0.01 hPa ( < 10 cm)
Температура — 0.01° C
Влажность – 3%
Датчик поддерживает два интерфейса – I2C и SPI, поэтому подключать модуль можно двумя способами . Для подключения по интерфейсу I2C используем 2 вывода Arduino.
BME280 |
Arduino UNO |
Arduino Mega |
GND |
GND |
GND |
VCC |
+3.3 |
+3.3 |
SDA |
A4 |
20 |
SCL |
A5 |
21 |
Для подключения по протоколу SPI используем 4 вывода Arduino.
BME280 |
Arduino UNO |
Arduino Mega |
GND |
GND |
GND |
VCC |
+3.3 |
+3.3 |
SCK |
D13 |
D52 |
CSB |
D10 |
D49 |
SDI |
D11 |
D51 |
SDO |
D12 |
D50 |
Схемы подключения к плате Arduino по протоколам I2C и SPI показаны на рис. 2 и 3. Обратите внимание, что напряжение питания датчика 3.3 В!!!
Рисунок 2. Схема соединений для подключения датчика BME280 по протоколу I2C
Рисунок 3. Схема соединений для подключения датчика BME280 по протоколу SPI
Для работы с датчиком необходимо установить две библиотеки – Adafruit BME280 Library и Adafruit Sensor. Для работы по протоколу I2C необходимо определить I2C-адрес нашего датчика, т.к. он может иметь адрес 0x76 или 0x77. Определяем адрес с помощью скетча I2C-сканер (скачать test_i2c_uno.zip). Подключаем датчик к плате Arduino согласно схеме соединений на рисунке 2, загружаем скетч и запускаем монитор последовательного порта (см. рис. 4).
Рисунок 4. Сканер I2C устройств
Подключим датчик BME280 к плате Arduino (схема соединений на рис. 2) и загрузим на плату пример BME280test из библиотеки Adafruit BME280 Library. Если I2C-адрес равен 0x76, необходимо внести изменения в файле Adafruit BME280.h библиотеки Adafruit BME280 Library (рис. 6).
Рисунок 5. Загрузка примера BME280test из библиотеки Adafruit BME280 Library
Рисунок 6. Изменения в файле Adafruit BME280.h
После загрузки скетча, открываем монитор последовательного порта и наблюдаем вывод значений атмосферного давления, температуры и влажности (рис. 7).
Рисунок 7. Вывод данных с датчика BME280 в монитор последовательного порта
Создадим проект домашней метеостанции на датчике BME280 с выводом данных на OLED-дисплей 0.96″ 128×64.
Будем использовать следующие компоненты:
-
Плата Arduino – 1;
-
Плата прототипирования – 1;
-
Датчик BME280 – 1;
-
OLED-дисплей – 1;
-
Провода.
Соединим элементы по схеме на рис. 8.
Рисунок 8. Схема соединений для подключения BME280 и OLED-дисплея 0.96″
Каждые 5 секунд считываем данные с датчика BME280 и выводим на дисплей. Для работы с OLED-дисплеем используем библиотеку OLED_I2C.
Содержимое скетча показано в листинге 1.
Листинг 1
#include
#include <spi><> // подключение библиотек</spi>
#include <adafruit><nclude><nclude></nclude></adafruit>
#define SEALEVELRE_HPA (1013.25)
Adafruit_BME280 bme280; // BME280 на I2C
OLED oled(SDA, SCL, 8); //
extern uint8_t SmallFont[]; // шрифт
unsigned long millist;
String txt1=»»;
void setup() {
Serial.begin(9600);
bme280.begin();
oled.begin();
oled.setFont(SmallFont);
}
void loop() {
// прошло 5 секунд?
if(millis()-millist>=5000) {
oled.clrScr();
// температура
txt1=»Temp=»;
txt1= txt1+String(bme280.readTemperature());
txt1= txt1+» *C»;
oled.print(txt1, CENTER, 10);
// влажность
txt1=»Hum=»;
txt1= txt1+String(bme280.readHumidity());
txt1= txt1+» %»;
oled.print(txt1, CENTER, 25);
// давление
txt1=»P=»;
txt1= txt1+String(bme280.readPressure() / 100.0F);
txt1= txt1+» hPa»;
oled.print(txt1, CENTER, 40);
oled.update();
// новый отсчет 5 секунд
millist=millis();
}
}
</pre>
Загружаем скетч на плату Arduino и смотрим вывод данных на OLED-дисплей (рис. 9).
Рисунок 9. Вывод данных на дисплей.
1. Нет данных с датчика BME280
-
Проверьте правильность подключения датчика BME280 к плате Arduino.
-
Проверьте I2C-адрес датчика BME280, при необходимости внесите изменения в файл Adafruit BME280.h.
Введение Что можно вывести на двухстрочный экран, кроме «Hello world!»? Почему бы не отображать температуру влажность и давление? Датчики предлагаемые как учебное пособие к arduino (DHT11, DHT22) показывают температуру и влажность воздуха. В учебных целях (для университета) понадобилось наблюдать так же и за давлением. Естественно на кафедре есть барометр, но почему бы не собрать свой? К тому же можно в дальнейшем накапливать показания в автоматическом режиме, и это неплохой опыт в изучении arduino. Так или иначе из Китая были заказаны комплектующие и собрано данное устройство.Необходимые комплектующиеArduino Pro MiniI2C для LCD (можно было заказать сразу в сборе, но так вышло чуть чуть дешевле)LCD 1602BME280 Для отправки скетча в arduino был использован USB-UART. Так же можно было использовать Raspberry Pi или компьютер с COM портом.Схема подключения для прошивки и код программы Из Китая USB-UART пришёл с набором проводков: Их вполне хватило. Перемычку оставил на 3.3 вольта, несмотря на то что моя версия arduino питается от 5 вольт. UART — Arduino 5v — VCC TXD — RXD RXD — TXD GND — GND CTS — DTR (опционально, у меня не работал, возможно потому что напряжение сигналов осталось 3.3В) Если не подключать DTR, то после отправки прошивки arduino нужно перезагрузить встроенной кнопкой, начнётся активный обмен данными в обе стороны (о чём свидетельствуют светодиоды на USB-UART), после успешной загрузки прошивки, она сама перезагрузится. Необходимые сторонние библиотеки:SparkFunBME280LiquidCrystal I2C Непосредственно код, с комментариями из примеров (на случай, если кому то понадобится что то менять).Код
#include #include "SparkFunBME280.h" #include "Wire.h" #include "SPI.h" #include <liquidcal sensor="" object="" bme280="" mysensor="" liquidcrystal_i2c="" lcd="" void="" setup="" lcd.init="" lcd.backlight="" settings="" can="" be="" i2c_mode="" or="" spi_mode="" chipselectpin="" using="" arduino="" pin="" names="" i2c="" address.="" enable="" the="" following="" and="" disable="" spi="" section="" mysensor.settings.comminterface="I2C_MODE;" mysensor.settings.i2caddress="0x76;" dissable="" sleep="" mode="" forced="" normal="" mysensor.settings.runmode="3;" mysensor.settings.tstandby="5;" off="" number="" of="" fir="" coefficients="" to="" filter="" mysensor.settings.filter="0;" skipped="" through="" oversampling="" respectively="" mysensor.settings.tempoversample="1;" mysensor.settings.pressoversample="1;" mysensor.settings.humidoversample="1;" .begin="" causes="" loaded="" mysensor.begin="" loop="" lcd.setcursor="" lcd.print="" t="); lcd.print(mySensor.readTempC()); lcd.setCursor(13,0); lcd.print(" int="" mmh="mySensor.readFloatPressure()/133;" delay="">
Адрес датчика можно угадать, их всего два. Как узнать адрес своего дисплея, можно посмотреть тут. В зависимости от микросхемы, есть две таблички. В данном случае: И адрес будет 0x3F т.к. A0 — A2 разомкнуты: Светодиод который обведён в овал лучше можно выпаять.Схема подключения Резистор выбирался как половина от сопротивления датчика (между VVC и GND), чтобы падения напряжения на нём было 1.7 вольта. Так же схему можно запитать от входа RAW, другим напряжением (например от кроны). На фотографии видно, что для компактности можно взять питание на датчик и дисплей с другого пина. Так же там видно ответвление оранжево-жёлтой пары проводов, на них висит резистор на 100 Ом, для уменьшения яркости подсветки (можно оставить джампер, но будет резать глаза). В моём случае всё питается от старого компьютерного блока питания. Можно питать от USB. Все комплектующие были приклеены оказавшемся под рукой клеем «Момент».Итог На рабочем месте появился 1602 прикрученный к столу, который показывает давление, влажность, температуру. Arduino можно перепрошить не снимая (возможно станет бегущей строкой).Фото Рабочее место, общий вид. Вид спереди. Вид сзади.
Датчики атмосферного давления bmp180, bmp280, bme280 – частые гости в инженерных проектах. С их помощью можно предсказать погоду или измерить высоту над уровнем моря. Сегодня именно эту линейку можно назвать самыми популярными и недорогими сенсорами для ардуино. В этой статье мы расскажем принцип действия датчиков, схему подключения к различным платам Arduino и приведем примеры программирования скетчей.
Принцип действия барометра на BMP280, BMP180, BME280
Барометр – устройство, измеряющее атмосферное давление. Электронные барометры используются в робототехнике и различных электронных устройствах. Наиболее распространенными и доступными являются датчики давления от фирмы BOSH: это BMP085, BMP180, BMP280 и другие. Первые два очень похожи между собой, BMP280 – это более новый и усовершенствованный датчик.
Датчики давления работают на преобразовании давления в движение механической части. Состоит датчик давления из преобразователя с чувствительным элементом, корпуса, механических элементов (мембран, пружин) и электронной схемы.
Датчик BMP280 создан специально для приложений, где требуются малые размеры и пониженное потребление энергии. К таким приложениям относятся навигационные системы, прогноз погоды, индикация вертикальной скорости и другие. Датчик обладает высокой точностью, хорошей стабильностью и линейностью. Технические характеристики датчика BMP280:
- Габариты 2 х 2,5 х 0,95 мм.
- Давление 300-1100гПа;
- Температуры от 0С до 65 С;
- Поддержка интерфейсов I2C и SPI;
- Напряжение питания 1,7В – 3,6В;
- Средний ток 2,7мкА;
- 3 режима работы – режим сна, режим FORCED (проведение измерения, считывание значения, переход в спящий режим), режим NORMAL (перевод датчика в циклическую работу – то есть устройство самостоятельно через установленное время выходит из режима сна, проводит измерения, считывает показания, сохраняет измеренные значения и переходит снова в режим сна).
Датчик BMP180 – это дешевый и простой в применении сенсорный датчик, который измеряет атмосферное давление и температуру. Используется обычно для определения высоты и в метеостанциях. Состоит устройство из пьезо-резистивного датчика, термодатчика, АЦП, энергонезависимой памяти, ОЗУ и микроконтроллера.
Технические характеристики датчика BMP180:
- Пределы измеряемого давления 225-825 мм рт. ст.
- Напряжение питания 3,3 – 5В;
- Ток 0,5мА;
- Поддержка интерфейса I2C;
- Время срабатывания 4,5мс;
- Размеры 15 х 14 мм.
Датчик bme280 содержит в себе 3 устройства – для измерения давления, влажности и температуры. Разрабатывался для малого потребления тока, высокой надежности и долгосрочной стабильной работы.
Технические характеристики датчика bme280:
- Размеры 2,5 х 2,5 х 0,93 мм;
- Металлический LGA-корпус, оснащенный 8-ю выходами;
- Напряжение питания 1,7 – 3,6В;
- Наличие интерфейсов I2C и SPI;
- Потребляемый ток в режиме ожидания 0,1 мкА.
Если сравнивать все устройства между собой, то датчики очень похожи. По сравнению со своим предшественником, к которым относится BMP180, более новый датчик BMP280 заметно меньше по размерам. Его восьмиконтактный миниатюрный корпус требует аккуратности во время монтажа. Также устройство поддерживает интерфейсы I2C и SPI, в отличие от предшественников, которые поддерживали только I2C. По логике работы датчика изменений практически нет, была только усовершенствована температурная стабильность и увеличено разрешение АЦП. Датчик BME280, измеряющий температуру, влажность и давление, также похож на BMP280. Отличие между ними заключается в размерах корпуса, так как BME280 имеет датчик влажности, который немного увеличивает габариты. Количество контактов и их расположение на корпусе совпадают.
Варианты подключения к Arduino
Подключение датчика BMP180 к Ардуино. Для подключения понадобятся сам датчик BMP180, плата Ардуино UNO, соединительные провода. Схема подключения показана на рисунке ниже.
Землю с Ардуино нужно соединить с землей на датчике, напряжение – на 3,3 В, SDA – к пину А4, SCL – к А5. Контакты А4 и А5 выбираются с учетом их поддержки интерфейса I2C. Сам датчик работает от напряжения 3,3 В, а Ардуино – от 5 В, поэтому на модуле с датчиком установлен стабилизатор напряжения.
Подключение BMP 280 к Ардуино. Распиновка и вид сверху платы изображены на рисунке.
Сам модуль датчика давления выглядит следующим образом:
Для соединения с Ардуино нужно подключить выходы следующим образом: соединить землю с Ардуино и на датчике, VCC – на 3,3В, SCL / SCK – к аналоговому контакту А5, SDA / SDI – к А4.
Подключение датчика BME280. Расположение контактов и распиновка у датчика BME280 такая же, как у BMP280.
Так как датчик может работать по I2C и SPI, подключение можно реализовать двумя методами.
При подключении по I2C нужно соединить контакты SDA и SCL.
При подключении по SPI нужно соединить SCL с модуля и SCK (13й контакт на Ардуино), SDO с модуля к 12 выводу Ардуино, SDA – к 11 контакту, CSB (CS) – к любому цифровому пину, в данном случае к 10 контакту на Ардуино. В обоих случаях напряжение подключается к 3,3В на Ардуино.
Описание библиотеки для работы с датчиком. Пример скетча
Для работы с датчиком BMP180 существуют различные библиотеки, упрощающие работу. К ним относятся SFE_BMP180, Adafruit_BMP085. Эти же библиотеки подходят для работы с датчиком BMP080. Для датчика bmp280 используется похожая библиотека Adafruit_BMP280.
Первый пробный скетч будет заставлять датчик считывать показания давления и температуры. Код подойдет как для датчика BMP180 , так и для BMP280, нужно только подключить правильную библиотеку и указать верные контакты, к которым подключен модуль. В первую очередь в коде нужно подключить все библиотеки и инициализировать работу датчика. Для определения давления нужно сначала узнать температуру. Для этого используется следующий элемент кода.
status = pressure.startTemperature();// Считываются данные с датчика о температуре if(status!=0){ delay(status); // Ожидание status = pressure.getTemperature(T); // Сохранение полученных данных о температуре if(status!=0){ Serial.print("Temperature: "); // Выведение на экран слова «Температура» Serial.print(T,2); // Вывод на экран значения температуры. Serial.println("deg C, "); //Печать символа градуса Цельсия.
Затем нужно получить информацию об атмосферном давлении.
status = pressure.startPressure(3); // происходит считывание давления if(status!=0){ delay(status); // Ожидание status = pressure.getPressure(P,T); // получение давления, сохранение if(status!=0){ Serial.print("Absolute pressure: "); // Вывод на экран слов «Атмосферное давление» Serial.print(P,2); // Вывод на экран значения переменной mBar Serial.print(" mbar, "); // Вывод на экран текста "mBar" Serial.print(P*0.7500637554192,2); // вывод на экран значения в mmHg (мм.рт.ст.) Serial.println(" mmHg");} // вывод на экран единицы измерения давления "mmHg" (мм. Рт.ст.).
После загрузки скетча в окне мониторинг порта появятся данные о температуре и атмосферном давлении.
Датчик BME280 также показывает давление и температуру, дополнительно он может считывать показания о влажности, который по умолчанию выключен. При необходимости можно произвести настройки датчика и начать считывать показания о влажности. Диапазон измерения от 0 до 100%. Библиотека, которая нужна для работы с датчиком, называется Adafruit_BME280.
Код похож на тот, что описан выше, только к нему еще добавляются строки для определения влажности.
void printValues() { Serial.print("Temperature = "); Serial.print(bme.readTemperature()); Serial.println(" C"); //определение температуры, вывод ее на экран в градусах Цельсия. Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); //определение давления, вывод его на экран Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); //определение влажности в процентах, вывод измеренного значения на экран. Serial.println(); }
Возможные ошибки при подключении и устранение их
Наиболее часто встречающаяся ошибка – неправильные данные о давлении и температуре, которые отличаются на несколько порядков от реального значения. Причиной этого чаще всего становится неправильное подключение – например, в библиотеке указано, что нужно подключать по I2C, а датчик подключен по SPI.
Также при использовании “китайских” датчиков можно столкнуться с нестандартными I2C или SPI адресами. В этом случае рекомендуется просканировать все присоединенные устройства с помощью одного из популярных скетчей и выяснить, по какому адресу откликается ваш датчик давления.
Еще одной проблемой может стать несоответствие рабочего напряжения питания модуля базовому напряжению используемого контроллера. Так, для работы с датчиком на 3,3 В вам потребуется создать делитель напряжения или использовать один из существующих готовых модулей согласования уровней. Кстати, такие модули достаточно дешевы и начинающим рекомендуется использовать их.
Небольшие отклонения от реальной величины могут быть связаны с калибровкой сенсора. Например, для датчика BMP180 все данные рассчитываются и задаются в скетче. Для получения более точного значения высоты нужно знать текущее значение давления над уровнем моря для данных координат.
Заключение
Датчики атмосферного давления bmp180, bmp280- не самые дешевые виды сенсоров, но во многих случаев альтернативы таким сенсорам практически нет. В проекте метеостанции датчик фиксирует важный параметр – атмосферное давление, благодаря чему становится возможным предсказывать погоду. В проектах, связанных с созданием летающих аппаратов барометр используется в качестве датчика реальной высоты над уровнем моря.
Подключение датчиков не представляет какой-либо сложности, т.к. используется стандартной i2C или SPI соединение. Для программирования можно использовать одну из готовых бесплатных библиотек.
Используемые источники:
- https://3d-diy.ru/wiki/arduino-datchiki/datchik-bme280/
- https://habr.com/post/406693/
- https://arduinomaster.ru/datchiki-arduino/datchiki-atmosfernogo-davleniya-bmp280-bmp180-bme280/