Bmp180 se povezuje na arduino. Povezivanje BMP180 senzora na Arduino

#include #include // Deklarišite varijablu za pristup SFE_BMP180: SFE_BMP180 pritisak; #define ALTITUDE 1655.0 // visina iznad nivoa mora na trik u metrima void setup () (Serial.begin (9600); Serial.println ("REBOOT"); // inicijalizacija if (pressure.begin ()) Serial. println ( "BMP180 init ok"); else (// Ako se ovdje nešto nije sraslo. Po pravilu, zaglavljivanja sa vezom Serial.println ("BMP180 init fail \ n \ n"); dok (1); / / hang) ) void loop () (char status; duplo T, P, p0, a; // Ako želite znati ispravljeni tlak zraka na razini mora, koji se obično koristi u vremenskoj prognozi // Morate poznavati more nivo u vašem području gdje se vrši mjerenje // Mora biti navedeno u konstanti VISINA na početku koda Serial.println (); Serial.print ("Sea level:"); Serial.print (ALTITUDE, 0); Serial. print ("metri,"); Serial .print (ALTITUDE * 3.28084,0); Serial.println ("feet"); // Ako želite znati nadmorsku visinu, ali znate pritisak // trebate kako bi se naznačio trenutni atmosferski tlak. Kako to učiniti piše na kraju koda... // Budući da tlak nekako bočno ovisi o temperaturi, prvo morate saznati temperaturu // BMP180 ima ugrađeni termometar. Za mjerenje temperature potrebno je neko vrijeme. // Ako je sve glatko, press.startTemperature će vratiti u status broj milisekundi // koje trebate čekati da izmjerite temperaturu // Ako postoji neki dovratak sa žicama, vratit će 0 status = pressure.startTemperature () ; if (status! = 0) (// čekaj: kašnjenje (status); // Dobij temperaturu, stavi je u T varijablu: // Funkcija će vratiti 1 ako je sve u redu, 0 ako nije OK status = pritisak. getTemperature (T); if (status! = 0) (// upiši temperaturu: Serial.print ("temperature:"); Serial.print (T, 2); Serial.print ("stepeni C,"); / / u Celzijusima Serial.print ((9.0 / 5.0) * T + 32.0,2); Serial.println ("stepeni F"); // u Fahrenheitu // Odredite atmosferski tlak: // Parametar pokazuje rezoluciju, od 0 do 3 (što je veća rezolucija, to je veća tačnost, duže čekanje). // Ako je sve glatko, press.startPressure će vratiti u status broj milisekundi // koje trebate čekati da izmjerite atm. pritisak // Ako postoji neki problem, vratit će 0 status = pressure.startPressure ( 3); if (status! = 0) (// sačekajte kraj mjerenja: kašnjenje (status); // Sada možete dobiti pritisak u varijablu P. // Funkcija će vratiti 1 ako je sve u redu, 0 ako nije OK.status = pritisak getPressure (P, T); if (status! = 0) (// ispisati sve: Seri al.print ("apsolutni pritisak:"); Serial.print (P, 2); Serial.print ("milibar,"); Serial.print (P * 0. 0295333727.2); Serial.println ("inči žive"); // senzor vraća atm. pritisak, koji se menja u zavisnosti od visine senzora. // Ako želimo kao u vremenskoj prognozi, onda moramo napraviti sumnjive proračune // Parametri: P = pritisak senzora u milibarima, VISINA = visina iznad nivoa mora u metrima. // Rezultat: p0 = tlak korigiran na razini mora p0 = tlak.razina mora (P, VISINA); Serial.print ("Pritisak na nivou mora:"); Serial.print (p0,2); Serial.print ("milibar,"); Serial.print (p0 * 0,0295333727.2); Serial.println ("inči žive"); // Ili ako želite učiniti suprotno i odrediti nadmorsku visinu iz poznatog tlaka, // Parametri: P = tlak iz sonde u milibarima, p0 = tlak korigiran za razinu mora. // Rezultat: a = visina iznad nivoa mora u metrima. a = pritisak.visina (P, p0); Serial.print ("izračunata visina iznad nivoa mora:"); Serial.print (a, 0); Serial.print ("metri,"); Serial.print (a * 3.28084,0); Serial.println ("stopala"); ) else Serial.println ("greška pri dobijanju pritiska \ n"); ) else Serial.println ("greška pri pokretanju pritiska \ n"); ) else Serial.println ("greška pri dobijanju temperature \ n"); ) else Serial.println ("greška u početku dobivanja temperature \ n"); kašnjenje (5000); // pauza 5 sekundi. )

Arduino program sa komentarima:

