Электрификация

Справочник домашнего мастера

Bmp280 arduino подключение

Содержание

Подключение датчика атмосферного давления BMP280 к Arduino

BMP280 — это цифровой датчик от Bosch Sensortec позволяющий получить текущие значения атмосферного давления и температуры окружающей среды. Этот датчик специально разработан для мобильных приложений, где малый размер и низкое энергопотребление очень важны. В данной статьи увидим, как подключить датчик атмосферного давления BMP280 к Arduino по I2C и SPI, какие библиотеки установить и приведём несколько примеров скетчей.

BMP280 основан на технологии пьезорезистивного датчика давления, обладающей высокой точностью, линейностью и стабильностью с устойчивостью к электромагнитной совместимости.

BMP280 может использоваться в различных приложениях, таких как улучшение систем навигации GPS, внутренняя навигация, таких как обнаружение пола и обнаружение лифта, наружная навигация, спортивные приложения, прогноз погоды и т. д. Еще одним применением данного модуля является определений высоты, которая зависит от давления и рассчитывается по международной барометрической формуле.

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

Для работы с датчиком BMP280 существуют различные библиотеки, упрощающие работу. К ним относятся BMP280_DEV, Adafruit_BMP280_Library. Для датчика BMP280 будет используется библиотека от Adafruit.

Adafruit Unified Sensor Driver — общий драйвер

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
  2. В строке поиска вводим «Adafruit Unified Sensor», выбираем последнюю версию и кликаем Установить
  3. Библиотека установлена (INSTALLED)

Библиотека Arduino для датчиков BMP280

Чтобы начать считывать данные с датчиков, вам необходимо установить библиотеку Adafruit_BMP280 (код в репозитории github). Она доступна в менеджере библиотек Arduino, поэтому рекомендуется его использовать.

  1. В Arduino IDE открываем менеджер библиотек: Скетч->Подключить библиотеку->Управлять библиотеками…
  2. В строке поиска вводим «Adafruit BMP280», выбираем библиотеку от Adafruit, но можете использовать любую.
  3. Выбираем последнюю версию и кликаем Установить
  4. Выбираем пример: Файл->Примеры->Adafruit BMP280 Library->bmp280test
  5. Компилируем этот пример. Если получаем ошибку fatal error: Adafruit_Sensor.h: No such file or directory, нужно установить Adafruit Unified Sensor (смотрите выше)
    1 2 3 4 5 6 7 8 9 …\Documents\Arduino\bmp280-i2c\bmp280-i2c.ino:1:30: fatal error: Adafruit_Sensor.h: No such file or directory #include <Adafruit_Sensor.h> ^ compilation terminated. exit status 1 Ошибка компиляции для платы Arduino Pro or Pro Mini.

Подключение BMP280 к Arduino по I2C/TWI

Так как датчик может работать по I2C и SPI, подключение можно реализовать двумя методами. При подключении по I2C нужно соединить контакты SDA и SCL.

Схема подключения BMP280 к Arduino

Для подключения понадобятся сам датчик BMP280, плата Ардуино, соединительные провода. Схема подключения показана на рисунке ниже.

Землю с Ардуино нужно соединить с землей на датчике, напряжение 3.3 В — на 3.3 В, SDA — к пину А4, SCL — к А5. Контакты А4 и А5 выбираются с учетом их поддержки интерфейса I2C.

Существуют несколько модулей с этим датчиком. Первый вариант — это модуль для работы в 3.3 В логике, данные модули будут подешевле; второй вариант — для работы в 5.0 В логике, на нём присутствуют: линейный стабилизатор напряжения на 3.3 В и преобразователи уровней 3.3/5.0 В на линиях SCK/SCL и SDI(MOSI)/SDA. Первый подойдёт для ардуин работающих от 3.3 В и Raspberry Pi / Orange Pi / Banana Pi и т.д., а второй — для обычных ардуин на 5.0 В.

Подключение BMP280 с встроенными стабилизатором напряжения на 3.3 В и преобразователями уровней 3.3/5.0 В на линиях SCK/SCL и SDI(MOSI)/SDA к Arduino.

Arduino Mega Arduino Uno/Nano/Pro Mini BMP280 модуль Цвет проводов на фото
GND GND GND Черный
5V 5V Vin Красный
20 (SDA) A4 SDA/SDI Зелёный
21 (SCL) A5 SCL/SCK Жёлтый

Подключение BMP280 без встроенного стабилизатора напряжения на 3.3 В к Arduino. В данном случае нужно использовать внешний преобразователь уровней на линиях SCK/SCL и SDI(MOSI)/SDA.

Arduino Mega Arduino Uno/Nano/Pro Mini BMP280 модуль Цвет проводов на фото
GND GND GND Черный
3.3V 3.3V VCC/3.3V Красный
20 (SDA) A4 SDA/SDI Зелёный
21 (SCL) A5 SCL/SCK Жёлтый

Примеры скетча

После запуска вы можете инициализировать датчик с помощью:

1 2 3 4 if (!bmp.begin()) { Serial.println(«Could not find a valid BMP280 sensor, check wiring!»); while (1); }

begin() вернет True, если датчик был найден, и False, если нет. В случае с False, проверьте соединение датчика с платой Arduino!

Считать температуру и давление легко, просто вызовите функции:

1 2 bmp.readTemperature(); // Температура в градусах Цельсия. bmp.readPressure(); // Атмосферное давление в гПа

Копируйте и скомпилируйте нижеприведённый скетч в Arduino IDE.

Результат

Температура рассчитывается в градусах Цельсия, вы можете преобразовать ее в градусы Фаренгейта, используя классическое уравнение F = C * 9/5 + 32.

