Объявление

Внимание!
Данный форум предназначен только для радиолюбителей!
Никакие прочие объявления, реклама товаров либо услуг невозможны!


Любой спам на нашем форуме запрещён!
Разрешаются только ссылки по темам! 3а нарушения БАН.


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

Правила форума
Внимание! Любой спам на нашем форуме запрещён!
Коммерческая реклама сайтов, ссылки, спам запрещены. Так же запрещены ссылки на сайты в профилях новичков.
Бан без предупреждений.

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

Сообщение admin » 04 фев 2017, 21:21

Китайцы продают отличный и не дорогой датчик атмосферного давления и температуры BMP280, работающий как по шине I2C так и по SPI. В совокупности с датчиком влажности DHT11 этот датчик позволяет построить систему климат-контроля (или погодную станцию) для применения в любых бытовых установках. Дома, на даче, в теплице и т.д. Есть в продаже конечно более крутой датчик BME280 который совмещает в себе и датчик влажности, но BMP280 стоит у китайцев 60 рублей DHT11 50 рублей, в то время как BME280 200-230 рублей.

Проблемы у людей возникают при попытках подключить данный датчик к микроконтроллеру. Опять же будем разбираться с данным датчиком на простейшем контроллере Arduino UNO.

Библиотека для работы с датчиком находится тут: https://github.com/adafruit/Adafruit_BMP280%20_Library
Подключение датчика по SPI:

BMP280 --- UNO
VCC --------3.3V!!! Внимание: напряжение выше 3б3 вольта убьёт ваш датчик!
GND ------- GND
SCL -------- 13
SDA -------- 11
CSB -------- 10
SDO -------- 12

Далее надо доустановить библиотеку Adafruit BMP280 (ссылка дана в начале статьи), открыть скетч из нее bmp280test, и внести небольшую правку:
вместо
Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
//Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);
вставить
//Adafruit_BMP280 bme; // I2C
//Adafruit_BMP280 bme(BMP_CS); // hardware SPI
Adafruit_BMP280 bme(BMP_CS, BMP_MOSI, BMP_MISO, BMP_SCK);

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

Продолжение следует...
admin
Администратор
 
Сообщений: 56
Зарегистрирован: 27 ноя 2016, 18:21
ТегиBMP280

Работа с датчиком давления и температуры BMP280

Сообщение admin » 05 фев 2017, 09:51

Погодная станция на базе барометра BMP280, термометра DS18B20, OLED дисплея 0,96", Arduino Uno.

Нам понадобятся:

Датчик температуры DS18B20,
Экран 0.96 128X64 OLED,
Breadboard
Набор проводов Папа-Папа
Микроконтроллер Arduino
Резистор
Барометр BMP280 GY-68

Для реализации проекта нам необходимо установить сразу несколько библиотек:

OneWire Arduino Library
OLED I2C OLED_I2C с поддержкой Русского и Украинского языка.
Dallas Temperature
Adafruit BMP280 Библиотека для работы с датчиком давления BMP280

Сборка:

1) OLED дисплей подключаем к arduino следующим образом:

Arduino Uno Экран 0.96 128X64 OLED
5V или 3.3V VCC
GND GND
Pin 9 SCL
Pin 8 SDA


Для удобства подключения можно использовать макетную плату.

2) Датчик температуры DS18B20 подключается к arduino следующим образом:

Распиновка для влагозащитного датчика DS18B20 с метровым проводом:

Arduino UNO датчик DS18B20
5V или 3.3V Красный провод ( 5V)
GND Черный провод (GND)
Pin 10 Желтый провод (Сигнальный) (Необходимо подтянуть резистором 4,7кОм к 5V


3) Барометр BMP280 GY-68 подключается к Arduino следующим образом:

Arduino UNO Барометр BMP280

3.3V ! Vin Внимание!!! Питание выше 3,3 вольт убьёт ваш датчик! Будьте внимательны при подключении!
GND GND
A5 SCL
A4 SDA

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

Скетч:

Код: выделить все
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> // Библиотека для работы с барометром
float P; // В данную переменную мы будем пересчитывать давление в милиметры ртутного столба
Adafruit_BMP280 bmp;

#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 10 // номер пина к которому подключен DS18B20
OneWire oneWire(ONE_WIRE_BUS);
DallasTemperature sensors(&oneWire);
char buffer[25];
char buffer1[25];

