Цифровой модуль GY-68 датчика атмосферного давления и температуры BMP180

Код:00492
Артикул:GY-68
В наличии:есть
240 руб
1
Цифровой модуль GY-68 датчика атмосферного давления и температуры BMP180
GY-68 Digital Barometric Pressure Sensor Board Module compatible with BMP180
 
Измеряет атмосферное давление и температуру. С помощью преобразования данных о давлении и температуре определяется высота – цифровой модуль атмосферного давления и температуры используется как высотомер. Модуль GY-68 воспринимает давление и температуру благодаря микросхеме изготовленной по пьезо-резистивной технологии BMP180 BOSCH. Характеристики датчика позволяют применять его в мультикоптерах, воздушных шарах, зондах, дельтапланах. Модуль используется в составе самостоятельного высотомера или вместе с прибором ГЛОНАСС, GPS для уточнения высоты. Найдет применение цифровой модуль атмосферного давления, температуры и в приборах отслеживающих погоду. Ориентирован на работу совместно с микроконтроллером.
Каждая микросхема BMP180 проходит калибровку на заводе-изготовителе. В результате калибровочные коэффициенты записываются в ПЗУ. Имеет интерфейс I2C. Измеренные величины давления и температуры передаются по последовательной шине данных цифрового барометра-термометра. Высота над уровнем моря вычисляется по методике изложенной в документации микросхемы BMP180 на странице 15. Количество измерений в секунду может достигать 128. Обычно используют датчик в режиме одно измерение в секунду. Это увеличивает точность и экономит ток потребления. Датчик может измерять атмосферное давление с различной точностью. Требуемая точность измерения сообщается датчику микроконтроллером. Важно правильно задать задержку в программе перед чтением регистров данных. BMP180 соответствует микросхеме BMP085 в части программного обеспечения обрабатывающего данные.
 

Измерение температуры и давления с помощью BMP180.
 
Характеристики
 
Некоторые характеристики датчика измеряются в гектопаскалях сокращенно гПа. 1 гектопаскаль = 100 Паскаль. Это связано с тем, что при измерении высоты с помощью контроля давления используется барическая ступень. Высота, на которую надо подняться или опуститься, чтобы давление изменилось на 1 гПа – барическая ступень.
 
Питание GY-68
            напряжение 3,3 или 5 В
            ток, мкА
                        в режиме ожидания 0,1
                        потребление  возрастает на 0,5 при увеличении частоты измерений на 1 Гц
                        средний 5
Диапазон измерения давления от 300 до 1100 гПа что соответствует высоте -500…9000 м
С точностью ± 0,02 гПа, что при работе в режиме высотомера соответствует 0,17 м
Диапазон измерения температуры 0...65 °C
С точностью ± 2 °C
Разрешающая способность 16 бит
Максимальная скорость интерфейса 3,4 Мбод
Адрес 7 бит на шине I2C значением 0x77
Время отклика 7,5 мс
Шум
            в режиме низкого потребления 0,5 м
            в режиме высокого потребления 0,17 м
Диапазон температуры при работе –40…85 °C
Отверстие под винт 3 мм
Размеры 36 x 38 x 9,3 мм
 
При температуре воздуха 0 °C и давлении 1000 гПа, барическая ступень составляет 8 метров на гПа. Чтобы давление уменьшилось на 1 гПа, нужно подняться на 8 метров. С ростом температуры и увеличением высоты ступень возрастает на 0,4 % на каждый градус нагревания. Она прямо пропорциональна температуре и обратно пропорциональна давлению.
 


Барометрическое давление в гПа и высота над уровнем моря. Синий график – высота в стандартной атмосфере.
 
Контакты GY-68
 
VCC – питание 5 В
3.3 – питание 3,3 В
GND – общий провод
SCL и SDA – интерфейс I2C
 


Линии соединений GY-68 и Arduino UNO.
 
Электрическая схема
 

 
Напряжение питания 3,3 В подается на контакт 3.3 или формируется стабилизатором U1 MIC5205 маркированным KB33 при подключению модуля GY-68 к источнику напряжения 5 В. Линия питания 3,3 вольта соединена с подтягивающими резисторам R1 и R2. Они необходимы для работы шины I2C – с их помощью формируются высокие уровни сигнала, а когда BMP180 проваливает это напряжение – формируется низкий логический уровень.
 
Программирование
 
 
Приводим текст программы для ардуино выводящей величины температуры и давления в окно последовательного монитора ардуино.
 


 
#include
#define BMP085_ADDRESS 0x77 // I2C address
 
const unsigned char OSS = 0; // Oversampling Setting
 
//Calibration values
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;
 
//b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
//so ...Temperature(...) must be called before ...Pressure(...).
long b5;
 
short temperature;
long pressure;
 
void setup()
{
 Serial.begin(9600);
 Wire.begin();
 bmp085Calibration();
}
 
void loop()
{
 temperature = bmp085GetTemperature(bmp085ReadUT());
 pressure = bmp085GetPressure(bmp085ReadUP());
 Serial.print("Temperature: ");
 Serial.print(temperature, DEC);
 Serial.println(" *0.1 deg C");
 Serial.print("Pressure: ");
 Serial.print(pressure, DEC);
 Serial.println(" Pa");
 Serial.println();
 delay(1000);
}
 