/ * SFE_BMP180 primjer skice biblioteke

Ova skica pokazuje kako koristiti biblioteku SFE_BMP180 za čitanje
Bosch BMP180 senzor barometarskog pritiska.
https://www.sparkfun.com/products/11824
Kao i većina senzora pritiska, BMP180 meri apsolutni pritisak.
Ovo je stvarni ambijentalni pritisak koji uređaj vidi
variraju u zavisnosti od nadmorske visine i vremena.
Prije mjerenja tlaka morate izmjeriti temperaturu.
Ovo se radi pomoću startTemperature () i getTemperature ().
Rezultat je u stepenima C.
Nakon što očitate temperaturu, možete mjeriti tlak.
Ovo se radi pomoću startPressure () i getPressure ().
Rezultat je u milibarima (mb) ili hektopaskalima (hPa).
Ako ćete "pratiti vremenske obrasce, vjerovatno ćete htjeti
ukloniti efekte nadmorske visine. Ovo će proizvesti očitanja koja mogu
usporediti s objavljenim očitanjima tlaka s drugih lokacija.
Da biste to učinili, koristite funkciju Sealevel (). Morat ćete obezbijediti
poznata visina na kojoj je mjeren pritisak.
Ako želite da izmerite visinu, moraćete da znate pritisak
na osnovnoj visini. To može biti prosječni tlak zaptivke, ili
prethodno očitanje pritiska na vašoj visini, u tom slučaju
naredna očitavanja visine će biti + ili - početna osnovna linija.
Ovo se radi pomoću funkcije altitude ().

Hardverske veze:
- (GND) u GND
+ (Vin) do 5V
Također ćete morati spojiti I2C pinove (SCL i SDA) na svoj
Arduino. Pinovi se razlikuju na različitim Arduinima:
Bilo koji Arduino pinovi označeni: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Rok: 20 21
Leonardo: 2 3

Biblioteka SFE_BMP180 koristi jednačine s pomičnim zarezom koje je razvio
Projekat meteorološke stanice: http://wmrx00.sourceforge.net/

V10 Mike Grusin, SparkFun Electronics 24.10.2013
V1.1.2 Ažuriranja za Arduino 1.6.4 5/2015
*/

// Vaša skica mora #uključiti ovu biblioteku i Wire biblioteku.
// (Wire je standardna biblioteka uključena u Arduino.):

#include
#include
#include

const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal LCD (rs, en, d4, d5, d6, d7);

// Morat ćete kreirati SFE_BMP180 objekt, ovdje nazvan "pritisak":
SFE_BMP180 pritisak;

void setup ()
{
lcd.početak (16, 2);
// Inicijalizirati senzor (važno je da se vrijednosti kalibracije pohrane na uređaju).
press.begin ();
}

