Датчик температуры и давления BMP280




Постановка задачи

 

Для чего нужна метеостанция?В современном мире с высоким уровнем развития цифровых технологий мы можем получать информацию о погоде различными способами. Прогноз погоды передают по телевидению и радио, аналогичную информацию Вам предлагают различные сайты в сети Интернет или рассылка по электронной почте.

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

Бытовые метеостанции позволяют получать точные показания о температуре и влажности в помещении и за окном (как правило, только цифровые метеостанции), измерять атмосферное давление, анализировать динамику изменения атмосферного давления, на основании которого самостоятельно делать прогноз погоды на 6-36 часов (только цифровые).

 

Описание компонентов

 

Всё комплектующие необходимое для реализации метеостанции представлено в таблице 1.

 

Таблица 1 – Необходимые компоненты

Название Количество Вид
Arduino Nano  
Датчик температуры и давления BMP280  
Часы DS3231  
Датчик широкого спектра газов MQ-2  
Провода типа мама-мама В зависимости от количества
Макетная плата  
Дисплей 1602А с I2C  

 

 

Arduino Nano

 

Платформа Nano, построенная на микроконтроллере ATmega328 (ArduinoNano 3.0) или ATmega168 (ArduinoNano 2.x), имеет небольшие размеры и может использоваться в лабораторных работах. Она имеет схожую с ArduinoDuemilanove функциональность, однако отличается сборкой. Отличие заключается в отсутствии силового разъема постоянного тока и работе через кабель Mini-BUSB. Nano разработана и продаётсякомпаниейGravitech.

Краткие характеристики платформы представлены в таблице 2.

 

Таблица 2.

Микроконтроллер Atmel ATmega168 или ATmega328
Рабочее напряжение (логическая уровень) 5 В
Входное напряжение (рекомендуемое) 7-12 В
Входное напряжение (предельное) 6-20 В
Цифровые Входы/Выходы 14 (6 из которых могут использоваться как выходы ШИМ)
Аналоговые входы  
Постоянный ток через вход/выход 40 мА
Флеш-память 16 Кб (ATmega168) или 32 Кб (ATmega328) при этом 2 Кб используются для загрузчика
ОЗУ 1 Кб (ATmega168) или 2 Кб (ATmega328)
EEPROM 512 байт (ATmega168) или 1 Кб (ATmega328)
Тактовая частота 16 МГц
Размеры 1.85 см x 4.2 см

 

Arduino Nano может получать питание через подключение Mini-B USB, или от нерегулируемого 6-20 В (вывод 30), или регулируемого 5 В (вывод 27), внешнего источника питания. Автоматически выбирается источник с самым высоким напряжением.

Микросхема FTDI FT232RL получает питание, только если сама платформа запитана от USB. Таким образом при работе от внешнего источника (не USB), будет отсутствовать напряжение 3.3 В, генерируемое микросхемой FTDI, при этом светодиоды RX и TX мигаю только при наличии сигнала высокого уровня на выводах 0 и 1.

 

Датчик температуры и давления BMP280

 

BMP280 – это цифровой модуль на базе чипа BMP280, подключаемый по шине I2C (адрес 0x77), позволяющий получить текущие значения атмосферного давления и температуры окружающей среды. Еще одним применением данного модуля является определений высоты, которая зависит от давления и рассчитывается по международной барометрической формуле. Точность Trema барометра позволяет фиксировать изменение высоты от 20 см.

Спецификация BMP280:

- напряжение питания модуля: 3,3 или 5 В постоянного тока (поддерживаются оба уровня);

- потребляемый ток: до 2 мА во время измерений (зависит от режима точности);

- потребляемый ток: до 0,2 мА в режиме ожидания.

- измеряемое давление: от 30'000 до 110'000 Па (разрешение 0,16 Па);

- измеряемая температура: от 0 до +65 °C (разрешение 0,01°C);

- рабочая частота шины I2C: до 3,4 МГц;

- адрес модуля на шине I2C: 0x77;

- уровень логической «1» на шине I2C: от 0,7*Vcc до Vcc (где Vcc это напряжение питания модуля)

- подготовка к первому запуску после подачи питания: не менее 2 мс;

- рабочая температура: -40 … +85 °C;

- габариты: 30x30 мм.

Модуль подключается к аппаратной или программной шине I2C Arduino. Логические уровни шины I2C не должны превышать напряжение питания.

 

Часы DS3231

 

RTC DS3231 часы специально спроектированы для подключения к контроллеру RaspberryPi, но они так же легко подключаются и работают с Ардуино. В RTC модуле можно настроить два будильника. Питание модуля DS3231, может находиться в пределах 2,5В - 5,5В. Напряжение внешнего источника питания постоянно отслеживается микросхемой DS3231 и при падении ниже 2,5В, часы переходят на питание от встроенной батареи.

