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
Прошиваем, видим такое:
Разберемся с кодом:
#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 секунд. }
Добавить комментарий