Датчик атмосферного давления BMP180 GY-68 – это цифровой модуль позволяющий получить текущие значения атмосферного давления. Еще одним применением данного модуля является определений высоты, которая зависит от давления и рассчитывается по международной барометрической формуле.
Модуль GY-68 построен на базе чипа BMP180 (Bosch Module Pressure), который оснащён пьезорезистивным датчиком, термодатчиком, АЦП, памятью EEPROM и RAM, а так же микроконтроллером с поддержкой передачи данных по шинам I2C и SPI. В модуле реализована возможность передачи данных только по шине I2C, а чип BMP180 запитывается через линейный стабилизатор xc6206 с падением напряжения до 250 мВ, что позволяет подключать модуль к источнику питания от 3,3 до 5,5 В постоянного тока.
Пример
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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 |
// подключаем к скетчу две библиотеки, SFE_BMP180 и Wire; Wire – // это стандартная библиотека, идущая в комплекте с IDE Arduino. #include <SFE_BMP180.h> #include <Wire.h> // создаем экземпляр класса SFE_BMP180 и называем его «pressure»: SFE_BMP180 pressure; // это высота над уровнем моря в Астане; // указана в метрах: #define ALTITUDE 347.0 void setup() { Serial.begin(9600); Serial.println("REBOOT"); // "ПЕРЕЗАГРУЗКА" // инициализируем датчик (важно извлечь калибровочные данные, // хранящиеся в устройстве): if (pressure.begin()) Serial.println("BMP180 init success"); // "Инициализация BMP180 прошла успешно" else { // упс, что-то пошло не так! // как правило, так происходит из-за проблем с подключением Serial.println("BMP180 init failnn"); // "Инициализация BMP180 не удалась" while(1); // вечная пауза } } void loop() { char status; double T,P,p0,a; // блок loop() считывает давление каждые 10 секунд // если вам нужно давление, приведенное к уровню моря // (т.е. давление, используемое в прогнозах погоды), // вам нужно знать, уровень моря в месте, // где вы измеряете давление; // в данном скетче мы используем константу ALTITUDE: Serial.println(); Serial.print("provided altitude: "); // "заданная высота над уровнем моря" Serial.print(ALTITUDE,0); Serial.print(" meters, "); // " метров, " Serial.print(ALTITUDE*3.28084,0); Serial.println(" feet"); // " футов, " // если вы хотите измерить высоту над уровнем моря, // то вам нужно знать информацию о давлении; расчет высоты // над уровнем моря показан в конце скетча // чтобы рассчитать давление, сначала нужно измерить температуру // запускаем измерение температуры; если функция // будет выполнена успешно, она вернет количество // миллисекунд, потребовавшихся на измерение; // а если неуспешно, то вернет «0»: status = pressure.startTemperature(); if (status != 0) { // ждем, когда завершится измерение: delay(status); // извлекаем данные о температуре; обратите внимание, // что измеренные данные хранятся в переменной «T»; // если функция будет выполнена успешно, она вернет «1», // а если нет, то «0» status = pressure.getTemperature(T); if (status != 0) { // печатаем измеренную температуру: Serial.print("temperature: "); // "температура: " Serial.print(T,2); Serial.print(" deg C, "); // " градусов Цельсия, " Serial.print((9.0/5.0)*T+32.0,2); Serial.println(" deg F"); // " градусов Фаренгейта" // запускаем измерение давления; параметр отвечает // за частоту дискретизации данных; допустимые значения // для параметра – от «0» до «3», где «3» - это // самое высокое разрешение, но и самая долгая задержка; // если функция будет выполнена успешно, она вернет // количество миллисекунд, потребовавшихся на ожидание, // а если неуспешно, то «0»: status = pressure.startPressure(3); if (status != 0) { // ждем завершения измерения: delay(status); // извлекаем данные о давлении; обратите внимание, // что измеренные данные хранятся в переменной «P»; // также обратите внимание, что этой функции // требуются данные о температуре (переменная «T»); // если температура стабильна, то для многократного // измерения давления вы можете измерить температуру // всего один раз; // если функция будет выполнена успешно, она вернет «1», // а если нет, то «0»: status = pressure.getPressure(P,T); if (status != 0) { // печатаем результат: Serial.print("absolute pressure: "); // "абсолютное давление: " Serial.print(P,2); Serial.print(" mb, "); // " мбар, " Serial.print(P*0.0295333727,2); Serial.println(" inHg"); // " дюймов рт. ст." // датчик давления возвращает данные об абсолютном давлении, // которые могут варьироваться в зависимости от высоты // над уровнем моря; чтобы убрать эффект от высоты // над уровнем моря, используйте функцию sealevel(), // указав в ней высоту над уровнем моря для вашей локации // показатель давления без учета высоты над уровнем моря // используется, как правило, в прогнозах погоды; // параметры: P = абсолютное давление в миллибарах, // ALTITUDE = высота над уровнем моря в метрах; // результат: p0 = давление без учета // высоты над уровнем моря в миллибарах p0 = pressure.sealevel(P,ALTITUDE); // здесь, в Астане, 347 метров над уровнем моря Serial.print("relative (sea-level) pressure: "); // относительное давление (приведенное к уровню моря) Serial.print(p0,2); Serial.print(" mb, "); // " мбар, " Serial.print(p0*0.0295333727,2); Serial.println(" inHg"); // " дюймов рт. ст." // кроме того, зная давление, вы можете определить // высоту над уровнем моря; // это выполняется при помощи функции altitude(); // параметры: P = абсолютное давление в миллибарах, // p0 = базовое давление в миллибарах // результат: a = высота над уровнем моря в метрах a = pressure.altitude(P,p0); Serial.print("computed altitude: "); // "расчитанная высота над уровнем моря: " Serial.print(a,0); Serial.print(" meters, "); // " метров, " Serial.print(a*3.28084,0); Serial.println(" feet"); // " футов" } else Serial.println("error retrieving pressure measurementn"); // "ошибка при извлечении данных о давлении" } else Serial.println("error starting pressure measurementn"); // "ошибка при запуске измерения давления" } else Serial.println("error retrieving temperature measurementn"); // "ошибка при извлечении данных о температуре" } else Serial.println("error starting temperature measurementn"); // "ошибка при запуске измерения температуры" delay(5000); // 5-секундная пауза } |