#include <OLED_I2C.h>
OLED  myOLED(8, 9, 8); // Подключение дисплея, 8pin - SDA , 9pin - SCL
extern uint8_t RusFont[]; // Русский шрифт
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов.

void setup()
{
  sensors.begin();
  myOLED.begin();
  bmp.begin();
  myOLED.setFont(RusFont);
}

void loop()
{

// Выводим на экран показания температуры
sensors.requestTemperatures();
myOLED.clrScr(); // очищаем экран
myOLED.setFont(RusFont);
myOLED.print("Ntvgthfnehf", CENTER, 0); // вывод текста русскими буквами
myOLED.setFont(SmallFont);
myOLED.print("data-ru.ru", CENTER, 55); // вывод текста
myOLED.setFont(MegaNumbers);
myOLED.print(String(sensors.getTempCByIndex(0) , 1), CENTER, 10);   // Отображение значения температуры, с точностью до десятых
myOLED.update();
delay(2000); // Пауза 2 секунды

// Выводим на экран показания атмосферного давления
myOLED.clrScr(); // очищаем экран
myOLED.setFont(RusFont);
myOLED.print("Lfdktybt", CENTER, 0); // вывод текста русскими буквами
myOLED.setFont(SmallFont);
myOLED.print("data-ru.ru", CENTER, 55); // вывод текста
P=bmp.readPressure();
P=(float)0.0075*P; // пересчитываем давления в привычные нам мм ртутного столба.
myOLED.setFont(MegaNumbers);
myOLED.print(String(P , 1), CENTER, 10);   // Отображение значения давления, с точностью до десятых
myOLED.update();
delay(2000);


}


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

В этом случае скетч будет таким:

Код: выделить все
#include <Wire.h>
#include <Adafruit_BMP280.h> // Библиотека для работы с барометром https://github.com/adafruit/Adafruit-BMP280-Library
#include <OLED_I2C.h>

float P; // В данную переменную мы будем пересчитывать давление в милиметры ртутного столба
Adafruit_BMP280 bmp;


OLED myOLED(SDA, SCL, 8); // Подключение дисплея hardware SDA , SCL
extern uint8_t RusFont[]; // Русский шрифт
extern uint8_t MegaNumbers[]; // Подключение больших шрифтов
extern uint8_t SmallFont[]; // Базовый шрифт без поддержки русскийх символов.

void setup()
{
 myOLED.begin();
 bmp.begin();
 myOLED.setFont(RusFont);
}

void loop()
{

// Выводим на экран показания температуры
myOLED.clrScr(); // очищаем экран
myOLED.setFont(RusFont);
myOLED.print("Ntvgthfnehf", CENTER, 0); // вывод текста русскими буквами
myOLED.setFont(SmallFont);
myOLED.print("data-ru.ru", CENTER, 55); // вывод текста
myOLED.setFont(MegaNumbers);
myOLED.print(String(bmp.readTemperature() , 1), CENTER, 10); // Отображение значения температуры, с точностью до десятых
myOLED.update();
delay(2000); // Пауза 2 секунды

// Выводим на экран показания атмосферного давления
myOLED.clrScr(); // очищаем экран
myOLED.setFont(RusFont);
myOLED.print("Lfdktybt", CENTER, 0); // вывод текста русскими буквами
myOLED.setFont(SmallFont);
myOLED.print("data-ru.ru", CENTER, 55); // вывод текста
P=bmp.readPressure();
P=(float)0.0075*P; // пересчитываем давления в привычные нам мм ртутного столба.
myOLED.setFont(MegaNumbers);
myOLED.print(String(P , 1), CENTER, 10); // Отображение значения давления, с точностью до десятых
myOLED.update();
delay(2000);
}


Продолжение следует...
admin
Администратор
 
Сообщений: 56
Зарегистрирован: 27 ноя 2016, 18:21
ТегиРабота с датчиком давления и температуры BMP280

Погодная станция. UNO, BMP280, DS18b20, I2C OLED, DHT11, DS1

Сообщение admin » 05 фев 2017, 11:09

