Bmp180 lidheni me arduino. Lidhja e sensorit BMP180 me Arduino

#përfshi #përfshi // Deklaroni një variabël për të hyrë në SFE_BMP180: presioni SFE_BMP180; #define ALTITUDE 1655.0 // lartësia mbi nivelin e detit në truk në metra konfigurimi i zbrazëtisë () (Serial.fillim (9600); Serial.println ("REBOOT"); // inicializimi nëse (presioni.fillimi ()) Serial. println ( "BMP180 init ok"); tjetër (// Nëse diçka nuk është rritur së bashku këtu. Si rregull, bllokimet me lidhje Serial.println ("BMP180 init fail \ n \ n"); ndërsa (1); // hang) ) void loop () (statusi char; T dyfishtë, P, p0, a; // Nëse doni të dini nivelin e detit, korrigjohet presioni i ajrit, i cili zakonisht përdoret në parashikimet e motit // Duhet të dini nivelin e detit në zonën tuaj ku matja // Duhet të specifikohet në konstantën ALTITUDE në fillim të kodit Serial.println (); Serial.print ("Niveli i detit:"); Serial.print (ALTITUDE, 0); Serial.print ("metra"); Serial .print (ALTITUDE * 3.28084,0); Serial.println ("këmbë"); // Nëse doni të dini lartësinë mbi nivelin e detit, por e dini presionin // ju duhet të tregoni presionin aktual atmosferik.Si ta bëni këtë shkruhet në fund të kodit ... // Meqenëse presioni varet disi anash nga temperatura, së pari duhet të zbuloni temperaturën // BMP180 ka një termometër të integruar. Duhet pak kohë për të matur temperaturën. // Nëse gjithçka është e qetë, presioni.startTemperature do të kthejë në status numrin e milisekondave // ​​që duhet të prisni për të matur temperaturën // Nëse ka ndonjë bllokim me tela, do të kthejë statusin 0 = presion.startTemperature () ; nëse (statusi! = 0) (// prisni: vonesë (statusi); // Merrni temperaturën, vendoseni në ndryshoren T: // Funksioni do të kthejë 1 nëse gjithçka është në rregull, 0 nëse jo në rregull statusi = presioni. getTemperature (T); nëse (statusi! = 0) (// shkruani temperaturën: Serial.print ("temperaturë:"); Serial.print (T, 2); Serial.print ("gradë C"); / / në Celsius Serial.print ((9.0 / 5.0) * T + 32.0,2); Serial.println ("gradë F"); // në Fahrenheit // Përcaktoni presionin atmosferik: // Parametri tregon rezolucionin, nga 0 deri në 3 (sa më e lartë të jetë rezolucioni, aq më e lartë saktësia, aq më e gjatë është pritja). // Nëse gjithçka është e qetë, presioni.startPressure do të kthejë në status numrin e milisekondave // ​​që duhet të prisni për të matur atm. presioni // Nëse ka ndonjë problem, ai do të kthejë statusin 0 = presion.startPressure ( 3); nëse (statusi! = 0) (// prisni përfundimin e matjes: vonesë (status); // Tani mundeni merrni presionin në variablin P. // Funksioni do të kthejë 1 nëse gjithçka është në rregull, 0 nëse jo OK.status = presion. getPressure (P, T); nëse (status! = 0) (// printoni gjithçka: Seri al.print ("presion absolut:"); Serial.print (P, 2); Serial.print ("milibar"); Serial.print (P * 0. 0295333727.2); Serial.println ("inç merkuri"); // sensori kthen atm. presioni, i cili ndryshon në varësi të lartësisë së sensorit. // Nëse e duam si në parashikimin e motit, atëherë duhet të bëjmë llogaritje të dyshimta // Parametrat: P = presioni nga sensori në milibar, ALTITUDE = lartësia në metra. // Rezultati: p0 = presioni i korrigjuar i nivelit të detit p0 = presioni.niveli i vulës (P, ALTITUDE); Serial.print ("Presioni në nivelin e detit:"); Serial.print (p0,2); Serial.print ("milibar"); Serial.print (p0 * 0.0295333727.2); Serial.println ("inç merkuri"); // Ose nëse dëshironi të bëni të kundërtën dhe të përcaktoni lartësinë nga presioni i njohur, // Parametrat: P = presioni nga transduktori në milibar, p0 = presioni i korrigjuar për nivelin e detit. // Rezultati: a = lartësia mbi nivelin e detit në metra. a = presioni.lartësia (P, p0); Serial.print ("lartësia e llogaritur mbi nivelin e detit:"); Serial.print (a, 0); Serial.print ("metra"); Serial.print (a * 3.28084,0); Serial.println ("këmbët"); ) else Serial.println ("gabim në marrjen e presionit \ n"); ) else Serial.println ("gabim në fillimin e marrjes së presionit \ n"); ) else Serial.println ("gabim në marrjen e temperaturës \ n"); ) else Serial.println ("gabim në fillimin e marrjes së temperaturës \ n"); vonesë (5000); // pauzë për 5 sekonda. )