Точность часов осуществляется при помощи датчика отслеживания температуры микросхемы. В чипе встроена функция корректировки частоты генератора и она изменяется в зависимости от температуры микросхемы. Часы можно настраивать и управлять при помощи контроллера, посредством интерфейса I2C. Для подключения DS3231 к Ардуино используйте следующую распиновку. В отличие от предыдущей модели часов DS1307, эти часы имеют более точный ход, потому что содержат встроенный кварцевый резонатор.

Характеристики DS3231, представлены в таблице 3.

 

Таблица 3.

Микросхема DS3231SN
Точность ±2 ppm
Температурный диапазон -40°C.. +85°C
Будильник  
Интерфейс I2C 400 кГц
Питание 2,5В - 5,5В
Регистр коррекции да
Низкое потребление тока 3 мкА
Автономное питание встроенная батарея
Размер 14 x 14 x 13 мм

 

 

MQ-2

 

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

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

В газоанализатор встроен нагревательный элемент, который необходим для химической реакции. Поэтому во время работы сенсор будет горячим, это нормально. Для получения стабильных показаний новый сенсор необходимо один раз прогреть (оставить включённым) в течение 24 часов. После этого стабилизация после включения будет занимать около минуты.

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

Диапазон измерений:

- пропан: 0,2 – 5 промилле;

- бутан: 0,3 – 5 промилле;

- метан: 5 – 20 промилле;

- водород: 0,3 – 5 промилле;

- пары спиртов: 0,1 – 2 промилле.

 

Дисплей 1602A с I2C

 

Жидкокристаллический дисплей (LiquidCrystalDisplay) сокращенно LCD построен на технологии жидких кристаллов. При проектировании электронные устройства, нам нужно недорогое устройство для отображения информации и второй не менее важный фактор наличии готовых библиотек для Arduino. Из всех доступных LCD дисплеев на рынке, наиболее часто используемой является LCD 1602A, который может отображать ASCII символа в 2 строки (16 знаков в 1 строке) каждый символ в виде матрицы 5х7 пикселей. В этой статье рассмотрим основы подключения дисплея к Arduino.

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

- напряжение питания: 5 В;

- размер дисплея: 2.6 дюйма;

- тип дисплея: 2 строки по 16 символов;

- цвет подсветки: синий;

- цвет символов: белый;

- габаритные: 80мм x 35мм x 11мм.

LCD 1602A представляет собой электронный модуль основанный на драйвере HD44780 от Hitachi. LCD1602 имеет 16 контактов и может работать в 4-битном режиме (с использованием только 4 линии данных) или 8-битном режиме (с использованием всех 8 строк данных), так же можно использовать интерфейс I2C. В этой статье я расскажу о подключении в 4-битном режиме.

Интерфейс передачи данных – I2C (для дисплея, датчика давления/температуры и часов).

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

В положительную сторону отличается от UART более высокой скоростью стабильной передачи данных и более стабильной передачей данных на высокой скорости. Кроме того, благодаря своей архитектуре, позволяет подключать к одной шине, состоящей из двух проводов SDA (данные) и SCL (тактовые импульсы), до 127 устройств одновременно, не используя дополнительного оборудования, если не считать двух подтягивающих резисторов.

 

 

Рисунок 1 – Шина I2C

2 Реализация проекта

2.1 Разработка печатной платы

 

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

 

 

Рисунок 2 – Трафарет печатной платы

 

2.2 Реализация программного кода

 

Работа с кодом будет осуществляться в среде ArduinoIDE и для работы с экраном и датчиками добавим новые библиотеки:

#include<Wire.h>

#include<Adafruit_BMP280.h>

#include <LiquidCrystal_I2C.h>

#include <TroykaMQ.h>

#include <DS1307RTC.h>

#include <Time.h>

После чего подключим эти устройства и инициализируем их:

tmElements_tdatetime;

MQ2 mq2(A0); //подключеиедатчикагазов

LiquidCrystal_I2C lcd(0x27, 16, 2); //0x20 для протеуса, 0x27 для арудино

Adafruit_BMP280 bmp;