Давление возвращается в единицах СИ Паскалей. 100 Паскалей = 1 гПа = 1 миллибар. Часто барометрическое давление сообщается в миллибарах или миллиметрах ртутного столба. Для дальнейшего использования 1 паскаль = 0,00750062 миллиметров ртутного столба или 1 миллиметр ртутного столба = 133,322 Паскаля. Таким образом, если вы возьмете значение паскаля, скажем, 100734 и разделите на 133,322, вы получите 755,57 миллиметров ртутного столба.

Также возможно превратить BMP280 в альтиметр. Если вы знаете давление на уровне моря, библиотека может рассчитать текущее атмосферное давление в высоту.

Подключение BMP280 к Arduino по SPI (аппаратный)

Поскольку это датчик с поддержкой SPI, можно использовать аппаратный или «программный» SPI для работы с датчиком.

При подключении по SPI нужно соединить SCK/SCL с модуля к SCK (13й контакт на Ардуино), SDO с модуля к 12 выводу Ардуино, SDA/SDI — к 11 контакту, CSB (CS) — к любому цифровому пину, в данном случае к 10 контакту на Ардуино.

Подключение по SPI BMP280 с встроенными стабилизатором напряжения на 3.3 В и преобразователями уровней 3.3/5.0 В на линиях SCK и SDI(MOSI) к Arduino.

Вы можете использовать аппаратный SPI. С аппаратным SPI вы должны использовать аппаратные выводы SPI вашего Arduino — у каждого типа arduino разные выводы! В этом случае вы можете использовать любой контакт CS, но остальные три контакта фиксированы.

1 Adafruit_BMP280 bmp(BMP_CS); // hardware SPI

Полный код примера:

Подключение BMP280 к Arduino по SPI (программный)

Под программным SPI понимается использование драйвера Arduino SPI для эмуляции аппаратного SPI с использованием «битовой синхронизации». Это позволяет подключить SPI-устройство к любым контактам Arduino.

Подключение по SPI BMP280 с встроенными стабилизатором напряжения на 3.3 В и преобразователями уровней 3.3/5.0 В на линиях SCK и SDI(MOSI) к Arduino.

Вы можете создать объект BMP280 с любым программным SPI (где все четыре контакта могут быть любыми входами / выходами Arduino), используя:

1 Adafruit_BMP280 bmp(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

Полный код примера:

Материалы

Arduino Test | Adafruit BMP280 Barometric Pressure + Temperature Sensor Breakout | Adafruit Learning System
BME280 — датчик давления, температуры и влажности
GitHub — adafruit/Adafruit_BMP280_Library: Arduino Library for BMP280 sensors
Барометр BMP180 и BMP280 (датчик атмосферного давления, высотомер) (Trema-модуль v2.0) — Описания, примеры, подключение к Arduino
Датчик Давления BMP-280 С Arduino Учебник

BMP280 — датчик окружающей среды фирмы Bosch для измерения температуры и барометрического давления, является обновлением предыдущего поколения — BMP085 / BMP180 / BMP183. Отлично подходит для всех видов погодных измерений и может подключаться к микроконтроллерам по шинам I2C и SPI.

Датчик Bosch BMP280

Этот прецизионный датчик является лучшим недорогим решением для измерения барометрического давления с абсолютной точностью ± 1 гПа и температуры с точностью ± 1,0°C. Поскольку давление изменяется с высотой, его также используют как высотомер с точностью ± 1 метр.

Датчик BMP280 часто используется в полетных контроллерах радиоуправляемых самолетов, мультикоптеров, квадрокоптеров, зондах, а так же в составе самостоятельного высотомера или вместе с прибором ГЛОНАСС, GPS для уточнения высоты и в приборах, отслеживающих погоду.

Для удобства подключения разработан модуль с датчиком BMP280, имеющий 6 отверстий для штырьковых контактов (обычно не распаянных) с шагом 2,54 мм, 2 отверстия крепления и необходимую обвязку чипа.

Модуль GY-BMP280-3.3

Схема модуля GY-BMP280-3

Характеристики:

Режимы работы:

  • SLEEP — режим сна
  • FORCED — проведение измерения, считывание значения, переход в спящий режим
  • NORMAL — циклическая работа – выход из режима сна, измерение, считывание показаний, сохранение значений и снова переход в режим сна.

Подключение модуля GY-BMP280-3.3 по шине I²C

Схема подключения к Arduino по шине I²C

  • VCC —> Arduino VCC (3.3 V)
  • GND —> Arduino GND
  • SCL —> Arduino A5
  • SDA —> Arduino A4

Скетч для работы с Arduino Uno по шине I²C:

Arduino

Подключение модуля GY-BMP280-3.3 по шине SPI

Схема подключения к Arduino по шине SPI

Скетч для работы с Arduino Uno по шине SPI:

Arduino

Скетч такой же, как и в первом примере, за исключением изменения нескольких строк:

Arduino

Две последнии строчки отличаются режимом работы SPI — аппаратным или программным. Под программным SPI понимается использование драйвера Arduino SPI для эмуляции аппаратного SPI с использованием «битовой синхронизации». Это позволяет подключить SPI-устройство к любым контактам Arduino.

Результат работы скетча выводится на Монитор порта (Serial Monitor, вызывается клавишами CTRL+SHIFT+M) среды программирования Arduino IDE.

Домашняя метеостанция на GY-BMP280-3.3 и Ds18b20


Я хочу собрать своими руками прибор, который будет измерять атмосферное давление и температуру. Датчик температуры должен быть выносным и герметичным, так как должен измерять температуру на некотором расстоянии от прибора. Хотелось бы иметь такой переносной прибор с рабочим диапазоном от -30°С до 50°С. Но для это надо, чтобы все компоненты были способны работать в этом диапазоне температур. Компоненты, способные работать в расширенном температурном диапазоне, стоят дороже, да и купить их сложнее.
Исполнить мою мечту в реальность мне поможет плата GY-BMP280-3.3, о которой я рассказал в статье «Плата GY-BMP280-3.3 для измерения барометрического давления и температуры».
Из практики известно, что при сборке и настройке электронного изделия пред его изготовлением нужно проверить исправность всех материалов и компонентов каждого отдельно. Иначе можно потом запутаться, и в итоге электронное изделие не будет работать, а найти причину неисправности будет очень сложно.
Приступим.
Первый этап. Устанавливаем на компьютер бесплатную программную оболочку Arduino IDE для написания программ (скетчей), их компиляции и последующей записи в микроконтроллер Mega328P, установленный на плату Arduino Uno. Рекомендую вам скачать оболочку Arduino IDE версию ARDUINO 1.6.5. Почему? Изначально проект ARDUINO был один, теперь разработчики разошлись и продолжают развивать систему ARDUINO, но каждый по-своему, с небольшими нюансами. Я использовал версию ARDUINO 1.6.5. Она должна быть установлена и проверена на совместную работу с платой Arduino Uno на простейших примерах.
Второй этап. Проверяем плату GY-BMP280-3.3 для измерения барометрического давления и температуры. Берем 4 проводка, соединяем ими GY-BMP280-3.3 и Arduino Uno, как изображено на фотографии и схеме. Кривые тонкие разноцветные линии – это проводники.



Приступим к проверке платы GY-BMP280-3.3. Для этого нужно установить библиотеку в Arduino IDE, написанную программистами, работающими на сайте iarduino.ru. Как правило, после установки библиотеки в Arduino IDE, появляются примеры (образцы) кода. Незначительно изменив образец кода, мы сможем компилировать его в данные, понятные микроконтроллеру, а потом отправить их в память микроконтроллера. Найти пример (образец) вы сможете, обратив внимание на две фотографии экрана, расположенные ниже.



После записи данных в микроконтроллер платы Arduino Uno он сразу начинает выполнять программу (код) и отсылать данные по USB кабелю на компьютер, к которому подключена плата Arduino Uno. А результат измерений платы GY-BMP280-3.3 мы сможем увидеть в окне Arduino IDE, называемом «монитором последовательного порта».

Результат измерений платы GY-BMP280-3.3 мы сможем увидеть в стандартной программе Windows Hyper Terminal, предварительно закрыв оболочку Arduino Uno и настроив сеанс в программе Hyper Terminal. То есть мы можем получать результаты работы платы GY-BMP280-3.3, подключив Arduino Uno к любому компьютеру USB кабелем, на котором установлен драйвер для платы Arduino Uno. Библиотек для работы с GY-BMP280-3.3 несколько. У меня все заработало с библиотекой с сайта. Файл, который вы скачаете с этого сайта, будет иметь такой вид: bd7e4a37c1f4dba2ebde9b9cd49f45ce.zip. Его нужно переименовать в вид: iarduino_Pressure_BMP.zip. Теперь нам надо установить библиотеку iarduino_Pressure_BMP в оболочку Arduino IDE.
Запускаем Arduino IDE, заходим в меню Эскиз/Include Librari/Add.ZIP Library… далее выбираем файл iarduino_Pressure_BMP.zip и нажимаем кнопку Open. Так же надо установить библиотеки: iarduino.ru/file/198.html, iarduino.ru/file/49.html . После установки библиотек перегружаем оболочку Arduino IDE, то есть закрываем её и запускаем заново. Затем выбираем в меню Файл/Образцы/iarduino Pressure BMP (датчики давления)/example.
Видим в окне код.
Код надо будет немного изменить.
В пятой строке удалить два слеша «//» и в одиннадцатой строке добавить (0x76) или (0x77). (0x76) — это адрес платы барометра. У моей платы GY-BMP280-3.3, подключенной к шине I2C, адрес оказался равным (0x76). Как узнать номер устройства, подключенного к шине I2C? Ответ на этот вопрос вы получите, прочитав статью полностью.
Итак, мы исправили код в окне, теперь запускаем проверку и компиляцию кода в меню Эскиз/ Проверить/Скомпилировать. Если проверка и компиляция кода пройдет успешно, то в меню Эскиз/Вгрузить запускаем запись программы в Arduino Uno.
Если загрузка пройдет удачно, то, открыв монитор последовательного порта в меню: Инструменты/ Монитор последовательного порта, мы увидим данные, отправляемые платой GY-BMP280-3.3.
На следующем снимке экрана результат работы платы GY-BMP280-3.3 на компьютере, на котором не установлена оболочка Arduino IDE. Данные получает программа PuTTY.
В это же время был сфотографирован лабораторный барометр-анероид, который находился рядом с платой GY-BMP280-3.3. Сравнив показания приборов, вы сами можете сделать выводы о точности работы платы GY-BMP280-3.3. Барометр-анероид аттестован государственной лабораторией.
Третий этап. Проверка LCD дисплея с интерфейсным модулем I2C. Находим LDC дисплей с интерфейсным модулем, который подключается по шине I2C к Arduino UNO.
Проверяем его работу на примерах из оболочки Arduino IDE. Но перед этим определяем адрес интерфейсного модуля. У моего интерфейсного модуля адрес — 0x3F. Этот адрес я вставил в строчку скетча: LiquidCrystal_I2C lcd(0x3F,16,2);
Я определил этот адрес с помощью скетча «сканера адреса устройств I2C», описанного в статье.
Я запустил оболочку Arduino IDE, из статьи скопировал программный код и вставил его окно Arduino IDE.
Запустил компиляцию, потом записал код в плату Arduino UNO, к которой были подключены плата GY-BMP280-3.3 и LDC дисплей с интерфейсным модулем I2C. Затем в мониторе последовательного порта получил следующий результат. У моего интерфейсного модуля адрес — 0x3F.
Четвертый этап. Проверка датчика температуры DS18b20. Подключаем его по следующей схеме.
Библиотека OneWire Arduino Library для работы с датчиком температуры DS18b20 у нас уже установлена.
Открываем образец DS18x20_Temperature, компилируем, загружаем, смотрим результат измерения в мониторе последовательного порта. Если все работает, приступаем к следующему этапу.
Пятый этап. Сборка домашней метеостанции на GY-BMP280-3.3 и Ds18b20.
Собираем устройство по схеме:
Код для устройства я получил, объединив все примеры в одно и настроив вывод на экран дисплея LDC. Вот что у меня получилось:
// Раскомментируйте для программной реализации шины I2C: // // #define pin_SW_SDA 3 //Назначение любого вывода Arduino для работы в качестве линии SDA программной шины I2C. // #define pin_SW_SCL 9 // Назначение любого вывода Arduino для работы в качестве линии SCL программной шины I2C. // Раскомментируйте для совместимости с большинством плат: // #include #include // Библиотека iarduino будет использовать методы и функции библиотеки Wire. #include // Библиотека для работы LDC типа 1602 по шине I2C // Ссылки для ознакомления: // // Подробная информация о подключении модуля к шине I2C: // http://wiki.iarduino.ru/page/i2c_connection/ // Подробная информация о функциях и методах библиотеки: // http://wiki.iarduino.ru/page/trema-modul-pressure-meter // #include // Подключаем библиотеку iarduino_Pressure_BMP для работы с BMP180 или BMP280. iarduino_Pressure_BMP sensor(0x76); // Объявляем объект sensor для работы с датчиком давления, используя функции и методы библиотеки iarduino_Pressure_BMP. LiquidCrystal_I2C lcd(0x3F,16,2); OneWire ds(10); void setup(){ lcd.init(); lcd.backlight(); Serial.begin(9600); // Инициируем передачу данных в монитор последовательного порта на скорости 9600 бод. delay(1000); // Ждём завершения переходных процессов при подаче питания sensor.begin(73); // Инициируем работу с датчиком. Текущая высота будет принята за 73 м.- высота города Бузулука над уровнем моря } // void loop (){ // Считываем данные и выводим: температуру в °С, давление в мм. рт. ст., изменение высоты относительно указанной в функции begin(по умолчанию 0 метров). lcd.setCursor(0,0); // определяем точку вывода «P = » на LDC lcd.print(«P = «); lcd.print(sensor.pressure/1000,3); // делим значение Р выданное BMP280 на 1000 и задаём вывод 3 знаков после запятой lcd.setCursor(12,0); // определяем точку вывода «kPa» на LDC lcd.print(«kPa»); lcd.setCursor(0,1); lcd.print(«T=»); lcd.print(sensor.temperature,1); // задаём вывод 1 знака после запятой lcd.setCursor(6,1); // lcd.print(«C»); // lcd.setCursor(9,1); // lcd.print(«H= «); // lcd.print(sensor.altitude,1); if(sensor.read(1)) {Serial.println((String)»CEHCOP BMP» + sensor.type + «: \t P = » + sensor.pressure + «\tMM.PT.CT, \t T = » + sensor.temperature + » *C, \t\t B = «+sensor.altitude+» M.»);} else {Serial.println(«HET OTBETA OT CEHCOPA»);} // Считываем данные и выводим: температуру в °С и давление в Па, давление в мм. рт. ст., изменение высоты относительно указанной в функции begin(по умолчанию 0 метров). if(sensor.read(2)) {Serial.println((String)»CEHCOP BMP» + sensor.type + «: \t P = » + sensor.pressure + «\tPa, \t\t T = » + sensor.temperature + » *C, \t\t B = «+sensor.altitude+» M.»);} else {Serial.println(«HET OTBETA OT CEHCOPA»);} byte i; byte present = 0; byte type_s; byte data; byte addr; float celsius, fahrenheit; if ( !ds.search(addr)) { Serial.println(«No more addresses.»); Serial.println(); ds.reset_search(); delay(250); return; } Serial.print(«ROM =»); for( i = 0; i &lt; 8; i++) { Serial.write(‘ ‘); Serial.print(addr, HEX); } if (OneWire::crc8(addr, 7) != addr) { Serial.println(«CRC is not valid!»); return; } Serial.println(); // the first ROM byte indicates which chip switch (addr) { case 0x10: Serial.println(» Chip = DS18S20″); // or old DS1820 type_s = 1; break; case 0x28: Serial.println(» Chip = DS18B20″); type_s = 0; break; case 0x22: Serial.println(» Chip = DS1822″); type_s = 0; break; default: Serial.println(«Device is not a DS18x20 family device.»); return; } ds.reset(); ds.select(addr); ds.write(0x44, 1); // start conversion, with parasite power on at the end delay(1000); // maybe 750ms is enough, maybe not // we might do a ds.depower() here, but the reset will take care of it. present = ds.reset(); ds.select(addr); ds.write(0xBE); // Read Scratchpad Serial.print(» Data = «); Serial.print(present, HEX); Serial.print(» «); for ( i = 0; i &lt; 9; i++) { // we need 9 bytes data = ds.read(); Serial.print(data, HEX); Serial.print(» «); } Serial.print(» CRC=»); Serial.print(OneWire::crc8(data, 8), HEX); Serial.println(); // Convert the data to actual temperature // because the result is a 16 bit signed integer, it should // be stored to an «int16_t» type, which is always 16 bits // even when compiled on a 32 bit processor. int16_t raw = (data &lt;&lt; 8) | data; if (type_s) { raw = raw &lt;&lt; 3; // 9 bit resolution default if (data == 0x10) { // «count remain» gives full 12 bit resolution raw = (raw &amp; 0xFFF0) + 12 — data; } } else { byte cfg = (data &amp; 0x60); // at lower res, the low bits are undefined, so let’s zero them if (cfg == 0x00) raw = raw &amp; ~7; // 9 bit resolution, 93.75 ms else if (cfg == 0x20) raw = raw &amp; ~3; // 10 bit res, 187.5 ms else if (cfg == 0x40) raw = raw &amp; ~1; // 11 bit res, 375 ms //// default is 12 bit resolution, 750 ms conversion time } celsius = (float)raw / 16.0; fahrenheit = celsius * 1.8 + 32.0; Serial.print(» Temperature = «); Serial.print(celsius); Serial.print(» Celsius, «); Serial.print(fahrenheit); Serial.println(» Fahrenheit»); lcd.setCursor(8,1); // определяем точку вывода «Tds=» на LDC lcd.print(«Tds=»); lcd.print(celsius,1); delay(3000); }
Вот что у меня получилось:
Плата GY-BMP280-3.3 выдаёт давление в паскалях, что не очень удобно. Решить задачу, как заставить плату GY-BMP280-3.3 выдавать данные по давлению в килопаскалях, я не смог. Я решил эту задачу в строке вывода на дисплей LDC.
lcd.print(sensor.pressure/1000,3); // делим значение Р выданное BMP280 на 1000 и задаём вывод 3 знаков после запятой
Плата GY-BMP280-3.3 выдаёт также значения высоты над уровнем моря.
sensor.begin(73); // Инициируем работу с датчиком. Текущая высота будет принята за 73 м.- высота города Бузулука над уровнем моря
Если вы будете отдыхать на море и измените «sensor.begin(73);» на «sensor.begin(0);» в коде, а затем откомпилируете и запищите программу в домашнюю метеостанцию на GY-BMP280-3.3 и Ds18b20, и сделаете вывод высоты на LDC дисплей, то вы получите еще и высотомер.
// lcd.setCursor(9,1);
// lcd.print(«H= «);
// lcd.print(sensor.altitude,1); // Выводим значения высоты в метрах с одним знаком после запятой
Питание на схему подаётся в моём варианте по кабелю USB. Вы можете применить низковольтный повышающий импульсный преобразователь 5В/600 мА и ваша метеостанция станет портативной. Такого типа источник питания хорошо описан в статье.
Удачных компиляций! Продам эту самоделку или изготовлю на заказ. Напишите мне или оставьте комментарий для обсуждения деталей. Доставка новых самоделок на почту

Получайте на почту подборку новых самоделок. Никакого спама, только полезные идеи!

*Заполняя форму вы соглашаетесь на обработку персональных данных

Становитесь автором сайта, публикуйте собственные статьи, описания самоделок с оплатой за текст. .

Простые эксперименты с микроконтроллером STM32F103 («Голубая таблетка»)

Часть 2 < — Часть 1
Продолжим эксперементировать с микроконтроллером STM32F103C8T6, подключим некоторые датчики/дисплеи с интерфейсом I2C к «голубой таблетке».
Реализована поддержка популярных дисплеев I2C:

  • LCD 1602
  • SSD1306

Реализована поддержка следующих датчиков:

  • BH1750 — датчик освещенности
  • BME280 — датчик температуры, давления, влажности
  • CCS811 — датчик СО2, ЛОВ ( Летучие Органические Вещества )

Для того, чтобы начать работать с новыми функциями необходимо создать новый проект.
Ссылка для загрузки программы MIOC приведена в первой части.

Датчики

Датчик BH1750

BH1750 16-битный датчик освещённости (люксметр) с интерфейсом I2C. Фотодиод на BH1750 определяет интенсивность света, которая преобразуется в выходное напряжение с помощью операционного усилителя. Встроенный АЦП выдает 16-битные цифровые данные. Внутренняя логика BH1750 избавляет от необходимости каких-либо сложных вычислений, поскольку он напрямую выводит значимые цифровые данные в люксах (лк).
Согласно документации, датчик BH1750 чувствителен к видимому свету и практически не подвержен влиянию инфракрасного излучения, т.е. реагирует примерно на тот же спектральный диапазон, что и человеческий глаз.
Для работы с этим датчиком на закладке «Configuration» выбрать BH1750.
Результаты измерений будут находиться в глобальной переменной:
uint32_t BH_L;
Подключение датчика к шине I2C2:

Датчик BME280

Данный датчик измеряет параметры окружающей среды: температура, атмосферное давление, а также влажность воздуха.
Есть ещё подобный датчик — BMP280, в котором отсутствует возможность измерять влажность. Но зато стоит он гораздо дешевле.
Помимо того, что датчик измеряет все вышеперечисленные параметры, он также умеет фильтровать шумы, в него встроена калибровка показаний. Так же в отличие от других датчиков, данный датчик проделывает все эти измерения не только быстро, но и в более широких диапазонах. Например, многие датчики не умеют измерять влажность воздуха менее 20 процентов.
Заявленные характеристики у датчика следующие:
Датчики подключаются к шине I2C2 следующим образом:
Если будет использован BMP280, то в файле main/bme280.c нужно закоментировать все строки помеченные // Comment for BMP.
Результаты измерений будут находиться в глобальных переменных:
Пример программы, работающей с датчиками BH1750, BME280, и дисплея 1602:
#include «mx_init_hw.c» int main() { char s; float t=0, p=0, h=0; Init_HW(); // ——————— // The main program loop // ——————— while( TRUE ) { delay_ms( 300 ); t = BME_T / 10.0; p = BME_P / 100.0; h = BME_H / 10.0; sprintf( s, «t=%-7.1fC», t ); SSD1306_write_string( 1, s ); sprintf( s, «p=%-7.1fPa», p ); SSD1306_write_string( 2, s ); sprintf( s, «h=%-7.1f%% «, h ); SSD1306_write_string( 3, s ); sprintf( s, «T=%-7.1fH=%.1f», t, h ); LCD_write_string( 1, s ); sprintf( s, «P=%-7.1fL=%u», p, BH_L ); LCD_write_string( 2, s ); } }
Результат работы программы:
Эта же программа будет отображать температуру, давление, влажность на дисплее SSD1306
(подключить данный дисплей, и выбрать его в конфигурации):
Датчик BME280 может измерять температуру с большей точностью. Для этого его нужно откалибровать. В файле main/bme280.h для этого есть макроопределение:
#define DT 3520

Датчик CCS811

Окружающий нас воздух представляет собой смесь газов и состоит в основном из азота (около 78%) и кислорода (около 21%). Оставшийся процент приходится на долю различных примесей (инертные газы, углекислый газ, угарный газ, органические летучие вещества (ЛОВ) и т. д). Несмотря на то, что в процентном соотношении количества примесей мало, изменение их концентрации может оказаться очень неприятным и даже опасным для человека. Качество воздуха в офисных и бытовых помещениях чаще всего связывают с содержанием CO2 и ЛОВ.
К органическим летучим веществам относятся более 5000 соединений. Образование большей части из них так или иначе связано с процессами жизнедеятельности человека.
Таким образом, даже простое присутствие человека в замкнутом помещении приводит к «загрязнению» воздуха и необходимости проветривания. Оценка концентрации ЛОВ в воздухе затруднена. Раньше для оценки концентрации ЛОВ применяли датчики CO2. При этом учитывался тот факт, что в нормальных условиях концентрации ЛОВ и CO2 оказываются связанными. Зная процентное содержание CO2, можно косвенно определить концентрацию ЛОВ. Если содержание углекислого газа в воздухе достигло некоторого предела — необходимо включать вентиляцию.
На практике взаимосвязь между ЛОВ и CO2 не всегда однозначна. Например, курение в помещении вызывает резкий скачок содержания ЛОВ, который датчики CO2 не фиксируют, так концентрация углекислого газа при этом сильно не меняется. Датчики углекислого газа также будут бессильны, если в помещении используется бытовая химия, чистящие средства, лакокрасочные материалы или обычная парфюмерия. Компания AMS предлагает свое решение проблемы измерения концентрации ЛОВ — датчики CCS811.
Характеристики датчиков качества воздуха CCS811B:
Датчик имеет алгоритм автоматической калибровки. Измеряемые величины автоматически устанавливаются в течение нескольких дней. По этой причине новый датчик имеет гигантскую начальную погрешность и должен отработать как минимум трое-четверо суток до получения более-менее достоверных результатов:
Пользователю также необходимо помнить, что каждый раз после включения датчик CCS811 должен «прогреваться». Время такого «прогрева» составляет более 30 минут, в течение которых погрешность оказывается недопустимо большой:
Эту особенность CCS811 крайне важно учитывать.
Результаты измерений датчика находятся в глобальных переменных:
uint32_t CCS_CO2;
uint32_t CCS_TVOC;
Подключение датчика к шине I2C2:
Программу печати результатов работы данного датчика, используя примеры выше и описание работы с консолью изложенное в первой части, можете написать самостоятельно.

Примеры прочих датчиков

Датчик движения HC-SR501

Некоторые датчики, например датчики движения HC-SR501 не требуют написания каких либо дополнительных сниппетов.
Для данного датчика — объявить переменную, выбрать Type=GPIO_Mode_IN_FLOATING, выбрать порт.
Генерировать BSP, компилировать, загрузить в МК. Далее работаем с этим датчиком так же, как с кнопкой (на получение данных).
Подключение датчика HC-SR501:

Датчик температуры/влажности DHT22

Датчик измерения температуры/влажности
Подключение датчика:
Работа с этим датчиком будет как пример пользовательского сниппета ( аналог скетча arduino ).
Сниппет можно взять здесь:
dht22.c
Поместить его в папку main
В данном файле отредактировать строки:
#define PORT GPIOA #define PIN GPIO_Pin_5
по фактическому подключению датчика
Текст программы для работы с данным сниппетом:
#include «mx_init_hw.c» #include «dht_22.c» int main() { int16_t dht_t, dht_h; Init_HW(); dht_init(); // ——————— // The main program loop // ——————— while( TRUE ) { delay_ms( 5000 ); if( !get_dht_data( &dht_t, &dht_h ) ) print( «t=%.1f h=%.1f\r\n», (float)dht_t / 10.0, (float)dht_h / 10.0 ) else print( «DHT 22 — ERR\r\n» ); } }
Результат работы:
Чаще, чем раз в 4-5 секунд датчик опрашивать нет смысла. Причины: вычисление температуры происходит в течении 800-900 mS, второе: если опрашивать чаще, то идет саморазогрев датчика.

CLI

Прошивка содержит небольшой командный интерпретатор, работающий с консолью. Посмотреть какие команды есть можно в файле main/mx_cli.c
При желании можно добавить какие либо свои команды.
CLI начинает работать в режиме No Echo, т. е. Вводимые символы не отображаются. Для отображения вводимых символов необходимо напечатать: echo on.
Команда «sh on» будет выводить два раза в секунду значения переменных, объявленных в конфигураторе и переменных связанных с датчиками. Номер в первой позиции соответствует номеру строки в таблице конфигуратора. Данная команда сделана для передачи данных в систему подключенную к консоли.
Никаких флагов и мьютексов, анализирующих занятость консоли — нет. Поэтому при совместном использовании оператора «print» и «echo on» может произойти перемешивание выводимой информации. Не следует применять оба метода одновременно. Для решения данной проблемы можно использовать два канала вывода. Например консоль на UART1, а вывод пользовательской информации на VCP. Или наоборот.
Использовать функции:
send_uart1( char *data, int len ) send_usb( char *data, int len )
Для облегчения использования этих функций можно в файле gbl.h изменить макроопределение printf. Например на следующее:
#define printf(fmt,argv…){char s;sprintf(s,fmt,##argv);send_usb(s,strlen(s));} // вывод на VCP
Пример вывода на консоль (echo on):

Сканирование шины I2Cx

Для сканирования шины I2C1 или I2C2 есть готовые «прошивки» *.hex

BME280 — датчик атмосферного давления, влажности и температуры

Сегодня расскажу о датчике BME280 с помощью которого можно получить показания влажности, температуры, атмосферного давления и высоту (расчетную). Данный датчик прост, предварительно откалиброван и для подключения не требуется дополнительных компонентов.

Технические параметры

► Напряжение питания: 3.3 В – 5 В
► Рабочий ток: 1 мA
► Диапазон измерения давления: 300 гПа – 1100 гПа (точность ±1.0 гПа)
► Диапазон измерения температуры: -40 °C до +85 °C (точность ±0.5 °C)
►Диапазон измерения влажности: 20 % до 80 % (точность ±3 %)
► Интерфейс: I2C
► Габариты: 12 мм х 10 мм

Общие сведения

Рассмотрим модуль поближе, в правой части расположен датчик BME280 фирмы Bosch (это приемник таких датчиков, как BMP180, BMP085). Данный датчик измеряет влажность, температуру и давление с помощью данных показаний осуществляется расчет высоты, но эти показания не точные, подробно о датчике можно посмотреть в документации. На обратной стороне установлен стабилизатор напряжения LM6206 на 3.3 В и преобразователь уровней I2C, поэтому можно подключить модуль к микроконтроллерам с 3.3 В или 5 В логикой, не боясь.

Назначение контактов:
► VCC, GND — питание модуля 3.3 В или 5 В
► SCL — линия тактирования (Serial CLock)
► SDA — линия данных (Serial Data)

Данный модуль работает по двухпроводному интерфейсу I2C, адрес по умолчанию 0x76, но есть возможность изменить на адрес 0x77. Если присмотреться на модуль, рядом с датчиком расположены контакты, по умолчанию левый и средний контакт замкнуты проводником. Необходимо острым предметом перерезать проводник и установить припоем перемычку между центральный и правым контактом,тем самым установив адрес 0x77. При необходимости можно вернуть адрес 0x76.

Подключение датчика давления BME280 к Arduino

Необходимые детали:
► BME280 — датчик атмосферного давления, влажности и температуры x 1 шт.
► Arduino UNO R3 (DCCduino, CH340G)x 1 шт.
► Провод DuPont 10x, 2,54 мм, 20 см, F-F (Female — Female) x 1 шт.

Подключение:
В данном примере используем датчик BME280 и плату Arduino UNO R3, все получение показание отправлять в «Мониторинг порта», принципе и все, осталось собрать схему по рисунку ниже. Для интерфейса I2C на плате arduino предусмотрено только два вывода A4 и A5, другие вывода не поддерживают I2C, так что учтите при проектирование.

Программа:
Для датчика BME280 разработана библиотека «Adafruit BME280 Library» с помощью которой можно упростить работу с датчиком. Так же, для работы датчика необходима дополнительная библиотека «Adafruit Unified Sensor». Скачать библиотеки можно в конце статьи или можно скачать через «Менеджер библиотек» в среде разработки IDE Arduino.

При открытие окна «Мониторинг порта» можно увидеть показания.

Описание скетча:
Программа начинается с подключение библиотек Wire.h , Adafruit_Sensor.h и Adafruit_BME280.h .

1 2 3 #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h>

Далее мы указываем переменную SEALEVELPRESSURE_HPA, необходимую для вычисления высоты, и создаем объект библиотеки Adafruit_BME280

1 2 #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme;

В разделе void setup инициализируем последовательную связь с ПК и вызываем функцию begin(),

1 2 3 4 5 Serial.begin(9600); if (!bme.begin(0x76)) { Serial.println(«Could not find a valid BME280 sensor, check wiring!»); while (1); }

В разделе void loop используем следующие функции для считывания температуры, относительной влажности и барометрического давления из модуля BME280.
► Функция readTempera () — считываем показания температуру с датчика.
► Функция readPressure () — считываем показания атмосферное давление с датчика.
► Функция readAltitude (SEALEVELPRESSURE_HPA) — расчет высоты (в метрах) из заданного атмосферного давления (в гПа) и давления на уровне моря (в гПа).
► Функция readHumidity () — считываем относительную влажность с датчика.

Ссылки
Документация на BME280
Библиотека Adafruit BME280 Library
Библиотека Adafruit Unified Sensor

Купить на Aliexpress
Контроллер Arduino UNO R3
Провода DuPont, 2,54 мм, 20 см
BME280 — датчик атмосферного давления, влажности и температуры

Купить в Самаре и области
Контроллер Arduino UNO R3
Провода DuPont, 2,54 мм, 20 см
BME280 — датчик атмосферного давления, влажности и температуры

Очередная забавная штучка с АлиЭкспрес. Встречайте мега комбайн от BOSCH, цифровой датчик температуры,влажности,давления BME280. По мнению некоторых один из самых точных датчиков по недорогой цене. Имеет SPI (поддерживает 3-4-провода SPI) и I2C интерфейс. Есть у него брат близнец BMP280 , единственное отличие в нем нету датчика влажности. Но давайте по порядку и подробней.

Характеристики :

  • Диапазон измерения давления: 300 – 1100 hPa (±1.0 hPa, 0 . . . 65 °C )
  • Диапазон измерения температуры: от -40 до 85 °C ( ±0.5 °C)
  • Диапазон измерения влажности: 0 — 100 % (20…80 %, 25 °C, ± 3%) в BMP280 отсутствует!
  • Напряжение питания 3.3 В. Но в готовом модуле из Китая уже стоит стабилизатор и согласование уровней логики.
  • Пиковое потребление 714 µA, в режиме сна 0.3 µA
  • Время старта модуля: 2 ms

Датчик имеет три режима работы : Sleep mode, Forced mode, Normal mode.

  • SLEEP – режим сна,
  • FORCED – режим аналогичен BMP085 и BMP180. То есть, дали команду на измерение, подождали, считали значения, датчик перешел в спящий режим.
  • NORMAL – этот режим наиболее интересен и загоняет датчик в циклическую работу. То есть, он самостоятельно через определенное время, которое можно задать, выходит из режима сна и выполняет измерения, сохраняет данные в регистры памяти и вновь засыпает на указанное время.

Более подробно все это написано в Datasheet(BMP280) и Datasheet(BME280).

Подключение, библиотека, код.

Мне совершенно не хочется разбираться во всех тонкостях работы с этим датчиком. По этому скачаем уже готовую библиотеку ( Adafruit_BMP280_Library ) GitHub или с нашего сайта и BME280 c GitHub , наш сайта.

Подключение к шине I2C (SCL и SDA контакты).

Схема подключения достаточно проста:

  • VIN к контакту Arduino 3.3V или 5V
  • GND к контакту Arduino GND
  • SCK к контакту Arduino Nano SCL (A5)
  • SDA к контакту Arduino Nano SDA (A4)

Тестовый скетч для BMP280 будет выглядеть так:

#include <Wire.h> #include <Adafruit_BMP280.h> #define BMP_SCK (13) #define BMP_MISO (12) #define BMP_MOSI (11) #define BMP_CS (10) Adafruit_BMP280 bmp; // I2C void setup() { Serial.begin(9600); Serial.println(F(«BMP280 test»)); if (!bmp.begin()) { Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»)); while (1); } /* Настройки по умолчанию */++ bmp.setSampling(Adafruit_BMP280::MODE_NORMAL, /* Режим работы */ Adafruit_BMP280::SAMPLING_X2, /* Температура передискретизация */ Adafruit_BMP280::SAMPLING_X16, /* Давление передискретизация */ Adafruit_BMP280::FILTER_X16, /* Фильрация. */ Adafruit_BMP280::STANDBY_MS_500); /* Интервал включения. */ } void loop() { Serial.print(F(«Temperature = «)); Serial.print(bmp.readTemperature()); Serial.println(» *C»); Serial.print(F(«Pressure = «)); Serial.print(bmp.readPressure()); Serial.println(» Pa»); Serial.print(F(«Приблизительная высота= «)); Serial.print(bmp.readAltitude(1013.25)); /* Adjusted to local forecast! */ Serial.println(» m»); Serial.println(); delay(2000); }

Возможные параметры :

/** Частота передискретизации датчика. */ /** No over-sampling. */ SAMPLING_NONE /** 1x over-sampling. */ SAMPLING_X1 /** 2x over-sampling. */ SAMPLING_X2 /** 4x over-sampling. */ SAMPLING_X4 /** 8x over-sampling. */ SAMPLING_X8 /** 16x over-sampling. */ SAMPLING_X16 /** Режимы работы */ /** Sleep mode. */ MODE_SLEEP /** Forced mode. */ MODE_FORCED /** Normal mode. */ MODE_NORMAL /** Software reset. */ MODE_SOFT_RESET_CODE /** Уровень фильтрации данных датчиков. */ /** No filtering. */ FILTER_OFF /** 2x filtering. */ FILTER_X2 /** 4x filtering. */ FILTER_X4 /** 8x filtering. */ FILTER_X8 /** 16x filtering. */ FILTER_X16 /** Продолжительность ожидания в ms */ /** 1 ms standby. */ STANDBY_MS_1 /** 63 ms standby. */ STANDBY_MS_63 /** 125 ms standby. */ STANDBY_MS_125 /** 250 ms standby. */ STANDBY_MS_250 /** 500 ms standby. */ STANDBY_MS_500 /** 1000 ms standby. */ STANDBY_MS_1000 /** 2000 ms standby. */ STANDBY_MS_2000 /** 4000 ms standby. */ STANDBY_MS_4000 /Максимальная задержка по datasheep

Для BME280 тестовый скетч будет таким :

#include <BME280I2C.h> #include <Wire.h> #define SERIAL_BAUD 115200 BME280I2C bme; // Default : forced mode, standby time = 1000 ms // передискретизация = pressure Г—1, temperature Г—1, humidity Г—1, filter off, //Для примера настройки датчика не по дефолту BME280I2C::Settings settings( BME280::OSR_X1, BME280::OSR_X1, BME280::OSR_X1, BME280::Mode_Forced, BME280::StandbyTime_1000ms, BME280::Filter_Off, BME280::SpiEnable_False, BME280I2C::I2CAddr_0x76 // I2C address. I2C specific. ); BME280I2C bme(settings); Возможные параметры

  • OSR_Off
  • OSR_X1
  • OSR_X2
  • OSR_X4
  • OSR_X8
  • OSR_X16
  • Mode_Sleep
  • Mode_Forced
  • Mode_Normal
  • Filter_Off
  • Filter_1
  • Filter_2
  • Filter_4
  • Filter_8
  • Filter_16

// void setup() { Serial.begin(SERIAL_BAUD); while(!Serial) {} // Wait Wire.begin(); while(!bme.begin()) { Serial.println(«Could not find BME280 sensor!»); delay(1000); } switch(bme.chipModel()) { case BME280::ChipModel_BME280: Serial.println(«Found BME280 sensor! Success.»); break; case BME280::ChipModel_BMP280: Serial.println(«Found BMP280 sensor! No Humidity available.»); break; default: Serial.println(«Found UNKNOWN sensor! Error!»); } } ////////////////////////////////////////////////////////////////// void loop() { printBME280Data(&Serial); delay(500); } ////////////////////////////////////////////////////////////////// void printBME280Data { float temp(NAN), hum(NAN), pres(NAN); BME280::TempUnit tempUnit(BME280::TempUnit_Celsius); BME280::PresUnit presUnit(BME280::PresUnit_Pa); // PresUnit_Pa PresUnit_hPa PresUnit_inHg PresUnit_atm PresUnit_bar PresUnit_torr PresUnit_psi // bme.read(pres, temp, hum, tempUnit, presUnit); print(«Temp: «); print(temp); print(«В°»+ String(tempUnit == BME280::TempUnit_Celsius ? ‘C’ :’F’)); print(«\t\tHumidity: «); print(hum); print(«% RH»); print(«\t\tPressure: «); print(pres); println(«Pa»); delay(1000); }

admin

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Наверх