Programi Arduino me komente:

/ * Skema e shembullit të bibliotekës SFE_BMP180

Kjo skicë tregon se si të përdoret biblioteka SFE_BMP180 për të lexuar
Sensori i presionit barometrik Bosch BMP180.
https://www.sparkfun.com/products/11824
Ashtu si shumica e sensorëve të presionit, BMP180 mat presionin absolut.
Ky është presioni aktual i ambientit që shihet nga pajisja, i cili do
ndryshojnë me lartësinë dhe motin.
Përpara se të bëni një lexim të presionit, duhet të bëni një matje të temperaturës.
Kjo bëhet me startTemperature () dhe getTemperature ().
Rezultati është në gradë C.
Pasi të keni një lexim të temperaturës, mund të bëni një lexim të presionit.
Kjo bëhet me startPressure () dhe getPressure ().
Rezultati është në milibar (mb) ose hectopascals (hPa).
Nëse do të monitoroni modelet e motit, ndoshta do të dëshironi
eliminojnë efektet e lartësisë. Kjo do të prodhojë lexime që mund
të krahasohen me leximet e publikuara të presionit nga vende të tjera.
Për ta bërë këtë, përdorni funksionin sealevel (). Ju do të duhet të siguroni
lartësia e njohur në të cilën është matur presioni.
Nëse dëshironi të matni lartësinë, do t'ju duhet të dini presionin
në një lartësi bazë. Kjo mund të jetë presion mesatar i nivelit të vulës, ose
një lexim i mëparshëm i presionit në lartësinë tuaj, në këtë rast
leximet e mëvonshme të lartësisë do të jenë + ose - vija bazë fillestare.
Kjo bëhet me funksionin lartësi () .

Lidhjet e harduerit:
- (GND) në GND
+ (Vin) në 5 V
Do t'ju duhet gjithashtu të lidhni kunjat I2C (SCL dhe SDA) me tuajin
Arduino. Kunjat janë të ndryshme në Arduinos të ndryshëm:
Çdo kunj Arduino e etiketuar: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, afati: 20 21
Leonardo: 2 3

Biblioteka SFE_BMP180 përdor ekuacione me pikë lundruese të zhvilluara nga
Projekti për regjistrimin e të dhënave të stacionit të motit: http://wmrx00.sourceforge.net/

V10 Mike Grusin, SparkFun Electronics 24/10/2013
V1.1.2 Përditësimet për Arduino 1.6.4 5/2015
*/

// Skica juaj duhet të #përfshijë këtë bibliotekë dhe bibliotekën Wire.
// (Wire është një bibliotekë standarde e përfshirë me Arduino.):

#përfshi
#përfshi
#përfshi

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

// Ju do të duhet të krijoni një objekt SFE_BMP180, i quajtur këtu "presioni":
Presioni SFE_BMP180;

konfigurimi i zbrazët ()
{
LCD.fillim (16, 2);
// Inicializoni sensorin (është e rëndësishme të ruani vlerat e kalibrimit në pajisje).
presioni.filloj ();
}