const char *monthName[12] = {"Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

Вывод показателей с датчика bmp280 осуществляется следующим образом:

void setup() {

if (getDate(__DATE__) &&getTime(__TIME__)) { RTC.write(datetime); }

lcd.init(); //инициализация дисплея и включение подсветки

lcd.backlight();

mq2.calibrate(); //настройка датчика широкого спектра газов

while(!bmp.begin(0x76)) { //проверка подключения датчика давления

lcd.print("bmp280 error");

delay(2000);}

}

Полный листинг программы представлен в приложении А.

 

2.3 Тестирование

 

Теперь же пришло время протестировать наше устройство, на рисунках 3-5.

 

 

Рисунок 3 – Показатели датчика mq-2

 

 

Рисунок 4 – Показатели датчика bmp280

 

 

Рисунок 5 – Показатели часов ds3231

 

 

3 Анализ продукта и сравнение с аналогами

 

Стоимость компонентов при покупке с aliexpress:

Arduino Nano – 180р;

Датчик температуры и давления BMP280–45р;

Часы DS3231– 139р

Датчик широкого спектра газов MQ-2–60р;

Провода типа мама-мама–30р;

Макетная плата– 73р;

Дисплей 1602А с I2C–187р

Итого: 654 р.

В местных магазинах стоимость компонентов в разы больше, например, тот же датчик температуры bmp280будет стоить 295р, что дороже более чем в 6 раз.

Сравнивая с аналогами можно с уверенностью сказать, что наш продукт гораздо выгоднее, так как самая популярная метеостанция, представленная на сайте магазина DNS, стоит 1499р, рисунок 6, при этом она даёт меньше полезной информации и не имеет возможности расширения своего функционала.

 

 

Рисунок 5 – Показатели часов ds3231

ЗАКЛЮЧЕНИЕ

 

 

В ходе работы над данным проекта нами были закреплены практические навыки составления схемы электрической. И теперь можно сказать, что

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

 

 

ПРИЛОЖЕНИЕ А

 

#include <Wire.h>

#include <Adafruit_BMP280.h>

#include <LiquidCrystal_I2C.h>

#include <TroykaMQ.h>

#include <DS1307RTC.h>

#include <Time.h>

tmElements_tdatetime;

MQ2 mq2(A0); //подключеиедатчикагазов

LiquidCrystal_I2C lcd(0x27, 16, 2); //0x20 для протеуса, 0x27 для арудино

Adafruit_BMP280 bmp;

const char *monthName[12] = {

"Jan", "Feb", "Mar", "Apr", "May", "Jun",

"Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};

void setup() {

if (getDate(__DATE__) &&getTime(__TIME__)) { //получениедатыкомпиляции

RTC.write(datetime);} //и запись в часы, тк дефолтная дата: 01.01.2000

lcd.init(); //инициализация дисплея и включение подсветки

lcd.backlight();

mq2.calibrate(); //настройка датчика широкого спектра газов

while(!bmp.begin(0x76)) { //проверка подключения датчика давления

lcd.print("bmp280 error");

delay(2000);}}

void loop() {

if (RTC.read(datetime)) { //чтениедатыивременикакпеременнойтипаtmElements_t

lcd.setCursor(0, 0);

lcd.print("Time: ");

lcd.print(datetime.Hour);

lcd.print(":");

lcd.print(datetime.Minute);

lcd.print(":");

lcd.print(datetime.Second);

lcd.print(" ");

lcd.setCursor(0, 1);

lcd.print("Date: ");

lcd.print(datetime.Day);

lcd.print(".");

lcd.print(datetime.Month);

lcd.print(".");

lcd.print(tmYearToCalendar(datetime.Year));}

else {lcd.print("time error");}

delay(6000); //задержка на 6 секунд, очищение дисплея и затем вывод показателей

lcd.clear();

lcd.setCursor(0, 0);

lcd.print("P: ");

lcd.print(bmp.readPressure() / 133.322); //значение в миллиметрах ртутного столба.

lcd.print(" mm Hg");

lcd.setCursor(0, 1);

lcd.print("T: ");

float tByBmp = bmp.readTemperature();

lcd.print(tByBmp);

lcd.print(" C");

delay(6000); //вновь задержка и очищение дисплея

lcd.clear();

if(!mq2.isCalibrated() && mq2.heatingCompleted()) { //проверка калибаровки и завершение нагрева датчика газов

mq2.calibrate();}

delay(100); // если прошёл интервал нагрева датчика и калибровка была совершена

lcd.setCursor(0, 0);

lcd.print("Ratio: "); // выводим отношения текущего сопротивление датчика

lcd.print(mq2.readRatio()); // к сопротивлению датчика в чистом воздухе (Rs/Ro)

lcd.setCursor(0, 1);

lcd.print("Methane: ");

lcd.print(mq2.readMethane()); //выводим значения газов в ppm

lcd.println(" ppm ");

delay(6000);

lcd.clear();}

boolgetTime(constchar *str) { //парсимвремякомпиляциипроектаизаписываемвпеременнуютипаtmElements_t

int Hour, Min, Sec;

if (sscanf(str, "%d:%d:%d", &Hour, &Min, &Sec)!= 3) return false;

datetime.Hour = Hour;

datetime.Minute = Min;

datetime.Second = Sec;

return true;}

boolgetDate(constchar *str) { //парсимдатукомпиляциипроектаизаписываемвпеременнуютипаtmElements_t

char Month[12];

int Day, Year;

uint8_t monthIndex;

if (sscanf(str, "%s %d %d", Month, &Day, &Year)!= 3) return false;

for (monthIndex = 0; monthIndex< 12; monthIndex++) {

if (strcmp(Month, monthName[monthIndex]) == 0) break;}

if (monthIndex>= 12) return false;

datetime.Day = Day;

datetime.Month = monthIndex + 1;

datetime.Year = CalendarYrToTm(Year);

returntrue;

}



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2023-01-17 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: