Связываем arduino с датчиком расхода жидкости

Подключение 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 Жёлтый

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

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

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

1
2
3
4

if(!bmp.begin()){

Serial.println(«Could not find a valid BMP280 sensor, check wiring!»);

while(1);

}

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

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

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

1
2

bmp.readTemperature();// Температура в градусах Цельсия.

bmp.readPressure();// Атмосферное давление в гПа

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

#include <Adafruit_BMP280.h>

Adafruit_BMP280 bmp280;

void setup() {
Serial.begin(9600);
Serial.println(F(«BMP280»));

while (!bmp280.begin(BMP280_ADDRESS — 1)) {
Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));
delay(2000);
}
}

void loop() {
float temperature = bmp280.readTemperature();
float pressure = bmp280.readPressure();
float altitude = bmp280.readAltitude(1013.25);

Serial.print(F(«Temperature = «));
Serial.print(temperature);
Serial.println(» *C»);

Serial.print(F(«Pressure = «));
Serial.print(pressure);
Serial.println(» Pa»);

Serial.print(F(«Altitude = «));
Serial.print(altitude);
Serial.println(» m»);

Serial.println();
delay(2000);
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34

#include <Adafruit_BMP280.h>
 

Adafruit_BMP280bmp280;

voidsetup(){

Serial.begin(9600);

Serial.println(F(«BMP280»));

while(!bmp280.begin(BMP280_ADDRESS-1)){

Serial.println(F(«Could not find a valid BMP280 sensor, check wiring!»));

delay(2000);

}

}
 

voidloop(){

floattemperature=bmp280.readTemperature();

floatpressure=bmp280.readPressure();

floataltitude=bmp280.readAltitude(1013.25);

Serial.print(F(«Temperature = «));

Serial.print(temperature);

Serial.println(» *C»);

Serial.print(F(«Pressure = «));

Serial.print(pressure);

Serial.println(» Pa»);

Serial.print(F(«Altitude = «));

Serial.print(altitude);

Serial.println(» m»);

Serial.println();

delay(2000);

}

Результат

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

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

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

Как подключить модуль ВМР 280 к датчику давления Arduino

Чтобы подключить модуль к Ардуино, используют интерфейс. Это может быть SPI или I2C. Выбор конкретного зависит от проекта, над которым ведется работа и его специфики, а так же возможности самого микроконтроллера. Аппаратный интерфейс у датчика Arduino размещен на двух пинах: A4 и A5. Поэтому при таком режиме, для подключения используют 4 провода. 2 необходимы для обеспечения питания модуля и еще 2 применяют в качестве информационной шины. При работе интерфейса SPI потребуется использовать дополнительные 2 провода.


Подключение BMP280 к АрдуиноИсточник voltiq.ru

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

Схемы подключения датчика давления жидкости

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

Элемент Наименование/характеристики Количество
Микроконтроллер Arduino Nano/Uno или любой клон 1
Экран Display 2×16 ST7032 1
Датчик MS5803 1
Резистор 10 кОм 2
Конденсатор 0.1 мкФ 1
Кнопка Любая, без фиксации нажатия 1

Библиотека работы с датчиком давления берется здесь: https://github.com/millerlp/MS5803_05

С экраном тут: https://yadi.sk/d/KKJwJ1VtDx9PCw

Принципиальная схема

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

Скетч

Достаточно простая программа для микроконтроллера, заливаемая в него при помощи Arduino IDE:

#DEFINE fButton_pin 2 #DEFINE LED_pin 13 #DEFINE DISPLAY_height 2 #DEFINE DISPLAY_width 16 #DEFINE DISPLAY_contrast 63 // Подключение библиотек и инициализация датчика вместе с дисплеем #include #include // Wire.h подключать не нужно он уже вызван в TroykaTextLCD.h MS_5803 S = MS_5803(512); TroykaTextLCD DISPLAY; // переменные программы float mmWater = 0; float TechAtmosphere = 0; float dObtainedValue = 0; float ObtainedValue = 0; void setup() // параметры экрана DISPLAY.setContrast(DISPLAY_contrast); DISPLAY.begin(DISPLAY_width, DISPLAY_height); // Установка датчика в 0, FALSE функции блокирует отправку технической информации в консоль S.initializeMS_5803(FALSE); delay(1000); // ждем, пока он выполнит инициализацию // кнопка и светодиод показывающий режимы pinMode(fButton_pin, INPUT_PULLUP); pinMode(LED_pin, OUTPUT); > void loop() // Инициировать сенсор в режим взятия показаний S.readSensor(); DISPLAY.setCursor(0, 0); // получить и высветить значения в верхней строчке экрана ObtainedValue = S.pressure(); DISPLAY.print(ObtainedValue); DISPLAY.print(«mbar «); DISPLAY.print(S.temperature()); DISPLAY.print(«C»); // действия при нажатии кнопки if (!digitalRead(fButton_pin)) // Изменение режима работы светодиода на противоположный digitalWrite(LED_pin, !digitalRead(LED_pin)); dObtainedValue = ObtainedValue; > if (!digitalRead(LED_pin)) // абсолютные значения mmWater = ObtainedValue * 1.019744288922 * 10; TechAtmosphere = ObtainedValue * 0.001019716212978; > else // относительные значения mmWater = ((ObtainedValue — dObtainedValue) * 1.019744288922) * 10; TechAtmosphere = (ObtainedValue — dObtainedValue) * 0.001019716212978; > // отображаем на экране значения в технических атмосферах и см воды DISPLAY.setCursor(0, 1); DISPLAY.print(TechAtmosphere,3); DISPLAY.print(«TA «); DISPLAY.print(mmWater,0); DISPLAY.print(«mm»); delay(1000); DISPLAY.clear(); >

Измерение давления при помощи Arduino и датчика SPD005G

В данной статье будем измерять давление при помощи Arduino и датчика давления SPD005G.

Для измерения атмосферного давления используются датчики давления. В данной статье описан датчик давления SPD005G от Smartec. SPD означает Smart Pressure Device . Эти датчики собраны на основе кремния и пригодны как использования как в промышленности так и для использования в быту. Датчик представляет собой пластиковый корпус с специальным отверстием для измерения атмосферного давления.

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

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

В проекте используется символьный LCD дисплей. Про подключение дисплея к Arduino было сказано ранее.

Обзор

Резистивный датчик давления представляет из себя переменный резистор, сопротивление которого зависит от силы, приложенной к чувствительному элементу. Таким образом можно косвенно оценить силу нажатия или вес воздействующего на датчик объекта. Благодаря своей простоте, стойкости к износу и невысокой стоимости, резистивные датчики широко используются в различных проектах совместно с платформами Arduino. На сегодняшний день выпускается множество модификаций датчиков, работающих на подобном принципе. Они могут отличаться размером, формой, иметь разный диапазон и кривую изменения сопротивления, но алгоритм работы у всех одинаковый. На рисунке №1 показан один из наиболее распространённых видов датчиков, выпускаемых фирмой Sparkfun.

Рисунок №1 — Резистивный датчик давления для Arduino от Sparkfun

В данном исполнении радиус чувствительного элемента составляет 15мм, а плоская эластичная форма даёт возможность фиксировать сенсор практически на любой поверхности, например: на стенах; под различными механизмами в квест-комнатах; внутри мягких игрушек и ковриков; под одеждой и т.п.

Конструктивно датчик состоит из двух слоёв, разделённых между собой изоляционной прокладкой специальной формы. Верхний слой представляет из себя плёнку со встречно напечатанными проводниками. Это и есть тот самый чувствительный элемент, на который необходимо воздействовать путём нажатия. Нижний слой выполнен в виде подложки с печатным полупроводником. Следовательно, чем больше будет оказываться давление на чувствительный элемент, тем больший процент печатных проводников начнёт взаимодействовать с полупроводниковой подложкой. Всё это приведёт к последовательному уменьшению сопротивления резистивного датчика. На рисунке №2 показана структура сенсора с разделением на слои.

Рисунок №2 – Структурная схема с разделением на слои

Основным недостатком резистивных датчиков давления является их невысокая точность и нелинейность смены сопротивления. Это говорит о том, что применять подобные устройства для измерения точных величин не имеет никакого смысла. Однако, оценить сам факт нажатия или степень давления на сенсор вполне возможно. На рисунке №3 приведён график, взятый из технической документации. Он наглядно позволяет оценить нелинейную зависимость изменения сопротивления от силы нажатия на чувствительный элемент датчика.

Рисунок №3 – график зависимости сопротивления от силы нажатия

Как следует из графика, с увеличением давления, сопротивление начинает резко уменьшаться, но это процесс в каждой фазе происходит по-разному.

Как подключить датчик давления к Ардуино

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

Расширение функционала стало доступным за счет широкого использования микроконтроллеров. В своей основе — они представляют собой миниатюрные компьютеры, ориентированные на управление внешними устройствами в рамках своей программы и происходящих вокруг факторов. Информацию о последних логический модуль получает за счет специализированных датчиков.

Существует не так много моделей микроконтроллеров, служащих базой «умной» техники. Среди них определенной популярностью пользуется Arduino, в качестве достаточно универсальной основы создания интеллектуального оборудования. Своей известности микроконтроллер обязан не только быстродействием или удобством подключения внешних компонентов, но и широтой их моделей, представленной на рынке. Среди последних, богатый выбор сенсоров, устройств индикации, средств интерфейса и получения команд, сетевых и коммуникационных плат, а также управляющих внешней аппаратурой узлов.

Собственно, чувствительные элементы платформы и будут рассмотрены в теле статьи, а конкретно один из них — датчик давления Ардуино.

Датчик уровня жидкости (Water Sensor Arduino)

Рабочее напряжение аналогового сенсора — 5v. Выходное напряжение (показания датчика) зависит от степени погружения датчика в жидкость и от параметров, влияющих на коэффициент передачи напряжения, например, проводимость жидкости. Это простой в использование и недорогой датчик уровня жидкости, который широко применяется в системах автоматизации и при разработке Умного дома.

Подключение к Ардуино датчика воды (Water Sensor)

Как вы уже заметили на фото к этому занятию, датчик уровня жидкости имеет три контакта. Правый контакт (-) подключается к Земле (GND), средний к питанию 5v, а левый к аналоговому входу, например, A0. При полностью сухом датчике выходное напряжение и показания на аналоговом входе будут равны нулю, чем больше датчик будет погружен в воду, тем больше будут его показания (от 0 до 1023).

Что измеряет сенсор

Давление — некая физическая величина численно равная перпендикулярно направленной силе действующей на единицу площади поверхности. Сам датчик можно представить своеобразными очень чувствительными весами. Последнее замечание сделано по причине того, что и вода, и газы тоже имеют свою массу, которая влияет на поверхность под ними. На практике, за счет указанного фактора, можно определить глубину погружения (чем ниже, тем больше вес слоя воды) или высоту подъема в атмосферу (чем выше — тем меньше плотность, а значит и слабее воздействие). Кроме того, в отношении давления воздуха не стоит забывать о погодных колебаниях. Резкое падение названой характеристики атмосферы — к дождю или буре.

Опять же, насчет газов и частично жидкостей. Их можно сжимать. Но, уплотненные вещества будут стремиться вернуться в первоначальное состояние. И чем сильнее компрессия, тем мощнее будет конечное давление газа или жидкости внутри сосуда их содержащего.

Собственно, детектор Ардуино о котором идет речь, и измеряет силу воздействия на единицу площади сенсорного элемента прибора. Правда, в большинстве выпускаемых моделей, описанное — не все их функциональные возможности. Бонусом, у многих идет замер температуры окружающей среды, а у некоторых еще и влажности или ускорения.

Исходный код программы (скетча)

Arduino

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: hobbytronics.co.uk
*/
volatile int flow_frequency; // с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды
// Calculated litres/hour
float vol = 0.0,l_minute;
unsigned char flowsensor = 2; // Sensor Input
unsigned long currentTime;
unsigned long cloopTime;
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 9);
void flow () // функция обработки прерывания
{
flow_frequency++;
}
void setup()
{
pinMode(flowsensor, INPUT);
digitalWrite(flowsensor, HIGH); // Optional Internal Pull-Up
Serial.begin(9600);
lcd.begin(16, 2);
attachInterrupt(digitalPinToInterrupt(flowsensor), flow, RISING); // Setup Interrupt
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Water Flow Meter»);
lcd.setCursor(0,1);
lcd.print(«Circuit Digest»);
currentTime = millis();
cloopTime = currentTime;
}
void loop ()
{
currentTime = millis();
// каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту
if(currentTime >= (cloopTime + 1000))
{
cloopTime = currentTime; // Updates cloopTime
if(flow_frequency != 0){
// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.
l_minute = (flow_frequency / 7.5); // (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Rate: «);
lcd.print(l_minute);
lcd.print(» L/M»);
l_minute = l_minute/60;
lcd.setCursor(0,1);
vol = vol +l_minute;
lcd.print(«Vol:»);
lcd.print(vol);
lcd.print(» L»);
flow_frequency = 0; // сбрасываем счетчик
Serial.print(l_minute, DEC); // Print litres/hour
Serial.println(» L/Sec»);
}
else {
Serial.println(» flow rate = 0 «);
lcd.clear();
lcd.setCursor(0,0);
lcd.print(«Rate: «);
lcd.print( flow_frequency );
lcd.print(» L/M»);
lcd.setCursor(0,1);
lcd.print(«Vol:»);
lcd.print(vol);
lcd.print(» L»);
}
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71

/*
YF‐ S201 Water Flow Sensor
Water Flow Sensor output processed to read in litres/hour
Adaptation Courtesy: hobbytronics.co.uk
*/

volatileintflow_frequency;// с помощью этой переменной мы будем подсчитывать импульсы от датчика расходы воды

// Calculated litres/hour

floatvol=0.0,l_minute;

unsignedcharflowsensor=2;// Sensor Input

unsignedlongcurrentTime;

unsignedlongcloopTime;

#include <LiquidCrystal.h>

LiquidCrystallcd(12,11,5,4,3,9);

voidflow()// функция обработки прерывания

{

flow_frequency++;

}

voidsetup()

{

pinMode(flowsensor,INPUT);

digitalWrite(flowsensor,HIGH);// Optional Internal Pull-Up

Serial.begin(9600);

lcd.begin(16,2);

attachInterrupt(digitalPinToInterrupt(flowsensor),flow,RISING);// Setup Interrupt

lcd.clear();

lcd.setCursor(,);

lcd.print(«Water Flow Meter»);

lcd.setCursor(,1);

lcd.print(«Circuit Digest»);

currentTime=millis();

cloopTime=currentTime;

}

voidloop()

{

currentTime=millis();

// каждую секунду рассчитываем и выводим на экран ЖК дисплея скорость потока воды в литрах в минуту

if(currentTime>=(cloopTime+1000))

{

cloopTime=currentTime;// Updates cloopTime

if(flow_frequency!=){

// Pulse frequency (Hz) = 7.5Q, Q is flow rate in L/min.

l_minute=(flow_frequency7.5);// (Pulse frequency x 60 min) / 7.5Q = flowrate in L/hour

lcd.clear();

lcd.setCursor(,);

lcd.print(«Rate: «);

lcd.print(l_minute);

lcd.print(» L/M»);

l_minute=l_minute60;

lcd.setCursor(,1);

vol=vol+l_minute;

lcd.print(«Vol:»);

lcd.print(vol);

lcd.print(» L»);

flow_frequency=;// сбрасываем счетчик

Serial.print(l_minute,DEC);// Print litres/hour

Serial.println(» L/Sec»);

}

else{

Serial.println(» flow rate = 0 «);

lcd.clear();

lcd.setCursor(,);

lcd.print(«Rate: «);

lcd.print(flow_frequency);

lcd.print(» L/M»);

lcd.setCursor(,1);

lcd.print(«Vol:»);

lcd.print(vol);

lcd.print(» L»);

}

}

}

Представленные на рынке модели

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

Наименование Питание (V) Точность Разрешение
(hPa)
Диапазон (hPa) Рабочая температура
(°C)
Интерфейсы Примечание
SPI I2C UEXT
Атмосферные
MOD-BMP085 1.8–3.6 0.03 hPa 0.01 300–1100 (от 500 м ниже уровня моря до 9 км. высоты –40..+85 + + Измерение температуры
GY-BMP280 3.3 0.12 hPa 0.0016 300–1100 –40..+85 + + Измерение температуры до +65, с точностью 0.01
MD-PS002 5V ±0.2% –100–+150 –40..+125 + Только не агрессивные среды
Жидкостные
MS5803-02BA 1.8–3.6 20 см жидкости 30–1100
(10–2000)
–40..+85 + +
MS5803-07BA 1.8–3.6 0–7 мбар
(70 м погружения)
–20..+85 + +
Open-Smart 5V G1/4 0-1.2 MPa Hydraulic Pressure Sensor for Non-Corrosive Water 5 1.5 % 1–2.4 мбар (max 3) 0..+85 Собственный коннектор, соединяемый к I2C через резистор, датчик оснащен термометром

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

Разбор кода для BME680

Библиотеки

Код начинается с подключения необходимых библиотек: для использования I2C, SPI, Adafruit_Sensor. а также Adafruit_BME680.

#include <Wire.h>
#include <SPI.h>
#include <Adafruit_Sensor.h>
#include "Adafruit_BME680.h"

Соединение по SPI

Обычно мы предпочитаем использовать протокол связи I2C. Однако код адаптирован и для использования SPI. Вам просто нужно раскомментировать следующие строки кода, которые определяют контакты SPI:

/*#define BME_SCK 13
#define BME_MISO 12
#define BME_MOSI 11
#define BME_CS 10*/

Давление над уровнем моря

Создаем переменную SEALEVELPRESSURE_HPA:

#define SEALEVELPRESSURE_HPA (1013.25)

Эта переменная сохраняет давление над уровне моря в гектопаскале (эквивалент милибару). Эта переменная используется для оценки высоты для данного давления путем сравнения его с давлением на уровне моря.

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

Соединение по I2C

В этом примере по умолчанию используется шина I2C.

Следующая строка создает объект Adafruit_BME680 с именем bme на выводах Ардуино I2C: D5 (SCL), D4 (SDA):

Adafruit_BME680 bme; // I2C

Чтобы использовать SPI, вам нужно прокомментировать эту строку и раскомментировать следующую строку:

//Adafruit_BME680 bme(BME_CS, BME_MOSI, BME_MISO, BME_SCK); // software SPI

Функция setup()

В функции setup() мы запускаем последовательный порт:

Serial.begin(115200);

Инициализируем датчик BME680:

if (!bme.begin()) {
Serial.println(F("Could not find a valid BME680 sensor, check wiring!"));
while (1);
}

Устанавливаем параметры датчика BME680:

// Set up oversampling and filter initialization
bme.setTemperatureOversampling(BME680_OS_8X);
bme.setHumidityOversampling(BME680_OS_2X);
bme.setPressureOversampling(BME680_OS_4X);
bme.setIIRFilterSize(BME680_FILTER_SIZE_3);
bme.setGasHeater(320, 150); // 320*C for 150 ms

Эти методы могут принимать один из следующих параметров (разрешение):

  • BME680_OS_NONE: выключить чтение;
  • BME680_OS_1X
  • BME680_OS_2X
  • BME680_OS_4X
  • BME680_OS_8X
  • BME680_OS_16X

Датчик BME680 имеет встроенный IIR фильтр для уменьшения кратковременных изменений выходных значений датчика, вызванных внешними помехами. ВsetIIRFilterSize() устанавливает IIR фильтр. Он принимает размер фильтра в качестве параметра:

  • BME680_FILTER_SIZE_0 (no filtering)
  • BME680_FILTER_SIZE_1
  • BME680_FILTER_SIZE_3
  • BME680_FILTER_SIZE_7
  • BME680_FILTER_SIZE_15
  • BME680_FILTER_SIZE_31
  • BME680_FILTER_SIZE_63
  • BME680_FILTER_SIZE_127

В датчик газа имеет нагреватель. Установите параметр нагревателя с помощью метода setGasHeater(), который принимает в качестве аргументов:

  • температура нагревателя (в градусах Цельсия)
  • время работы нагревателя (в миллисекундах)

Мы будем использовать настройки по умолчанию: 320 ºC в течение 150 мс.

Функция loop()

В функции  loop() мы получаем данные от датчика BME680.

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

// Tell BME680 to begin measurement.
unsigned long endTime = bme.beginReading();
if (endTime == 0) {
Serial.println(F("Failed to begin reading :("));
return;
}
Serial.print(F("Reading started at "));
Serial.print(millis());
Serial.print(F(" and will finish at "));
Serial.println(endTime);

Затем вызываем метод endReading() для завершения асинхронного чтения.

if (!bme.endReading()) {
Serial.println(F("Failed to complete reading :("));
return;
}

После этого мы получим следующие показания:

  • bme.temperature: возвращает показания температуры
  • bme.pressure: возвращает показания давления
  • bme.humidity: возвращает показания влажности
  • bme.gas_resistance: возвращает сопротивление по газу
Serial.print(F("Temperature = "));
Serial.print(bme.temperature);
Serial.println(F(" *C"));

Serial.print(F("Pressure = "));
Serial.print(bme.pressure / 100.0);
Serial.println(F(" hPa"));

Serial.print(F("Humidity = "));
Serial.print(bme.humidity);
Serial.println(F(" %"));

Serial.print(F("Gas = "));
Serial.print(bme.gas_resistance / 1000.0);
Serial.println(F(" KOhms"));

Serial.print(F("Approx. Altitude = "));
Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA));
Serial.println(F(" m"));

Часто используемые датчики

Кроме ВМР 280 есть и другие датчики. Широкое распространение получили ВМР 180 и bme280.

Основные характеристики ВМР 180:

  • время срабатывания устройства составляет 4,5 мс;
  • способность измерять уровень атмосферного давления в пределах от 225 до 825 мм ртутного столбца;
  • поддержка интерфейса I2C;
  • значение напряжения питания составляет от 3,3 до 5 В.


Датчик ВМР 180 для АрдуиноИсточник aliexpress.ru

Этот датчик включает 3 разных устройства, способных помимо атмосферного давления, еще определять другие показатели, среди которых температура и влажность окружающего воздуха. Он отличается повышенной надежностью, незначительным потреблением тока (0,5 мА) и стабильной длительной работой.

ВМЕ280 отличается такими характеристиками:

  • в режиме ожидания величина потребления тока составляет 0,1 мкА;
  • уровень напряжения в пределах от 1,7 до 3,6В;
  • устройство помещено в корпус из металла с восемью выходами;
  • датчик поддерживает несколько интерфейсов, среди которых SPI и I2C.


Датчик bme280 для АрдуиноИсточник 3d-diy.ru

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

Зачем все это необходимо

Упомянутая связка позволяет создать на основе микроконтроллера систему определяющую давление или вес на поверхности чувствительного элемента. Практическое применение аналогичная конструкция имеет на птичниках, когда происходит поштучное взвешивание проходящих живых куриц или уток. Для процедуры в Агро секторе предусмотрен узкий коридор движения особей с датчиком прохождения единицы и платформой определения массы. Кроме названой ниши, точность устройства вполне позволяет его использовать в торговле, связывая разработанные на основе тензометрических сенсоров весы с кассовым аппаратом или компьютером-посредником, ведущим бухгалтерию.

Пригодится аппарат и пасечникам — объединив весы с передатчиком Bluetooth или GSM-модемом можно контролировать «налет» веса пчел в различные периоды года. Достаточно знать чистую массу улья. Все что выше, как раз и будет воск, пчелы и мед.

Оцените статью
Рейтинг автора
5
Материал подготовил
Илья Коршунов
Наш эксперт
Написано статей
134
Добавить комментарий