praznina petlja ()
{
char status;
dvostruki T, P, p0 = 1013,0, a; // 1013,0 - pritisak u hPa na nivou mora

// Prvo morate izmjeriti temperaturu da biste izvršili očitavanje tlaka.
// Pokreni mjerenje temperature:

status = pressure.startTemperature ();
ako (status! = 0)
{
kašnjenje (status);

// Dohvati završeno mjerenje temperature:
// Imajte na umu da je mjerenje pohranjeno u varijablu T.

status = pressure.getTemperature (T);
ako (status! = 0)
{
lcd.setCursor (0, 0);
lcd.print ("Temp =");
lcd.print (T, 2);
lcd.print ("C");
// Započnite mjerenje pritiska:
// Parametar je postavka prekomjernog uzorkovanja, od 0 do 3 (najveća rezolucija, najduže čekanje).
// Ako je zahtjev uspješan, vraća se broj ms za čekanje.
// Ako je zahtjev neuspješan, vraća se 0.

status = pressure.startPressure (3);
ako (status! = 0)
{
// Pričekajte da se mjerenje završi:
kašnjenje (status);

// Dohvati završeno mjerenje tlaka:
// Imajte na umu da je mjerenje pohranjeno u varijablu P.
// Imajte na umu da funkcija zahtijeva prethodno mjerenje temperature (T).
// (Ako je temperatura stabilna, možete izvršiti jedno mjerenje temperature za više mjerenja tlaka.)
// Funkcija vraća 1 ako je uspješna, 0 ako nije uspjela.

status = pressure.getPressure (P, T);
ako (status! = 0)
{
// Ispiši mjerenje:
lcd.setCursor (0, 1);
lcd.print ("P =");
lcd.print (P / 1.333,0); // koef. 1,333 - konverzija hPa u mm Hg

// Ako želite da odredite svoju nadmorsku visinu iz očitavanja pritiska,
// koristi funkciju visine zajedno s osnovnim tlakom (na razini mora ili drugom).
// Parametri: P = apsolutni pritisak u mb, p0 = 1013 osnovni pritisak u mb.
// Rezultat: a = visina u m.

a = pritisak.visina (P, p0);
lcd.print ("H =");
lcd.print (a, 2);
lcd.print ("m");
}
else lcd.print ("greška");
}
else lcd.print ("greška");
}
else lcd.print ("greška");
}
else lcd.print ("greška");
kašnjenje (5000); // Pauza 5 sekundi.

Dobar dan svima, pa ... samo počnite !!! Ovaj članak govori o povezivanju senzora barometarskog tlaka BMP180 na jednostruki računar Arduino Uno, ali ne tako jednostavno kao što bismo na prvi pogled željeli. Prikazat ćemo izmjerene i konvertirane vrijednosti temperature na 7-segmentnom displeju na osnovu vozača MAX7219... I oni će biti prikazani kao pužuća linija iz dvije pretvorene mjerne jedinice - to su stepeni Celzijusa i stepeni Farenhajta.

Senzor BMP180 nije samo senzor barometarskog pritiska, već i visokoprecizni senzor temperature. Ovo je vrlo osjetljiv uređaj, na kraju članka će biti prikazan pregledni video gledajući koji možete biti sigurni koliko je osjetljiv. Pa, dalje, možete dati karakteristike senzora BMP180 :

  • Napon napajanja 3,3 volta
  • Potrošnja struje 5 mKA pri brzini uzorkovanja od 1 Hz
  • Interfejs za povezivanje - I2C
  • Širenje tačnosti u izmjerenom pritisku + -0,12 hPa (+ -1 metar visine)
  • Raspon mjerenja temperature od -40*C do +85*C
  • Opseg mjerenja tlaka: od 300 do 1100 hPa

Vrijeme je da spojite senzor na ploču Arduino Uno, ali s obzirom da će naše izmjerene i preračunate vrijednosti biti prikazane na 7-segmentnom displeju, na sljedećem dijagramu ćemo prikazati kompletno povezivanje svih uređaja, kao i pinout senzora BMP180 :

Općenito, u dijagramu povezivanja nema ništa komplicirano, sve je vidljivo i razumljivo, sljedeći korak je prelazak na pisanje skice. Nekoliko važnih tačaka u implementaciji vizualizacije izmjerenih i konvertiranih vrijednosti:

  • Prikaz samo konvertovanih vrijednosti temperature (u nastavku pogledajte zašto)
  • Vrijednosti temperature moraju biti implementirane u desetinkama stepena (kao što se vidi na slici za pregled)
  • Implementirajte puzajuće renderiranje
  • Prisustvo dijagnostičkih poruka o statusu senzora tokom uključivanja i inicijalizacije je obavezno
  • Koristimo biblioteku za rad sa senzorom

Zašto je još uvijek moguće prikazati samo vrijednosti temperature... Naravno, želio bih u potpunosti pokriti sve mogućnosti senzora BMP180, ali za vizualizaciju na 7-segmentnom displeju će biti potrebno koristiti složenije simbole za prikazivanje u porukama "puzajuća linija" od onih koji se stvarno mogu kreirati pomoću modula za vizualizaciju ovog tipa. Stoga je odlučeno da se prikažu samo preračunate vrijednosti temperature, ali općenito, obično rijetko tko gleda očitanja atmosferskog tlaka kada, na primjer, ide u šetnju. Pa ipak - ako neko želi detaljnije proučiti kako se radi sa BMP180 senzorom, onda postoje dva primjera u biblioteci dodataka koji mogu detaljnije objasniti kako dobiti i pretvoriti tlak i temperaturu pomoću ovog senzora.

Kao rezultat, stvorena je sljedeća skica, s komentarima programera:

#include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" // Prototip funkcije za pomicanje poruke msgScrolling () void msgScrolling (byte msg, int msgSize, int dScroll); // Prototip funkcije za obradu temperaturnih podataka // i priprema poruke void TmsgPreparation (dvostruka vrijednost, bool stupanj); // Kreirajte LC objekat klase LedControl za rad sa ekranom LedControl LC = LedControl (12, 11, 10, 8); // Kreirajte BMP180Sensor objekat klase SFE_BMP180 za rad sa SFE_BMP180 BMP180Sensor; // Vremensko kašnjenje za crtanje znakova prilikom pomicanja const int delayScrolling = 300; // Poruka "Inicijalizacija senzora je uspjela" bajt msgInitSuccess = (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 91, 28, 13, 13, 79, 91, 91); // Poruka "Inicijalizacija senzora nije uspjela" bajt msgInitFail = (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 71, 119, 48, 14); // Niz numeričkih znakova bez bajta tačke Digit = (126, 48, 109, 121, 51, 91, 95, 112, 127, 123); // Niz numeričkih znakova sa bajtom tačke pDigit = (254, 176, 237, 249, 179, 219, 223, 240, 255, 251); // Simboli bajt deg = 99; // Simbol za "stepen" bajt C = 78; // Simbol "C" - Celzijusov bajt F = 71; // Simbol "F" - Farenhajtov bajt S = 1; // Simbol "-" je znak minus (ako je izmjerena vrijednost ispod nule) void setup () (// Izvodimo uređaj (7-segmentni displej) iz stanja mirovanja LC.shutdown (0, false); // Postavite svjetlinu zaslona na 8 // Ukupni mogući modovi svjetline od 0 do 15 LC.setIntensity (0, 8); // Očisti zaslon LC.clearDisplay (0); // Inicijalizacija senzora na I2C sabirnici ako ( BMP180Sensor.begin ()) (// Poruka za pomicanje - inicijalizacija senzora je uspješna msgScrolling (msgInitSuccess, sizeof (msgInitSuccess), delayScrolling);) else (dok (true) (// Poruka za pomicanje - inicijalizacija senzora neuspješna (msgInitScrolling), msgIF sizeof (msgInitFail), delayScrolling);))) void loop () (status char; dvostruki T, tCelsius, tFarenheit; // Početak mjerenja temperature // funkcija startTemperature () vraća broj milisekundi // od početka mjerenja proces, ako je proces mjerenja bio ispravan, // spremite ovu vrijednost u statusnu varijablu // Ako funkcija vrati 0, tada je proces mjerenja pr neispravan status = BMP180Sensor.startTemperature (); if (status! = 0) (// Pričekajte isti broj milisekundi kašnjenja (status); // Dobijte izmjerenu i obrađenu vrijednost temperature // u stupnjevima Celzijusa i pohranite je u T varijablu // getTemperature () funkciju vraća 1 ako je pozivanje // prošlo uspješno i 0 ako funkcija nije mogla inicijalizirati // varijablu T s izmjerenom vrijednošću status = BMP180Sensor.getTemperature (T); if (status! = 0) (// Dodjela vrijednosti varijablama // i obrada gradacija za Farenhajtovu skalu tCelsius = T; tFahrenheit = (9,0 / 5,0) * T + 32,0;)) // Obrada vrijednosti i // priprema poruke - temperatura TmsgPreparation (tCelsius, false); TmsgPreparation (tFarenhajt, istina); ) // Evo stvarne funkcije za skrolovanje spremnih poruka // s desna na lijevo / * * Parametri: * bajt msg - pokazivač na niz znakovnih podataka * int msgSize - veličina niza znakovnih podataka * int dScroll - kašnjenje pomicanje (pomicanje poruke ulijevo) * u milisekundama * / void msgScrolling (byte msg, int msgSize, int dScroll) (za (int i = 0; i< 8 + msgSize; i ++) { for(int n = i, j = 0; n >= 0, j< msgSize; n --, j ++) { LC.setRow(0, n, msg[j]); LC.setRow(0, n - 1, B00000000); } delay(dScroll); } } /* * Здесь функция подготовки сообщения, прежде чем оно будет выведено * для прокрутки на дисплее. Параметры: * double value - значение температуры двойной степени точности * bool degree - флаг для определения шкалы градуирования * если false - значит градусы Цельсия * если true - значит градусы Фаренгейта */ void TmsgPreparation(double value, bool degree) { //Приводим к абсолютному значению и сохраняем в переменной T //Это унифицирует значение и сократит код функции вдвое double T = abs(value); //Здесь значение фильтруется, если есть отклонение на пол градуса //от нуля то всё равно формировать сообщение что температура равна 0 //Итак, если замеренная температура меньше 0.5 то ставим 0 if(T < 0.5) { //Резервируем символьный массив на три символа byte preMsg; //Первый символ - это естественно 0 preMsg = Digit; //Второй символ - это сгенерированный символ "градус" preMsg = deg; //Проверка флага градуировки if(degree) { //Если true - то это градусы Фаренгейта //и третий символ в массиве будет содержать //сгенерированный символ F(код 71) preMsg = F; } else { //Иначе, если true - то это градусы Цельсия //и третий символ в массиве будет содержать //сгенерированный символ С(код 78) preMsg = C; } //Отправляем указатель на проинициализированный символьный массив preMsg //в качестве первого параметра функции для прокрутки сообщений //второй параметр - это размер символьного массива preMsg //третий параметр - задержка сдвига(прокрутки влево) в миллисекундах msgScrolling(preMsg, sizeof(preMsg), delayScrolling); //После прокрутки сообщения покинуть тело функции return; } //Если больше 0.5 но меньше 1 if(T < 1) { byte preMsg; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } //Здесь нужно знать показания температуры //Отрицательные или положительные, //если отрицательные - добавить отрисовку знака минус if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 1 но меньше 10 if(T < 10) { byte preMsg; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 10 но меньше 100 if(T < 100) { byte preMsg; preMsg = Digit; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } //Если больше 100 но меньше 1000 if(T < 1000) { byte preMsg; preMsg = Digit; preMsg = Digit; preMsg = pDigit; preMsg = Digit; preMsg = deg; if(degree) { preMsg = F; } else { preMsg = C; } if(value < 0) { byte rdyMsg; //В первый байт массива символов сообщения //записываем знак rdyMsg = S; //Далее - слияние массивов в готовое сообщение for(int i = 1; i < sizeof(rdyMsg); i ++) { // rdyMsg[i] = preMsg; } msgScrolling(rdyMsg, sizeof(rdyMsg), delayScrolling); return; } else { msgScrolling(preMsg, sizeof(preMsg), delayScrolling); return; } } }

Također bih želio reći da u standardnoj biblioteci LedControl nisu pronađene funkcije pomicanja, možda ćemo mi biti ti koji će dodati ovu biblioteku? Pa, sve ovisi o željama naših posjetitelja, komentirajte, probajte, postavljajte pitanja... Čekamo vaše povratne informacije. Video skice je također priložen ovom članku, da vidimo rezultate skice:


Omogućite javascript da bi komentari radili.

BMP085 je senzor za praćenje barometarskog pritiska (osim toga, prati i temperaturu).

Senzor se koristi u mnogim projektima, uključujući i one koji koriste Arduino, jer praktički nema analoga. Osim toga, također je jeftin. Prvo pitanje koje se postavlja je: zašto bi iko mjerio atmosferski pritisak? Dva su razloga za to. Prvi je kontrola visine. Sa povećanjem nadmorske visine, pritisak opada. Veoma je pogodan za planinarenje, kao alternativa GPS navigatorima. Osim toga, indikator atmosferskog tlaka se koristi za predviđanje vremena.

BMP085 je svojevremeno zamijenjen senzorom BMP180, koji se povezuje na Arduino i druge mikrokontrolere na isti način kao i njegov prethodnik, ali je u isto vrijeme manji i jeftiniji.

Specifikacije BMP085

  • Opseg osjetljivosti: 300-1100 hPa (9000 m - 500 m nadmorske visine);
  • Rezolucija: 0,03 hPa / 0,25 m;
  • Radna temperatura -40 do + 85 °C, tačnost mjerenja temperature + -2 °C;
  • I2c konekcija;
  • V1 na modulu koristi 3.3V napajanje i logičku snagu;
  • V2 na modulu koristi 3,3-5 V napajanje i logičku snagu;

Nakon ponovnog pokretanja Arduino IDE, možete pokrenuti prvi primjer skice, kod za koji je dat u nastavku:

#include & ltWire.h & gt

#include & ltAdafruit_Sensor.h & gt

#include & ltAdafruit_BMP085_U.h & gt

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified (10085);

void setup (void)

Serial.begin (9600);

Serial.println ("Test senzora pritiska"); Serial.println ("");

/ * Inicijalizirajte senzor * /

if (! bmp.begin ())

/ * Ako se pojavi natpis: "Došlo je do problema pri otkrivanju BMP085 ...",

Provjerite je li senzor ispravno povezan * /

Serial.print ("Ups, nije otkriven BMP085... Provjerite svoje ožičenje ili I2C ADDR!");

senzors_event_t događaj;

bmp.getEvent (& događaj);

/ * prikaz rezultata (barometarski pritisak se mjeri u hPa) * /

ako (događaj.pritisak)

/ * Prikaz atmosferskog pritiska u hPa * /

Serial.print ("Pritisak:"); Serial.print (događaj.pritisak); Serial.println ("hPa");

Otvorite prozor serijskog monitora (brzina prijenosa - 9600). Naša skica bi trebala dati podatke o tlaku u hPa (hektopaskalima). Funkcionalnost senzora možete testirati pritiskom prsta na senzor. Na slici su prikazane vrijednosti pritiska nakon pritiska prstom.


Mjerenje visine iznad nivoa mora

Verovatno znate da pritisak opada sa povećanjem nadmorske visine. Odnosno, možemo izračunati visinu znajući pritisak i temperaturu. Opet ćemo matematiku ostaviti iza kulisa. Ako ste zainteresovani za proračune, možete se upoznati sa njima na ovoj stranici Wikipedije.

Primjer ispod će koristiti dodatnu Arduino biblioteku. Da biste izračunali nadmorsku visinu pomoću senzora BMP085, ažurirajte funkciju "void loop ()". Potrebne promjene na skici prikazane su na skici ispod. Ovo će vam dati očitavanje temperature na osnovu nivoa pritiska i očitavanja temperature.

/ * kreirajte novi događaj za senzor * /

senzors_event_t događaj;

bmp.getEvent (& događaj);

/ * prikaz rezultata (barometarski pritisak u hPa) * /

ako (događaj.pritisak)

/ * prikaz atmosferskog pritiska u hPa * /

Serial.print ("Pritisak:");

Serial.print (događaj.pritisak);

Serial.println ("hPa");

/ * da biste izračunali visinu sa određenom preciznošću, morate znati *

* prosječni pritisak i temperatura okoline

* u stepenima Celzijusa u vrijeme mjerenja *

* ako nemate ove podatke, možete koristiti "zadanu vrijednost",

* što je jednako 1013,25 hPa (ova vrijednost je definirana kao

* SENSORS_PRESSURE_SEALEVELHPA *

* u datoteci sensors.h). Ali rezultati neće biti tačni *

* tražene vrijednosti možete pronaći na web stranicama s prognozama temperature *

* ili na resursima informativnih centara na velikim aerodromima *

* npr. za Pariz, Francuska, trenutni prosječni pritisak se može pronaći *

* na web stranici: http://bit.ly/16Au8ol * /

/ * dobijte trenutnu vrijednost temperature od senzora BMP085 * /

temperatura plutanja;

bmp.getTemperature (& temperatura);

Serial.print ("Temperatura:");

Serial.print (temperatura);

Serial.println ("C");

/ * pretvoriti primljene podatke u visinu * /

/ * ažuriraj sljedeći red da odražava trenutne vrijednosti * /

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print ("Visina:");

Serial.print (bmp.pressureToAltitude (seaLevelPressure,

Serial.println ("m");

Serial.println ("");

Serial.println ("Greška senzora");

Pokrećemo skicu i vidimo izračunatu visinu iznad nivoa mora.

Preciznost očitavanja BMP085 može se značajno povećati podešavanjem prosječne vrijednosti pritiska, koja varira u zavisnosti od vremena. Svaki 1 hPa pritiska koji nismo uzeli u obzir dovodi do greške od 8,5 metara!

Na slici ispod prikazane su vrijednosti pritiska iz jednog od informativnih izvora evropskog aerodroma. Vrijednost pritiska je označena žutom bojom, što možemo koristiti za preciziranje rezultata.


Promijenimo sljedeći red u našoj skici, upisujući stvarnu vrijednost (1009 hPa) u nju:

float seaLevelPrissure = 1009;

Kao rezultat toga, dobićemo malo drugačije rezultate:

Savjet: kada specificirate pritisak, obavezno konvertujte podatke koji se koriste u hPa.

Korištenje BMP085 (API v1)

Ponovimo još jednom: da biste saznali pritisak i nadmorsku visinu iznad nivoa mora, potrebno je izvršiti neke proračune. Ali svi su već uključeni u Adafruit_BMP085 Arduino biblioteku (API v1), koju možete preuzeti sa linka.

Nakon instaliranja biblioteka, potrebno je ponovo pokrenuti Arduino IDE

Nakon ponovnog pokretanja, možete pokrenuti prvi primjer skice:

#include & ltWire.h & gt

Adafruit_BMP085 bmp;

Serial.begin (9600);

Serial.println ("* C");

Serial.print ("Pritisak =");

Serial.println ("Pa");

Serial.println ();

Nakon flešovanja vašeg Arduina, otvorite serijski monitor. Podesite brzinu prenosa na 9600. Skica će prikazati temperaturu u stepenima Celzijusa i pritisak u paskalima. Ako stavite prst na senzorski element senzora, temperatura i pritisak će se povećati:


Mjerenje nadmorske visine (API v1)

Da kontrolišete nadmorsku visinu, samo pokrenite skicu ispod:

#include & ltWire.h & gt

#include & ltAdafruit_BMP085.h & gt

Adafruit_BMP085 bmp;

Serial.begin (9600);

Serial.print ("Temperatura =");

Serial.print (bmp.readTemperature ());

Serial.println ("* C");

Serial.print ("Pritisak =");

Serial.print (bmp.readPressure ());

Serial.println ("Pa");

// izračunati nadmorsku visinu na osnovu vrijednosti

// "standardni" barometarski pritisak jednak 1013,25 milibara = 101325 Pascal

Serial.print ("Visina =");

Serial.print (bmp.readAltitude ());

Serial.println ("metri");

Serial.println ();

Pokrenite skicu da prikažete rezultate:


Na osnovu gore navedenih očitavanja, nalazimo se na -21,5 metara nadmorske visine. Ali znamo da smo iznad mora! Sjećanje na isti problem kao kod korištenja API V2. Moramo uzeti u obzir vremenske prilike! UREDU. Pretpostavimo da smo pronašli dobru meteorološku web stranicu i tlak je 101,964 Pa. Otvorite primjer Primjeri-> BMP085test u Arduino IDE i uredite liniju koja je istaknuta na donjoj slici:


U ovaj red treba da unesete podatke o trenutnom pritisku. Nakon novog lansiranja, otkrit ćete da su se podaci dramatično promijenili i dobili smo 29,58 metara sa znakom plus, što je mnogo više kao istina.


Ostavite svoje komentare, pitanja i podijelite svoje lično iskustvo ispod. U raspravi se često rađaju nove ideje i projekti!

BMP180 je piezorezistivni senzor apsolutnog pritiska sa niskim šumom i visokom linearnošću, kao i podešavanjem velike brzine. U kalupu se nalazi MEMS senzor u obliku fleksibilne silikonske membrane koja pokriva komoru standardnim pritiskom. Na membrani se nalaze mjerači naprezanja, koji su povezani prema shemi mosta, i mijenjaju svoj otpor kada je membrana savijena. Savijanje membrane ovisi o razlici između tlaka okoline i tlaka u komori, a izlaz iz mosta za mjerenje naprezanja ovisi o tlaku okoline. Budući da parametri membrane i otpornika ovise o temperaturi, na kristalu se nalazi digitalni termometar čija se očitanja koriste za kompenzaciju podataka barometra, ali se mogu koristiti i samostalno. Ne preporučuje se korištenje podataka o temperaturi od drugih senzora za kompenzaciju podataka barometra. Termometar u BMP180 nalazi se na samom mjernom kristalu, mjeri temperaturu senzorskog elementa - stoga su njegova očitavanja najbliža temperaturi barometra i tačna. Barometar može raditi s maksimalnom preciznošću od 2 Pa (ako se koristi kao barometarski visinomjer, to odgovara pogrešci mjerenja visine od 17 cm).

specifikacije:

    Napon napajanja 1.62V - 3.6V.

    I2C interfejs za povezivanje.

    Preciznost do 0,02hPa (17cm).

    Raspon: 300hPa do 1100hPa (+ 9000m do -500m).

    Izlazni podaci: 16-bitni pritisak i temperatura

    rezolucija pritiska 0,01hPa

    temperaturna rezolucija 0,1 o S

Arduino primjer koda

#include
#include

/***************************************************
Ovo je primjer za BMP085 senzor barometarskog tlaka i temperature
Dizajniran posebno za rad sa Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
Ovi displeji koriste I2C za komunikaciju, za to su potrebna 2 pina
interfejs
Adafruit ulaže vrijeme i resurse pružajući ovaj otvoreni izvorni kod,
podržite Adafruit i hardver otvorenog koda kupovinom
proizvodi iz Adafruita!
Napisao Limor Fried / Ladyada za Adafruit Industries.
BSD licenca, sav gornji tekst mora biti uključen u svaku redistribuciju
****************************************************/

// Povežite VCC senzora BMP085 na 3.3V (NE 5.0V!)
// Spojite GND na uzemljenje
// Povežite SCL na i2c sat - na "168 /" 328 Arduino Uno / Duemilanove / itd. to je Analog 5
// Povežite SDA na i2c podatke - na "168 /" 328 Arduino Uno / Duemilanove / itd. to je Analog 4
// EOC se ne koristi, označava kraj konverzije
// XCLR je pin za resetiranje, također se ovdje ne koristi

Adafruit_BMP085 bmp;

Void setup () (
Serial.begin (9600);
if (! bmp.begin ()) (
Serial.println ("Nisam mogao pronaći važeći BMP085 senzor, provjerite ožičenje!");
dok (1) ()
}
}

Void petlja () (
Serial.print ("Temperatura =");
Serial.print (bmp.readTemperature ());
Serial.println ("* C");

Serial.print ("Pritisak =");
Serial.print (bmp.readPressure ());
Serial.println ("Pa");

// Izračunaj nadmorsku visinu uz pretpostavku "standardnog" barometrijskog
// pritisak od 1013,25 milibara = 101325 Pascal

Serial.print ("Visina =");
Serial.print (bmp.readAltitude ());
Serial.println ("metri");

Serial.print ("Pritisak na nivou brtve (izračunato) =");
Serial.print (bmp.readSealevelPressure ());
Serial.println ("Pa");

// možete dobiti preciznije mjerenje nadmorske visine
// ako znate trenutni pritisak na razini mora koji će
// variraju u zavisnosti od vremena i slično. Ako je 1015 milibara
// što je jednako 101500 Paskala.

Serial.print ("Realna visina =");
Serial.print (bmp.readAltitude ( 101500 ));
Serial.println ("metri");

Serial.println ();
kašnjenje (500);
}

Ova skica izlazi

  • Temperatura = xx.xx * C - Temperatura u stepenima Celzijusa
  • Pritisak = xx Pa - Atmosferski pritisak u Pascalima
  • Nadmorska visina = xx.xx metara - Visina u metrima
  • Pritisak na nivou mora (izračunati) = xx Pa - Atmosferski pritisak u Paskalima (u odnosu na nivo mora (izračunati))
  • Realna visina = hh.hh metara - Realna visina (izračunata)

Da bi se atmosferski pritisak prikazao u mmHg, potrebno je promeniti nekoliko linija

Serial.print ("Pritisak =");

Serial.print (bmp.readPressure () / 133.322); // Rezultirajuća vrijednost u Pa je podijeljena sa 133,322 i dobijemo mm Hg.

Serial.println ("mm"); // i promijenite "Pa" u "mm" u skladu s tim

Serial.print ("Pritisak na nivou brtve (izračunato) =");

Serial.print (bmp.readSealevelPressure () / 133.322);

Serial.println ("mm");

BMP180 Podešavanje senzora

Atmosferski pritisak zavisi od mesta merenja, temperature vazduha i vremenskih prilika. Na nivou mora, prosječni godišnji atmosferski pritisak je p n = 1013,25 mbar = 101,325 kPa (normalan pritisak) pri prosječnoj godišnjoj temperaturi od 15 °C. A kada raste na svakih 8 m, atmosferski pritisak pada za 100 Pa = 1 mbar.

Može se dobiti preciznije mjerenje visine. Ako znamo trenutni pritisak iznad nivoa mora za naše koordinate. Da biste to učinili, trebate saznati našu stvarnu visinu iznad razine mora pomoću Google mapa, na koje idemo veza... U prozoru sa mapom od Google-a pronalazimo našu lokaciju i klikom na lijevu tipku miša stavljamo oznaku na kartu i dobijamo podatke o nadmorskoj visini za našu tačku. Također, ne zaboravite uzeti u obzir na kojem se spratu nalazimo i našim podacima dodati visinu spratova.

Normalni atmosferski pritisak na nivou mora je približno 101,3 kPa ili 101,325 Pa. Lakše je dobiti željenu vrijednost pomoću online kalkulatora - Proračun atmosferskog tlaka na različitim visinama, a za prijevod sa (mmHg.) v (Pa) postoji jednostavna formula Pa = mmHg Art. * 133,322 ... Da bismo kalibrirali visinu, moramo izvršiti promjene na liniji

Serial. print (bmp. readAltitude (101500));

gdje umjesto vrijednosti 101500 unosimo našu izračunatu vrijednost.

Stvari na koje treba paziti

Pustite ga na zrak: Zapamtite da je BMP180 potreban ambijentalni zrak za mjerenje pritiska, tako da ga ne bi trebalo stavljati u zatvoreno kućište.

Ali ne previše vazduha: S druge strane, izlaganje brzim zračnim strujama ili vjetru može uzrokovati kratkoročne fluktuacije tlaka koje će utjecati na vaše očitavanje. Zaštitite uređaj od jakih strujanja zraka.

Raspon temperature: Budući da je za mjerenje tlaka potrebno precizno očitavanje temperature, pazite da ne izložite uređaj naglim promjenama temperature i držite ga dalje od vrućih dijelova i drugih izvora topline.

Vlaga: BMP180 je osjetljiv na vlagu i ne bi trebao doći u kontakt sa vodom.

svjetlo: Iznenađujuće, BMP180 senzor je osjetljiv na svjetlost koja može ući u uređaj kroz rupu na vrhu čipa. Za maksimalnu preciznost, zaštitite čip od ambijentalnog svjetla.