//Stores all of the bmp085's calibration values into global variables
//Calibration values are required to calculate temp and pressure
//This function should be called at the beginning of the program
void bmp085Calibration()
{
 ac1 = bmp085ReadInt(0xAA);
 ac2 = bmp085ReadInt(0xAC);
 ac3 = bmp085ReadInt(0xAE);
 ac4 = bmp085ReadInt(0xB0);
 ac5 = bmp085ReadInt(0xB2);
 ac6 = bmp085ReadInt(0xB4);
 b1 = bmp085ReadInt(0xB6);
 b2 = bmp085ReadInt(0xB8);
 mb = bmp085ReadInt(0xBA);
 mc = bmp085ReadInt(0xBC);
 md = bmp085ReadInt(0xBE);
}
 
//Calculate temperature given ut.
//Value returned will be in units of 0.1 deg C
short bmp085GetTemperature(unsigned int ut)
{
 long x1, x2;
 
 x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
 x2 = ((long)mc << 11)/(x1 + md);
 b5 = x1 + x2;
 
 return ((b5 + 8)>>4);
}
 
//Calculate pressure given up
//calibration values must be known
//b5 is also required so bmp085GetTemperature(...) must be called first
//Value returned will be pressure in units of Pa
long bmp085GetPressure(unsigned long up)
{
 long x1, x2, x3, b3, b6, p;
 unsigned long b4, b7;
 
 b6 = b5 - 4000;
 // Calculate B3
 x1 = (b2 * (b6 * b6)>>12)>>11;
 x2 = (ac2 * b6)>>11;
 x3 = x1 + x2;
 b3 = (((((long)ac1)*4 + x3)<>2;
 
 //Calculate B4
 x1 = (ac3 * b6)>>13;
 x2 = (b1 * ((b6 * b6)>>12))>>16;
 x3 = ((x1 + x2) + 2)>>2;
 b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
 
 b7 = ((unsigned long)(up - b3) * (50000>>OSS));
 if (b7 < 0x80000000)
 p = (b7<<1)/b4;
 else
 p = (b7/b4)<<1;
 
 x1 = (p>>8) * (p>>8);
 x1 = (x1 * 3038)>>16;
 x2 = (-7357 * p)>>16;
 p += (x1 + x2 + 3791)>>4;
 
 return p;
}
 
//Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
 unsigned char data;
 
 Wire.beginTransmission(BMP085_ADDRESS);
 Wire.send(address);
 Wire.endTransmission();
 
 Wire.requestFrom(BMP085_ADDRESS, 1);
 while(!Wire.available())
 ;
 
 return Wire.receive();
}
 
//Read 2 bytes from the BMP085
//First byte will be from 'address'
//Second byte will be from 'address'+1
int bmp085ReadInt(unsigned char address)
{
 unsigned char msb, lsb;
 
 Wire.beginTransmission(BMP085_ADDRESS);
 Wire.send(address);
 Wire.endTransmission();
 
 Wire.requestFrom(BMP085_ADDRESS, 2);
 while(Wire.available()<2)
 ;
 msb = Wire.receive();
 lsb = Wire.receive();
 
 return (int) msb<<8 | lsb;
}
 
//Read the uncompensated temperature value
unsigned int bmp085ReadUT()
{
 unsigned int ut;
 
 //Write 0x2E into Register 0xF4
 //This requests a temperature reading
 Wire.beginTransmission(BMP085_ADDRESS);
 Wire.send(0xF4);
 Wire.send(0x2E);
 Wire.endTransmission();
 
 //Wait at least 4.5ms
 delay(5);
 
 //Read two bytes from registers 0xF6 and 0xF7
 ut = bmp085ReadInt(0xF6);
 return ut;
}
 
//Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
 unsigned char msb, lsb, xlsb;
 unsigned long up = 0;
 
 //Write 0x34+(OSS<<6) into register 0xF4
 //Request a pressure reading w/ oversampling setting
 Wire.beginTransmission(BMP085_ADDRESS);
 Wire.send(0xF4);
 Wire.send(0x34 + (OSS<<6));
 Wire.endTransmission();
 
 //Wait for conversion, delay time dependent on OSS
 delay(2 + (3<  
 //Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
 Wire.beginTransmission(BMP085_ADDRESS);
 Wire.send(0xF6);
 Wire.endTransmission();
 Wire.requestFrom(BMP085_ADDRESS, 3);
 
 //Wait for data to become available
 while(Wire.available() < 3)
 ;
 msb = Wire.receive();
 lsb = Wire.receive();
 xlsb = Wire.receive();
 
 up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
 
 return up;
}
 
В сети содержится множество библиотек и программ для вывода данных датчика BMP180 на индикаторы и подсчета высоты над уровнем моря.
 
ПРИМЕЧАНИЕ
 
Важно: датчик BMP180 чувствителен к влаге. Не применяйте растворители для чистки контактов модуля GY-68 после пайки. Для снижения погрешности рекомендуется закрыть модуль GY-68 от освещения.
Не забудьте при построении альтиметра в программе внести коррекцию с указанием высоты, на которой находится ваш исследовательско-конструкторский центр. Именно с этой высоты с учетом атмосферного давления будет производится отсчет подъема летательного аппарата.
 
Программирование

Библиотека Adafruit

Библиотека Sparkfun




 
Вверх