laku i zbrazët ()
{
statusi i karakterit;
T dyfishtë, P, p0 = 1013.0, a; // 1013.0 - presion në hPa në nivelin e detit

// Së pari duhet të merrni një matje të temperaturës për të kryer një lexim të presionit.
// Filloni një matje të temperaturës:

status = presion.fillimiTemperatura ();
nëse (statusi! = 0)
{
vonesa (statusi);

// Merrni matjen e përfunduar të temperaturës:
// Vini re se matja ruhet në variablin T.

statusi = presioni.getTemperatura (T);
nëse (statusi! = 0)
{
lcd.setCursor (0, 0);
lcd.print ("Temp =");
lcd.print (T, 2);
lcd.print ("C");
// Filloni një matje presioni:
// Parametri është cilësimi i mbikampionimit, nga 0 në 3 (rezolucion më i lartë, pritja më e gjatë).
// Nëse kërkesa është e suksesshme, numri i ms për të pritur kthehet.
// Nëse kërkesa është e pasuksesshme, 0 kthehet.

status = presion.fillimiPressure (3);
nëse (statusi! = 0)
{
// Prisni që matja të përfundojë:
vonesa (statusi);

// Merrni matjen e përfunduar të presionit:
// Vini re se matja ruhet në variablin P.
// Vini re gjithashtu se funksioni kërkon matjen e mëparshme të temperaturës (T).
// (Nëse temperatura është e qëndrueshme, mund të bëni një matje të temperaturës për një numër matjesh presioni.)
// Funksioni kthen 1 nëse është i suksesshëm, 0 nëse dështon.

status = presion.getPressure (P, T);
nëse (statusi! = 0)
{
// Shtypni matjen:
lcd.setCursor (0, 1);
lcd.print ("P =");
lcd.print (P / 1.333,0); // koefi. 1.333 - shndërrimi i hPa në mm Hg

// Nëse dëshironi të përcaktoni lartësinë tuaj nga leximi i presionit,
// përdorni funksionin e lartësisë së bashku me një presion bazë (niveli i detit ose ndonjë tjetër).
// Parametrat: P = presioni absolut në mb, p0 = 1013 presioni bazë në mb.
// Rezultati: a = lartësia në m.

a = presioni.lartësia (P, p0);
lcd.print ("H =");
lcd.print (a, 2);
lcd.print ("m");
}
else lcd.print ("gabim");
}
else lcd.print ("gabim");
}
else lcd.print ("gabim");
}
else lcd.print ("gabim");
vonesë (5000); // Ndalo për 5 sekonda.

Ditën e mirë të gjithëve, mirë ... thjesht filloni !!! Ky artikull ka të bëjë me lidhjen e një sensori të presionit barometrik BMP180 në një kompjuter të vetëm Arduino Uno, por jo aq e thjeshtë sa do të donim në shikim të parë. Ne do të shfaqim vlerat e temperaturës së matur dhe të konvertuar në një ekran me 7 segmente bazuar në drejtuesin MAX7219... Dhe ato do të shfaqen si një vijë zvarritëse nga dy njësi matëse të konvertuara - këto janë gradë Celsius dhe gradë Fahrenheit.

Sensori BMP180 nuk është vetëm një sensor i presionit barometrik, por edhe një sensor i temperaturës me saktësi të lartë. Kjo është një pajisje shumë e ndjeshme, në fund të artikullit do të shfaqet një video e përgjithshme, duke e parë të cilën mund të siguroheni se sa e ndjeshme është. Epo, më tej, ju mund të jepni karakteristikat e sensorit BMP180 :

  • Tensioni i furnizimit 3.3 volt
  • Konsumi aktual 5 mKA me një shkallë kampionimi prej 1 Hz
  • Ndërfaqja e lidhjes - I2C
  • Përhapja e saktësisë në presionin e matur + -0,12 hPa (+ -1 metër në lartësi)
  • Gama e matjes së temperaturës nga -40 * C deri në + 85 * C
  • Gama e matjes së presionit: nga 300 në 1100 hPa

Është koha për të lidhur sensorin me tabelën Arduino Uno, por meqenëse vlerat tona të matura dhe të konvertuara do të shfaqen në një ekran me 7 segmente, në diagramin e mëposhtëm do të tregojmë lidhjen e plotë të të gjitha pajisjeve, si dhe pikën kryesore të sensorit. BMP180 :

Në përgjithësi, nuk ka asgjë të komplikuar në diagramin e lidhjes, gjithçka është e dukshme dhe e kuptueshme, hapi tjetër është të kaloni në shkrimin e një skice. Disa pika të rëndësishme në zbatimin e vizualizimit të vlerave të matura dhe të konvertuara:

  • Shfaq vetëm vlerat e konvertuara të temperaturës (shih më poshtë pse)
  • Vlerat e temperaturës duhet të zbatohen në të dhjetat e një shkalle (siç shihet në foton paraprake)
  • Zbatoni paraqitjen zvarritëse
  • Prania e mesazheve diagnostikuese për statusin e sensorit gjatë ndezjes dhe inicializimit është e detyrueshme
  • Ne përdorim bibliotekën për të punuar me sensorin

Pse është ende e mundur të shfaqen vetëm vlerat e temperaturës ... Sigurisht, unë do të doja të mbuloja plotësisht të gjitha aftësitë e sensorit BMP180, por për vizualizimin në një ekran me 7 segmente, do të jetë e nevojshme të përdoren simbole më komplekse për shfaqjen e "vijave zvarritëse" në mesazhe sesa ato që mund të krijohen në të vërtetë duke përdorur module vizualizimi të këtij lloji. Prandaj, u vendos që të shfaqeshin vetëm vlerat e konvertuara të temperaturës, por në përgjithësi në përgjithësi, zakonisht rrallë dikush shikon leximet e presionit atmosferik kur, për shembull, shkon për një shëtitje. E megjithatë - nëse dikush dëshiron të studiojë më në detaje se si të punojë me sensorin BMP180, atëherë ka dy shembuj në bibliotekën e shtojcave që mund të shpjegojnë më në detaje se si të merrni dhe konvertoni presionin dhe temperaturën duke përdorur këtë sensor.

Si rezultat, u krijua skica e mëposhtme, me komentet e zhvilluesit:

#include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" // Prototipi i funksionit për lëvizjen e mesazhit msgScrolling () void msgScrolling (byte msg, int msgSize, int dScroll); // Prototipi i funksionit për përpunimin e të dhënave të temperaturës // dhe përgatitjen e një mesazhi void TmsgPreparation (vlerë e dyfishtë, shkallë bool); // Krijo një objekt LC të klasës LedControl për të punuar me ekranin LedControl LC = LedControl (12, 11, 10, 8); // Krijo një objekt BMP180Sensor të klasës SFE_BMP180 për të punuar me SFE_BMP180 BMP180Sensor; // Vonesa kohore për vizatimin e karaktereve gjatë lëvizjes const int delayScrolling = 300; // Mesazhi "Inicializimi i sensorit me sukses" byte msgInitSuccess = (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 91, 28, 13, 13, 79, 91, 91); // Mesazhi "Inicializimi i sensorit është i pasuksesshëm" byte msgInitFail = (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 71, 119, 48, 14); // Grup karakteresh numerike pa bajt me pika Shifra = (126, 48, 109, 121, 51, 91, 95, 112, 127, 123); // Vargu i karaktereve numerike me një bajt me pika pDigit = (254, 176, 237, 249, 179, 219, 223, 240, 255, 251); // Simbolet byte deg = 99; // Simboli për bajtin "gradë" C = 78; // Simboli "C" - bajt Celsius F = 71; // Simboli "F" - byte Fahrenheit S = 1; // Simboli "-" është një shenjë minus (nëse vlera e matur është nën zero) konfigurimi i zbrazët () (// Ne e nxjerrim pajisjen (ekrani me 7 segmente) nga modaliteti i fjetjes LC.shutdown (0, false); ( BMP180Sensor.begin ()) (// Mesazh për lëvizje - inicializimi i sensorit është i suksesshëm msgLëvizja (msgInitSuccess, madhësia e (msgInitSuccess), vonesëScrolling);) else (ndërsa (e vërtetë) (// Mesazhi për lëvizje - inicializimi i sensorit pasuksesshëm (msgInitSuccess) sizeof (msgInitFail), delayScrolling);))) void loop () (statusi char; T dyfishtë, tCelsius, tFahrenheit; // Fillimi i matjes së temperaturës // funksioni startTemperature () kthen numrin e milisekondave // ​​nga fillimi i matjes procesi, nëse procesi i matjes ishte i saktë, // ruajeni këtë vlerë në ndryshoren e statusit // Nëse funksioni kthen 0, atëherë procesi i matjes është pr statusi i shkuar gabim = BMP180Sensor.startTemperature (); nëse (statusi! = 0) (// Prisni për të njëjtin numër milisekonda vonese (status); // Merrni vlerën e temperaturës së matur dhe të përpunuar // në gradë Celsius dhe ruajeni në funksionin T // getTemperature () kthen 1 nëse thirrja // kaloi me sukses, dhe 0 nëse funksioni nuk mund të inicializojë // variablin T me statusin e vlerës së matur = BMP180Sensor.getTemperature (T); nëse (statusi! = 0) (// Caktimi i një vlere variablave // ​​dhe përpunimi i gradimeve për shkallën Fahrenheit tCelsius = T; tFahrenheit = (9.0 / 5.0) * T + 32.0;)) // Përpunimi i vlerës dhe // përgatitja e mesazhit - temperatura TmsgPergatitja (tCelsius, false); TmsgPërgatitja (tFahrenheit, e vërtetë); ) // Këtu është funksioni aktual për lëvizjen e mesazheve të gatshme // nga e djathta në të majtë / * * Parametrat: * msg bajt - treguesi në një grup të dhënash karakteresh * int msgSize - madhësia e grupit të të dhënave të karaktereve * int dScroll - vonesë lëvizja (duke zhvendosur mesazhin majtas) * në milisekonda * / mesazh i pavlefshëm Lëvizja (msg byte, int msgSize, int dScroll) (për (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; } } }

Dua të them gjithashtu se në bibliotekën standarde LedControl nuk u gjet asnjë funksion lëvizës, ndoshta do të jemi ne ata që do ta shtojmë këtë bibliotekë? Epo, gjithçka varet nga dëshirat e vizitorëve tanë, komentoni, provoni, bëni pyetje ... Ne jemi duke pritur për komentet tuaja. Një video e skicës i është bashkangjitur edhe këtij artikulli, le të shohim rezultatet e skicës:


Ju lutemi aktivizoni javascript që komentet të funksionojnë.

BMP085 është një sensor për monitorimin e presionit barometrik (përveç kësaj, ai gjithashtu monitoron temperaturën).

Sensori përdoret në shumë projekte, përfshirë ato që përdorin Arduino, pasi praktikisht nuk ka analoge. Përveç kësaj, është gjithashtu i lirë. Pyetja e parë që lind është: pse dikush do të matë presionin atmosferik? Ka dy arsye për këtë. E para është të kontrolloni lartësinë. Me rritjen e lartësisë, presioni bie. Është shumë i përshtatshëm për shëtitje, si një alternativë ndaj navigatorëve GPS. Për më tepër, treguesi i presionit atmosferik përdoret për të parashikuar motin.

BMP085 u zëvendësua në një kohë nga sensori BMP180, i cili lidhet me Arduino dhe mikrokontrollues të tjerë në të njëjtën mënyrë si paraardhësi i tij, por në të njëjtën kohë është më pak dhe kushton më pak.

Specifikimet BMP085

  • Gama e ndjeshmërisë: 300-1100 hPa (9000 m - 500 m mbi nivelin e detit);
  • Rezolucioni: 0,03 hPa / 0,25 m;
  • Temperatura e punës -40 deri + 85 ° C, saktësia e matjes së temperaturës + -2 ° C;
  • Lidhja I2c;
  • V1 në modul përdor fuqi 3.3V dhe fuqi logjike;
  • V2 në modul përdor fuqi 3.3-5 V dhe fuqi logjike;

Pas rinisjes së Arduino IDE, mund të ekzekutoni shembullin e parë të skicës, kodi për të cilin jepet më poshtë:

#include & ltWire.h & gt

#include & ltAdafruit_Sensor.h & gt

#include & ltAdafruit_BMP085_U.h & gt

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified (10085);

konfigurimi i zbrazët (i zbrazët)

Seriali.fillimi (9600);

Serial.println ("Testi i sensorit të presionit"); Serial.println ("");

/ * Inicializoni sensorin * /

nëse (! bmp.begin ())

/ * Nëse shfaqet një mbishkrim: "Kishte një problem me zbulimin e BMP085 ...",

Kontrolloni nëse sensori është lidhur saktë * /

Serial.print ("Ooops, nuk u zbulua BMP085 ... Kontrollo instalimet elektrike ose I2C ADDR!");

sensors_event_t ngjarje;

bmp.getEvent (& ngjarje);

/ * shfaq rezultatet (presioni barometrik matet në hPa) * /

nëse (ngjarja.presioni)

/ * Shfaq presionin atmosferik në hPa * /

Serial.print ("Presion:"); Serial.print (ngjarje.presioni); Serial.println ("hPa");

Hapni dritaren e monitorit serik (shkalla e zhurmës - 9600). Skica jonë duhet të nxjerrë të dhënat e presionit në hPa (hectopascals). Mund të testoni funksionalitetin e sensorit duke shtypur gishtin mbi sensor. Figura tregon vlerat e presionit pas shtypjes me gisht.


Matja e lartësisë mbi nivelin e detit

Ju ndoshta e dini se presioni bie me rritjen e lartësisë. Kjo do të thotë, ne mund të llogarisim lartësinë duke ditur presionin dhe temperaturën. Përsëri, matematikën do ta lëmë prapa skenave. Nëse jeni të interesuar për llogaritjet, mund të njiheni me to në këtë faqe Wikipedia.

Shembulli më poshtë do të përdorë bibliotekën shtesë Arduino. Për të llogaritur lartësinë duke përdorur sensorin BMP085, përditësoni funksionin "void loop ()". Ndryshimet e nevojshme në skicë janë paraqitur në skicën më poshtë. Kjo do t'ju japë një lexim të temperaturës bazuar në nivelin e presionit dhe leximin e temperaturës.

/ * krijoni një ngjarje të re për sensorin * /

sensors_event_t ngjarje;

bmp.getEvent (& ngjarje);

/ * shfaq rezultatet (presioni barometrik në hPa) * /

nëse (ngjarja.presioni)

/ * shfaq presionin atmosferik në hPa * /

Serial.print ("Presion:");

Serial.print (ngjarje.presioni);

Serial.println ("hPa");

/ * për të llogaritur lartësinë me një saktësi të caktuar, duhet të dini *

* Presioni mesatar dhe temperatura e ambientit

* në gradë Celsius në kohën e leximit *

* nëse nuk i keni këto të dhëna, mund të përdorni "vlerën e paracaktuar",

* që është e barabartë me 1013.25 hPa (kjo vlerë përcaktohet si

* SENSORS_PRESSURE_SEALEVELHPA *

* në skedarin sensorë.h). Por rezultatet nuk do të jenë të sakta *

* Vlerat e kërkuara mund të gjenden në faqet e internetit me parashikimet e temperaturës *

* ose në burimet e qendrave të informacionit në aeroporte të mëdha *

* p.sh. për Parisin, Francën, mund të gjendet presioni mesatar aktual *

* në faqen e internetit: http://bit.ly/16Au8ol * /

/ * merrni vlerën aktuale të temperaturës nga sensori BMP085 * /

temperatura e notit;

bmp.getTemperatura (& temperatura);

Serial.print ("Temperatura:");

Serial.printim (temperaturë);

Serial.println ("C");

/ * konvertoni të dhënat e marra në lartësi * /

/ * përditësoni rreshtin tjetër për të pasqyruar vlerat aktuale * /

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print ("Lartësia:");

Printimi serial (bmp.presioni në lartësi (shtypja e nivelit të detit,

Serial.println ("m");

Serial.println ("");

Serial.println ("Gabimi i sensorit");

Nisim skicën dhe shohim lartësinë e llogaritur mbi nivelin e detit.

Saktësia e leximeve të BMP085 mund të rritet ndjeshëm duke rregulluar vlerën mesatare të presionit, e cila ndryshon me motin. Çdo 1 hPa presion që nuk kemi marrë parasysh çon në një gabim prej 8.5 metrash!

Figura më poshtë tregon vlerat e presionit nga një nga burimet e informacionit të aeroportit evropian. Vlera e presionit është e theksuar me të verdhë, të cilën mund ta përdorim për të përmirësuar rezultatet.


Le të ndryshojmë rreshtin e mëposhtëm në skicën tonë, duke shkruar vlerën aktuale (1009 hPa) në të:

float seaLevelPressure = 1009;

Si rezultat, ne do të marrim rezultate paksa të ndryshme:

Këshillë: kur specifikoni presionin, sigurohuni që të konvertoni të dhënat e përdorura në hPa.

Duke përdorur BMP085 (API v1)

Le të përsërisim edhe një herë: për të zbuluar presionin dhe lartësinë mbi nivelin e detit, duhet të bëni disa llogaritje. Por të gjitha janë përfshirë tashmë në Adafruit_BMP085 Arduino Library (API v1), të cilën mund ta shkarkoni nga lidhja.

Pas instalimit të bibliotekave, duhet të rinisni Arduino IDE

Pas rindezjes, mund të ekzekutoni shembullin e parë të skicës:

#include & ltWire.h & gt

Adafruit_BMP085 bmp;

Seriali.fillimi (9600);

Serial.println ("* C");

Serial.print ("Presioni =");

Serial.println ("Pa");

Serial.println ();

Pasi të ndizni Arduino-n tuaj, hapni monitorin tuaj serial. Vendosni shpejtësinë e zhurmës në 9600. Skica do të nxjerrë temperaturën në gradë Celsius dhe presionin në Pascal. Nëse vendosni gishtin në elementin ndijor të sensorit, temperatura dhe presioni do të rriten:


Matja e lartësisë (API v1)

Për të kontrolluar lartësinë, thjesht ekzekutoni skicën më poshtë:

#include & ltWire.h & gt

#include & ltAdafruit_BMP085.h & gt

Adafruit_BMP085 bmp;

Seriali.fillimi (9600);

Serial.print ("Temperatura =");

Serial.print (bmp.readTemperature ());

Serial.println ("* C");

Serial.print ("Presioni =");

Serial.print (bmp.readPressure ());

Serial.println ("Pa");

// llogarit lartësinë në bazë të vlerave

// Presioni barometrik "standard" i barabartë me 1013.25 milibar = 101325 Pascal

Serial.print ("Lartësia =");

Serial.print (bmp.readAltitude ());

Serial.println ("metra");

Serial.println ();

Drejtoni skicën për të shfaqur rezultatet:


Në bazë të leximeve të mësipërme jemi në -21.5 metra mbi nivelin e detit. Por ne e dimë që jemi mbi det! Duke kujtuar të njëjtin problem si kur përdorni API V2. Duhet të kemi parasysh motin! NE RREGULL. Supozoni se kemi gjetur një faqe interneti të mirë meteorologjike dhe presioni është 101.964 Pa. Hapni shembullin Shembuj-> BMP085test në Arduino IDE dhe modifikoni rreshtin që është theksuar në figurën më poshtë:


Në këtë rresht duhet të futni të dhënat e presionit aktual. Pas një nisjeje të re, do të zbuloni se të dhënat kanë ndryshuar në mënyrë dramatike dhe kemi marrë 29.58 metra me një shenjë plus, që është shumë më tepër si e vërteta.


Lini komentet, pyetjet tuaja dhe ndani përvojën tuaj personale më poshtë. Idetë dhe projektet e reja lindin shpesh në diskutim!

BMP180 është një sensor presioni absolut piezorezistues me zhurmë të ulët dhe linearitet të lartë, si dhe konfigurim të shpejtësisë së lartë. Prerja përmban një sensor MEMS në formën e një membrane silikoni fleksibël që mbulon dhomën me presion standard. Në membranë ka matës sforcimi, të cilët lidhen sipas skemës së urës dhe ndryshojnë rezistencën e tyre kur membrana është e përkulur. Përkulja e diafragmës varet nga diferenca midis presionit të ambientit dhe presionit në dhomë, dhe dalja nga ura e matësit të tendosjes varet nga presioni i ambientit. Meqenëse parametrat e membranës dhe rezistorëve varen nga temperatura, një termometër dixhital ndodhet në kristal, leximet e të cilit përdoren për të kompensuar të dhënat e barometrit, por gjithashtu mund të përdoren në mënyrë të pavarur. Nuk rekomandohet përdorimi i të dhënave të temperaturës nga sensorë të tjerë për të kompensuar të dhënat e barometrit. Termometri në BMP180 ndodhet në vetë kristalin matës, ai mat temperaturën e elementit të sensorit - prandaj leximet e tij janë më afër temperaturës së barometrit dhe janë të sakta. Barometri mund të funksionojë me një saktësi maksimale prej 2 Pa (nëse përdoret si një lartësimatës barometrik, kjo korrespondon me një gabim të matjes së lartësisë prej 17 cm).

Specifikimet:

    Tensioni i furnizimit 1.62V - 3.6V.

    Ndërfaqja e lidhjes I2C.

    Saktësia deri në 0,02hPa (17cm).

    Gama: 300hPa deri në 1100hPa (+ 9000m deri në -500m).

    Të dhënat e daljes: Presioni dhe temperatura 16 bit

    Rezolucioni i presionit 0.01hPa

    Rezolucioni i temperaturës 0,1 о С

Kodi Shembull Arduino

#përfshi
#përfshi

/***************************************************
Ky është një shembull për sensorin barometrik të presionit dhe temperaturës BMP085
Projektuar posaçërisht për të punuar me Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
Këto ekrane përdorin I2C për të komunikuar, për të cilat kërkohen 2 kunja
ndërfaqe
Adafruit investon kohë dhe burime duke siguruar këtë kod me burim të hapur,
ju lutemi mbështesni Adafruit dhe harduerin me burim të hapur duke blerë
produkte nga Adafruit!
Shkruar nga Limor Fried / Ladyada për Adafruit Industries.
Licenca BSD, i gjithë teksti i mësipërm duhet të përfshihet në çdo rishpërndarje
****************************************************/

// Lidhni VCC të sensorit BMP085 në 3.3V (JO 5.0V!)
// Lidhni GND me Tokën
// Lidhni SCL me orën i2c - në "168 /" 328 Arduino Uno / Duemilanove / etj. është Analog 5
// Lidhni SDA me të dhënat i2c - në "168 /" 328 Arduino Uno / Duemilanove / etj që është Analog 4
// EOC nuk përdoret, nënkupton përfundimin e konvertimit
// XCLR është një kunj rivendosjeje, gjithashtu nuk përdoret këtu

Adafruit_BMP085 bmp;

Konfigurimi i zbrazët () (
Seriali.fillimi (9600);
nëse (! bmp.begin ()) (
Serial.println ("Nuk mund të gjeja një sensor të vlefshëm BMP085, kontrolloni instalimet elektrike!");
ndërsa (1) ()
}
}

Cikli i zbrazët () (
Serial.print ("Temperatura =");
Serial.print (bmp.readTemperature ());
Serial.println ("* C");

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

// Llogaritni lartësinë duke supozuar barometrike "standarde".
// presion prej 1013.25 milibar = 101325 Pascal

Serial.print ("Lartësia =");
Serial.print (bmp.readAltitude ());
Serial.println ("metra");

Serial.print ("Presioni në nivelin e vulës (llogaritur) =");
Serial.print (bmp.readSealevelPressure ());
Serial.println ("Pa");

// ju mund të merrni një matje më të saktë të lartësisë
// nëse e dini presionin aktual të nivelit të detit i cili do
// ndryshojnë me motin dhe të tilla. Nëse është 1015 milibar
// që është e barabartë me 101500 Pascals.

Serial.print ("Lartësia reale =");
Serial.print (bmp.readAltitude ( 101500 ));
Serial.println ("metra");

Serial.println ();
vonesë (500);
}

Kjo skicë rezulton

  • Temperatura = xx.xx * C - Temperatura në gradë Celsius
  • Presioni = xx Pa - Presioni atmosferik në Pascals
  • Lartësia = xx.xx metra - Lartësia në metra
  • Presioni në nivelin e detit (i llogaritur) = xx Pa - Presioni atmosferik në Pascals (në raport me nivelin e detit (llogaritur))
  • Lartësia reale = хх.хх metra - Lartësia reale (e llogaritur)

Për të shfaqur presionin atmosferik në mmHg, duhet të ndryshohen disa rreshta

Serial.print ("Presioni =");

Serial.print (bmp.readPressure () / 133.322); // Vlera që rezulton në Pa ndahet me 133.322 dhe marrim mm Hg.

Serial.println ("mm"); // dhe ndryshoni "Pa" në "mm" në përputhje me rrethanat

Serial.print ("Presioni në nivelin e vulës (llogaritur) =");

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

Serial.println ("mm");

Konfigurimi i sensorit BMP180

Presioni atmosferik varet nga vendi i matjes, temperatura e ajrit dhe moti. Në nivelin e detit, presioni mesatar vjetor atmosferik është p n = 1013,25 mbar = 101,325 kPa (presion normal) në një temperaturë mesatare vjetore prej 15 ° C. Dhe kur rritet për çdo 8 m, presioni atmosferik bie me 100 Pa = 1 mbar.

Mund të merret një matje më e saktë e lartësisë. Nëse e dimë presionin aktual mbi nivelin e detit për koordinatat tona. Për ta bërë këtë, ju duhet të zbuloni lartësinë tonë reale mbi nivelin e detit duke përdorur hartat nga Google, për këtë ne shkojmë lidhje... Në dritaren me një hartë nga Google, gjejmë vendndodhjen tonë dhe klikojmë butonin e majtë të miut për të vendosur një shenjë në hartë dhe marrim të dhëna për lartësinë mbi nivelin e detit për pikën tonë. Gjithashtu, mos harroni të merrni parasysh se në cilin kat ndodhemi dhe të shtoni lartësinë e kateve në të dhënat tona.

Presioni normal atmosferik në nivelin e detit është afërsisht 101.3 kPa ose 101,325 Pa. Është më e lehtë për të marrë vlerën e dëshiruar duke përdorur kalkulatorin në internet - Llogaritja e presionit atmosferik në lartësi të ndryshme, dhe për përkthim nga (mmHg.) v (Pa) ka një formulë të thjeshtë Pa = mmHg Art. * 133,322 ... Për të kalibruar lartësinë, duhet të bëjmë ndryshime në vijë

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

ku në vend të vlerës 101500 futim vlerën tonë të llogaritur.

Gjërat për t'u kujdesur

Jepini ajër: Mos harroni se BMP180 ka nevojë për ajër të ambientit për të matur presionin e tij, kështu që nuk duhet të vendoset në një mbyllje të mbyllur.

Por jo shumë ajër: Nga ana tjetër, ekspozimi ndaj rrymave të ajrit me lëvizje të shpejtë ose erës mund të shkaktojë luhatje afatshkurtëra të presionit që do të ndikojnë në leximin tuaj. Mbroni pajisjen nga rrymat e forta të ajrit.

Shkallë temperature: Për shkak se një lexim i saktë i temperaturës është i nevojshëm për të matur presionin, kini kujdes që të mos e nënshtroni pajisjen ndaj ndryshimeve të papritura të temperaturës dhe ta mbani larg pjesëve të nxehta dhe burimeve të tjera të nxehtësisë.

Lagështia: BMP180 është e ndjeshme ndaj lagështirës dhe nuk duhet të bie në kontakt me ujin.

Drita:Çuditërisht, sensori BMP180 është i ndjeshëm ndaj dritës që mund të hyjë në pajisje përmes vrimës në krye të çipit. Për saktësi maksimale, mbroni çipin nga drita e ambientit.