BMP180 это датчик атмосферного давления с цифровым i2c интерфейсом
То есть этот датчик конвертирует в чиселки давление воздуха на него. И кстати это не обязательно может быть атмосферное давление. Можно померить например давление в закрытой бутылке, накачанной воздухом. Еще им можно мерить высоту — чем выше над землей тем меньше давление.
Распиновка синего BMP180
- VIN (не путать с IO на других версиях платы) — сюда можно подать питание 5 вольт — она идет на понижайку напряжения до 3.3 в.
- Сюда подается 3.3 вольта. , если есть. Причем подключать надо либо первый, либо этот. Китайцы молодцы.
- IO — на рисунке его нет, но на некоторых платах он присутствует. Он нужен для питания, если у нас в схеме сильно меньше 3.3 вольт — например 1.8 вольт. Если его подключаете, то не нужны VIN и 3.3 🙂
- Общий типа минус
- i2c clock подключается так:
- Uno, Pro / Pro Mini к А5
- Mega, Due к 21
- Leonardo, Pro Micro к 3
- i2c data так:
- Uno, Redboard, Pro / Pro Mini к А4
- Mega, Due к 20
- Leonardo, Pro Micro к 2
Библиотека Arduino для BMP180
Скачать тут https://github.com/sparkfun/BMP180_Breakout/archive/master.zip (или с нашего сайта тут BMP180_Breakout-master). Там много файлов, но нам нужна папка src. Ее переименовываем в SFE_BMP180 и закидываем в Libraries у Arduino.
В эту же папку SFE_BMP180 закидываем файл keywords.txt и каталог examples.
После этого идем Файл > Примеры > SFE_BMP180 > SFE_BMP180_example
Прошиваем, видим такое:
Разберемся с кодом:
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 |
#include <SFE_BMP180.h> #include <Wire.h> // Объявим переменную для доступа к SFE_BMP180: SFE_BMP180 pressure; #define ALTITUDE 1655.0 // высота над уровнем моря по приколу в метрах void setup() { Serial.begin(9600); Serial.println("REBOOT"); // инициализация if (pressure.begin()) Serial.println("BMP180 init ok"); else { // Если мы тут то что-то не срослось. Как правило косяки с подключением Serial.println("BMP180 init fail\n\n"); while(1); // зависаем } } void loop() { char status; double T,P,p0,a; // Если вы хотите знать давление воздуха, откорректированное по уровню моря, которое обычно используется в прогнозах погоды // Вам надо знать уровень моря в вашей местности где проводится замер // Ее и надо указать в константе ALTITUDE в начале кода Serial.println(); Serial.print("Уровень моря: "); Serial.print(ALTITUDE,0); Serial.print(" метров, "); Serial.print(ALTITUDE*3.28084,0); Serial.println(" футов"); // Если вы хотите наоборот узнать высоту над уровнем моря, а давление вам известно // надо указать текущее атмосферное давление. Как это сделать написано в конце кода. // Так как давление зависит каким-тоо боком от температуры, надо сначала узнать температуру // В BMP180 есть встроенный термометр. Замер температуры занимает некоторое время. // Если все ровно, pressure.startTemperature вернет в status количество милисекунд, // которое нужно подождать для замера температуры // Если какой-то косяк с проводами, вернет 0 status = pressure.startTemperature(); if (status != 0) { // ждем: delay(status); // Получаем температуру, засовываем ее в переменную T: // Функция вернет 1 если все ОК, 0 если не ОК status = pressure.getTemperature(T); if (status != 0) { // пишем температуру: Serial.print("температура: "); Serial.print(T,2); Serial.print(" градусов C, "); // в цельсиях Serial.print((9.0/5.0)*T+32.0,2); Serial.println(" градусов F"); // в фаренгейтах // Определяем атм. давление: // Параметр указывает разрешение, от 0 до 3 (чем больше разрешение, тем выше точность, тем дольше ждать). // Если все ровно, pressure.startPressure вернет в status количество милисекунд, // которое нужно подождать для замера атм. давления // Если какой-то косяк то вернет 0 status = pressure.startPressure(3); if (status != 0) { // ждем окончания замера: delay(status); // Теперь можно получить давление в переменную P. //Функция вернет 1 если все ОК, 0 если не ОК. status = pressure.getPressure(P,T); if (status != 0) { // выводим все: Serial.print("абсолютное давление: "); Serial.print(P,2); Serial.print(" миллибар, "); Serial.print(P*0.0295333727,2); Serial.println(" дюймов ртутного столба"); // датчик возвращает атм. давление, которое изменяется в зависимости от высоты датчика. // Если мы хотим как в прогнозе погоды, то нужно сделать сомнительные вычисления // Параметры: P = давленик с датчика в миллибарах, ALTITUDE = высота над уровнем моря в метрах. // Результат: p0 = давление, откорректированное по уровню моря p0 = pressure.sealevel(P,ALTITUDE); Serial.print("Давление по уровню моря: "); Serial.print(p0,2); Serial.print(" миллибар, "); Serial.print(p0*0.0295333727,2); Serial.println("дюймов ртутного столба"); // Или если вы хотите сделать наоборот и определить высоту над уровнем моря по известному давлению, // Parameters: P = давление с датчика в миллибарах, p0 = давление, откорректированное по уровню моря. // Результат: a = высота над уровнем моря в метрах. a = pressure.altitude(P,p0); Serial.print("рассчитанная высота над уровнем моря: "); Serial.print(a,0); Serial.print(" метров, "); Serial.print(a*3.28084,0); Serial.println(" футов"); } else Serial.println("ошибка получение давления\n"); } else Serial.println("ошибка запуска получения давления\n"); } else Serial.println("ошибка получения температуры\n"); } else Serial.println("ошибка запуска получения температуры\n"); delay(5000); // пауза 5 секунд. } |
Добавить комментарий