Объявление

США начнут предпринимать меры экономического и военного характера, если Россия не прекратит нарушать Договор о ракетах средней и меньшей дальности (ДРСМД)

Решение главы Национального Объединения "Новая Россия - Великая Россия" Rommstaina: http://russianew.ru/viewtopic.php?f=120&t=4039

работа с датчиком давления и температуры 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
Администратор
 
Сообщений: 77
Зарегистрирован: 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
Администратор
 
Сообщений: 77
Зарегистрирован: 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
Администратор
 
Сообщений: 77
Зарегистрирован: 27 ноя 2016, 18:21
ТегиЧасы-погодная станция. UNO, BMP280, DS18b20, I2C OLED, DHT11, DS1307


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

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

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

cron
/