Ниже представлен вариант погодной станции отсюда: http://data-ru.ru/forum/viewtopic.php?f=6&t=113, но уже включающей в себя: датчик атмосферного давления и температуры BMP280, внешний датчик температуры DS18b20, датчик влажности DHT11, часы реального времени DS1307. То есть с добавлением BMP280 функционал нашей погодной станции существенно расширяется.

Код скетча:

Код: выделить все
#include <dht11.h>
dht11 sensor;
#define DHT11PIN A0

#include <Adafruit_Sensor.h>
#include <Adafruit_BMP280.h> // Библиотека для работы с барометром
float P; // В данную переменную мы будем пересчитывать давление в милиметры ртутного столба
Adafruit_BMP280 bmp;

#include <OLED_I2C.h>
//SDA pin   -> Arduino A4 или иной назначенный SDA pin
//SCL pin   -> Arduino A5 или иной назначенный SCL pin
OLED  myOLED(A4, A5, 8); //пины OLED: SDA на A4, SCK на A5 Arduino

extern uint8_t MegaNumbers[];//Установка шрифтов Больших
extern uint8_t RusFont[];// Установка русских шрифтов
extern uint8_t SmallFont[];// Установка малых шрифтов
extern uint8_t term[];//картинка термометра
extern uint8_t grad[];//картинка градуса
extern uint8_t water[];//картинка флажности
extern uint8_t percentage[];//картинка процента

#include <OneWire.h>//подключение библиотеки однопроводного интерфейса
OneWire ds(A1); // пин сенсора датчика температуры (средняя ножка) DS18b20 к пину A1 Arduino. Не  забываем этот пин сенсора подтянуть к 3,3V сопротивлением!
#include <DS1307.h>//подключение библиотеки часового модуля
DS1307 rtc(A3, A2);//часовой модуль подключен к пинам Arduino: Vcc к +5V, GND к 3емле, SDA к A3, SCL к A2
Time t; // присвоение переменной для времени
int x = 0;
int y = 0; //добавка

void setup() {
myOLED.begin();
bmp.begin();
rtc.halt(false);
//rtc.setDOW(WEDNESDAY);  // Настройка для недели  настроить при первом
//rtc.setTime(12, 27, 0); // Настройка часов
//rtc.setDate(04, 01, 2017); // Настройка даты
}

void loop() {
sensor.read(A0); // Пин сенсора DS18b20 на Ардуино
if (x >= 10) {  // 10 количество секунд, для переключения на температуру
temp();
delay(4000); //добавка
water_proc(); // добавка
delay(8000); //добавка
x=0;
}
else
{
watch();
}
x++;
}
void watch() {
myOLED.setFont(RusFont);
t = rtc.getTime();
switch (t.dow)
{
case 1:     myOLED.print("GJYTLTKMYBR", CENTER, 0);    break;
case 2:     myOLED.print("DNJHYBR", CENTER, 0);        break;
case 3:     myOLED.print("CHTLF", CENTER, 0);          break;
case 4:     myOLED.print("XTNDTHU", CENTER, 0);        break;
case 5:     myOLED.print("GZNYBWF", CENTER, 0);        break;
case 6:     myOLED.print("CE<<JNF", CENTER, 0);        break;
case 7:     myOLED.print("DJCRHTCTYMT", CENTER, 0);    break;
}
String stringOne = rtc.getTimeStr();
myOLED.setFont(MegaNumbers);
myOLED.print(stringOne.substring(0, 2), 4, 15);
myOLED.print("/", 51, 12);
myOLED.print(stringOne.substring(3, 5), 75, 15);
myOLED.setFont(RusFont);
switch (t.mon)
{
case 1:
myOLED.print(String(t.date), 30, 57);
myOLED.print("ZYDFHZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 2:
myOLED.print(String(t.date), 26, 57);
myOLED.print("ATDHFKZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 3:
myOLED.print(String(t.date), 30, 57);
myOLED.print("VFHNF", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 4:
myOLED.print(String(t.date), 30, 57);
myOLED.print("FGHTKZ", CENTER, 57);
myOLED.print(String(t.year), 88, 57);
break;
case 5:
myOLED.print(String(t.date), 36, 57);
myOLED.print("VFZ", CENTER, 57);
myOLED.print(String(t.year), 82, 57);
break;
case 6:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>YZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 7:
myOLED.print(String(t.date), 35, 57);
myOLED.print("B>KZ", CENTER, 57);
myOLED.print(String(t.year), 81, 57);
break;
case 8:
myOLED.print(String(t.date), 28, 57);
myOLED.print("FDUECNF", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 9:
myOLED.print(String(t.date), 24, 57);
myOLED.print("CTYNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 94, 57);
break;
case 10:
myOLED.print(String(t.date), 26, 57);
myOLED.print("JRNZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
case 11:
myOLED.print(String(t.date), 28, 57);
myOLED.print("YJZ<HZ", CENTER, 57);
myOLED.print(String(t.year), 90, 57);
break;
case 12:
myOLED.print(String(t.date), 26, 57);
myOLED.print("LTRF<HZ", CENTER, 57);
myOLED.print(String(t.year), 92, 57);
break;
}
myOLED.update();
delay(450);
myOLED.setFont(MegaNumbers);
myOLED.print("-", 51, 15);
myOLED.update();
delay(450);
}

void temp() { 
for(int x = 0; x < 10; x++){
byte data[2];
ds.reset();
ds.write(0xCC);
ds.write(0x44);
delay(500);
ds.reset();
ds.write(0xCC);
ds.write(0xBE);
data[0] = ds.read();
data[1] = ds.read();
int Temp = (data[1] << 8) + data[0];
Temp = Temp >> 4;
String stringOne = rtc.getTimeStr();
myOLED.clrScr();
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("NTVG.DYTIYZZ", CENTER, 57); //Температура внешняя
myOLED.drawBitmap(4, 18, term, 19, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(Temp), CENTER, 15);
myOLED.drawBitmap(92, 18, grad, 13, 12);
myOLED.update();
myOLED.clrScr();

 // Serial.println(sensor.temperature,1);
  }
}
void water_proc() { 
  for(int y = 0; y < 20; y++)
  {
  String stringOne = rtc.getTimeStr();
 
  myOLED.clrScr();
  myOLED.setFont(SmallFont);
  myOLED.print(stringOne.substring(0, 5), 98, 0);
  myOLED.print(rtc.getDateStr(), 0, 0);
  myOLED.setFont(RusFont);
  myOLED.print("DKF:YJCNM", CENTER, 57); // Влажность
  myOLED.drawBitmap(4, 18, water, 20, 40);
  myOLED.setFont(MegaNumbers);
  myOLED.print(String(sensor.humidity), CENTER, 15);
  myOLED.drawBitmap(90, 18, percentage, 35, 35);
  myOLED.update();
  myOLED.clrScr();
 
//  Serial.println(sensor.humidity,1);

// Выводим на экран показания температуры внутренней
String stringOne = rtc.getTimeStr();

myOLED.clrScr(); // очищаем экран
myOLED.setFont(SmallFont);
myOLED.print(stringOne.substring(0, 5), 98, 0);
myOLED.print(rtc.getDateStr(), 0, 0);
myOLED.setFont(RusFont);
myOLED.print("NTVG.DYENHB", CENTER, 57); // вывод текста русскими буквами
myOLED.drawBitmap(4, 18, term, 19, 40);
myOLED.setFont(MegaNumbers);
myOLED.print(String(bmp.readTemperature() , 1), CENTER, 15); // Отображение значения температуры, с точностью до десятых
myOLED.drawBitmap(92, 18, grad, 13, 12);
myOLED.update();
myOLED.clrScr();

// Выводим на экран показания атмосферного давления
String stringOne = rtc.getTimeStr();

myOLED.clrScr(); // очищаем экран
myOLED.setFont(RusFont);
myOLED.print("LFDKTYBT", CENTER, 57); // вывод текста русскими буквами
P=bmp.readPressure();
P=(float)0.0075*P; // пересчитываем давления в привычные нам мм ртутного столба.
myOLED.setFont(MegaNumbers);
myOLED.print(String(P , 1), CENTER, 15); // Отображение значения давления, с точностью до десятых
myOLED.update();
myOLED.clrScr();

  }
}
admin
Администратор
 
Сообщений: 56
Зарегистрирован: 27 ноя 2016, 18:21
ТегиЧасы-погодная станция. UNO, BMP280, DS18b20, I2C OLED, DHT11, DS1307


Вернуться в Для новичков. Азы.

Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2

cron
/