Povezava BMP180 z Arduinom.

Vikhovatelu

Barometer je naprava, ki zaznava atmosferski tlak.

Je kot pritisk vetra, kot pritisk na nas z vseh strani.


Že v šolah vemo, da je prvi barometer plošča z živim srebrom in v njej obrnjena epruveta. Avtor te naprave je bil Evangelista Torricelli, italijanski fizik in matematik. Odčitke živosrebrnega barometra je mogoče jemati tako preprosto kot odčitke alkoholnega termometra: večji kot je tlak v bučki, večja je koncentracija živega srebra v njeni sredini.

Hlapi živega srebra so, kot veste, zelo močni.

Kasneje se je pojavila brezskrbna naprava - aneroidni barometer.

V tem barometru je bilo živo srebro nadomeščeno z valovito škatlo iz tankega jekla, ki je bila zasnovana za razredčenje.


Ko vstopi atmosfera, se škatla skrči in prek sistema ključev obrne puščico na številčnici.

Razpoložljivim senzorjem, ki se pogosto uporabljajo v talnih regulatorjih in v različnih vrstah lastno izdelanih elektronskih naprav, lahko dodate senzorje podjetja BOSH: BMP085 in BMP180.


Drugi barometer je nov, a precej nor na staro različico.

  • Nekatere pomembne značilnosti BMP180:
  • območje vibracijskih vrednosti: od 300 do 1100 hPa (od -500m do +9000m nadmorske višine);
    napajalna napetost: 3,3 do 5 voltov;
  • Strumna moč: 5 µA pri hitrosti napajanja – 1 Hertz;

Raven hrupa: 0,06 hPa (0,5 m) v načinu ultra nizke porabe energije in 0,02 hPa (0,17 m) v načinu napredne ločljivosti.

Zdaj ta senzor povežemo s krmilnikom in poskušamo oceniti atmosferski tlak.

Priključki BMP180

Oba senzorja uporabljata vmesnik I2C, zato ju lahko brez težav povežemo s katero koli platformo družine Arduino.Os je videti kot povezovalna tabela z Arduino Uno.BMP 180GNDVCC
S.D.A.Os je videti kot povezovalna tabela z Arduino Uno.SCLArduino Uno+5V

A4

A5 Načelni diagram


Zunanji videz

postavitev

Program

Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Prenese se iz repozitorija in se namesti v Arduino IDE.

Zdaj je vse pripravljeno pred pisanjem prvega programa.

  1. Poskusimo ekstrahirati neobdelane podatke iz senzorja in jih oddati v vrata COM monitorja.
  2. #vključi
  3. tlak SFE_BMP180;
  4. void setup())( Serial.begin(9600); pressure.begin(); ) void loop())( dvojni P; P = getPressure(); Serial.println(P, 4); delay(100); ) double getPressure ()( char status; double T,P,p0,a; status = pressure.startTemperature(); if (status != 0)( // zakasnitev zaznavanja temperature(status); status = pressure.getTemperature(T) ; if (status != 0)( status = pressure.startPressure(3); if (status != 0)( // vise tlak delay(status); status = pressure.getPressure(P,T); if (status ! ) = 0)( vrni (P); ) ) ) ) )
  5. Postopek sprostitve tesnega oprijema senzorja ni tako trivialen in je sestavljen iz več stopenj.
  6. Preprosto povedano, algoritem izgleda takole:
  7. Odčitki vgrajenega temperaturnega senzorja se prenašajo na barometer;

se preverja uro A, medtem ko senzor ocenjuje temperaturo; Temperatura je zaznavna; vprašal barometer;

Če zaženete program na Arduino Uno, bo to preprečilo, da bi atmosferski tlak izginil.

Poskusimo senzor dvigniti nad glavo in ga spustiti na nivo podlage.

Srečanja se bodo za nekaj časa spremenila.

Le še toliko je treba razmišljati, kako te nepredstavljive številke pretvoriti v višino nad morsko gladino. Preoblikovanje primeža na višini nad reko morja Senzor BMP180 vrti vrednost primeža v hektopaskalu (hPa).

V nekaterih primerih je običajno zmanjšati atmosferski tlak.

1 hPa = 100 Pascalov.

Kaže, da na gladini morja tlak v povprečju postane 1013 hPa, z vsakim dodatnim metrom nad gladino morja pa se ta tlak spremeni za 0,11 hPa (približno).

Na ta način, kot lahko vidimo iz rezultata funkcije getPressureštevilo je 1013, izgubljeno razliko pa delimo z 0,11, nato odštejemo vrednost višine nad morsko gladino v metrih.

Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Naš program se bo spremenil takole:

Void loop())( dvojni P, Alt; P = getPressure(); Alt = (P - 1013)/0,11; Serial.println(Alt, 2); delay(100); )

Pravzaprav je pritisk ležanja na višinah nad gladino morja nelinearen in naša formula je primerna le za višine, na katerih vas kličemo žive.

Na srečo ljudje poznajo natančnost pritiska na višini, s katero lahko dobimo natančnejše rezultate.

Tu je p tlak na tej točki, p0 je tlak na kateri višini. Knjižnica SFE_BMP180 ima določeno funkcijo. formula za odstranjevanje

točno višino Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library tlak SFE_BMP180;

SerialFlow rd(&Serial);


Jasno je, da imata Masha in Vova 10 tsukerki.

dvojni P0 = 0; void setup())( rd.setPacketFormat(VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin(9600); pressure.begin(); P0 = getPressure(); ) void loop())( dvojno P; P = getPressure( rd.setPacketValue(100+int((P - P0)*100)); Posledično robotski program ustvari graf v Pascalih:

Kot smo se naučili iz lekcije, višina nad gladino morja ni tako nepomembna naloga.

Ne samo, da je nelinearno pritiskati na višino, ampak je slika polna pokola

Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library zunanji dejavniki

BMP180 - Senzor absolutnega tlaka, ki ga poganja uporovno vezje, ima nizek hrup in visoko linearnost ter visoko hitrost namestitve. Na čipu je senzor MEMS videti kot tanka silikonska membrana, ki zapre komoro s standardnim primežem. Na membrani so merilniki napetosti, ki so povezani za mostnim vezjem, podpora pa se spremeni, ko se membrana upogne.

Tlak membrane je med tlakom in tlakom v komori, izhodni signal iz mostu merilnika napetosti pa je pod tlakom.

    dovkilla

    .

    Ker so parametri membrane in uporov odvisni od temperature, so kristali digitalnega termometra, katerih odčitki so prilagojeni tako, da kompenzirajo podatke barometra, ali pa jih je mogoče nastaviti neodvisno.

    Za kompenzacijo podatkov barometra ni priporočljivo uporabljati temperaturnih podatkov iz drugih senzorjev.

    Termometer BMP180 je nameščen na samem temperaturnem kristalu in meri temperaturo občutljivega elementa - njegov odčitek je najbližji temperaturi barometra in natančnejši.

    Barometer lahko meri z največjo natančnostjo 2 Pa (saj barometrični višinomer kaže višinsko razliko 17 cm).

    Tehnične lastnosti:

Živa napetost 1,62V - 3,6V.

Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library
Za delo s senzorjem potrebujemo knjižnico: BMP180_Breakout_Arduino_Library

/***************************************************
Vmesnik za povezavo I2C.
Natančnost do 0,02hPa (17 cm).
Razpon: 300hPa do 1100hPa (+9000m do -500m).
Izhodni podatki: 16 bitni tlak in temperatura
ločena stavba za primežem 0,01hPa
ločene zgradbe pri temperaturi 0,1 o C
Primer kode Arduino
Ta zadnjica je za senzor zračnega tlaka in temperature BMP085
Zasnovan posebej za delo z Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
****************************************************/

Zasloni CI za komunikacijo uporabljajo I2C, za kar sta potrebna 2 zatiča
vmesnik
Adafruit vlaga čas in vire zagotavlja odprtokodna koda,
z nakupom podprite Adafruit in odprtokodno strojno opremo
izdelki Adafruit!
Napisal Limor Fried/Ladyada za Adafruit Industries.

Licenca BSD, vse zgornje besedilo mora biti vključeno v vsako redistribucijo

// Priključite senzor VCC BMP085 na 3,3 V (NE 5,0 V!)
//Povežite GND z ozemljitvijo
// Povežite SCL z uro i2c - na "168/"328 Arduino Uno/Duemilanove/etc, to je Analog 5
// Poveži SDA s podatki i2c - na "168/"328 Arduino Uno/Duemilanove/etc, to je Analog 4
medtem ko (1) ()
}
}

Prazna zanka() (
Serial.print("Temperatura = ");
Serial.print(bmp.readTemperature());
Serial.println("*C");

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

// Izračunaj nadmorsko višino ob predpostavki "standardne" barometrije
// tlak 1013,25 milibarov = 101325 Pascal

Serial.print("Nadmorska višina = ");
Serial.print(bmp.readAltitude());
Serial.println("metri");

Serial.print("Tlak na morski gladini (izračunan) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println("Pa");

// Pomembnejšo oceno ocene lahko prekličete
// če poznate trenutni pritisk na morsko gladino, ki bo
// spreminjajo se glede na vreme in podobno.
Če je 1015 milibarov

// kar je enako 101500 Pascalom.
Serial.print("Dejanska nadmorska višina = "); 101500 ));
Serial.println("metri");

Serial.print(bmp.readAltitude(
Serial.println();
}

zamuda (500);

  • Ta skica je prikazana
  • Temperatura = xx.xx * C - Temperatura v stopinjah Celzija
  • Tlak = xx Pa – atmosferski tlak v Pascalih
  • Nadmorska višina = xx,xx metrov — Nadmorska višina v metrih
  • Tlak na morski gladini (izračunan) = xx Pa - atmosferski tlak v Pascalih (shoro gladina morja (rozrakhunkova))

Realna nadmorska višina = xx,xx metrov - Realna višina (rozrahunkova)

Če želite prilagoditi atmosferski tlak v mm živega srebra, morate spremeniti število vrstic.

Serial.print("Tlak=");

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

// Vrednost Pa delite s 133,322 in odstranite mmHg.

Serial.println("mm");

// in vsekakor spremenite "Pa" v "mm"

Serial.print("Tlak na morski gladini (izračunan) = ");

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

Serial.println("mm"); Prilagoditev senzorja BMP180 Atmosferski tlak leži na mestu izumrtja, temperature in vremena.

Normalni atmosferski tlak na morski gladini je približno 101,3 kPa ali 101.325 Pa. Lažje je hitro najti zahtevano vrednost spletni kalkulator - Rozrakhunok atmosferski primež na različnih višinah in za prenos(mmHg) Vє (Pa) preprosta formula * 133,322 Pa = mm Hg.

Art.

.

Za kalibracijo višine bomo morali narediti spremembe v vrstici

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

namesto vrednosti 101 500 vnesite nezavarovalno vrednost. Govori, na katere morate biti pozorni Daj ti ga:

Upoštevajte, da BMP180 potrebuje pretiran dostop zraka za zategovanje primeža, zato ga ni mogoče postaviti v zaprto ohišje. Aleju ni treba preveč govoriti:

Po drugi strani pa lahko dotok vetrnih tokov ali vetrov, ki se močno zrušijo, povzroči kratkotrajno nihanje tlaka, kar bo vplivalo na vaše odčitke. Pritisnite na napravo pod močnimi vetrovi.

Temperaturno območje: Ker je za vibriranje primeža potrebna natančna temperatura, pazite, da naprave ne izpostavljate nenadnim temperaturnim spremembam in da je stran od vročih delov in drugih virov toplote. voda:

BMP180 je občutljiv na vodo in ne pride v stik z vodo.

Svetloba:

Senzor BMP180 je izjemno občutljiv na svetlobo, ki lahko pride v napravo skozi luknjo na vrhu čipa.

Če želite doseči največjo natančnost sledi, odstranite preveč svetlobe s čipa.

  • Kviten 2, 2015
  • Boschev senzor atmosferskega tlaka BMP180 je energetsko učinkovitejši in natančnejši ter ima nižjo sprednjo stran.
  • Senzor BMP180
  • Glavne značilnosti senzorja BMP180:
  • Razpon vibracij primeža: 300 – 1100hPa
  • Napajalna napetost: 3,3 in 5V
  • Nizka poraba energije: 3 µA (način ultra nizke porabe energije)
  • Natančnost: nizkoenergijski način, ločena zgradba 0,06hPa (0,5 m)
  • Visoko linearni način z ločenim odsekom 0,02hPa

  • Povezava: komunikacijski protokol I2C
  • Možnost nastavitve temperature v območju -40…+85°C
  • Glasovna ura: 5ms
  • Strum v načinu ohlajanja: 0,1 µA

VCC – za 5V priključek

GND – za povezavo z minusom (GND)

SCL in SDA – za povezavo z vodilom I2C

3.3 – za povezavo na 3.3V life

Kupi senzor BMP180:

Kako uporabljati knjižnico za robote z virtualnim senzorjem.

Pogled na knjižnico BMP085, po predhodnem delu s statistiko

Za primer bom uporabil knjižnico Adafruit.

  • Za začetek zaženimo testno skico iz knjižnice in odprimo vrata monitorja.
  • Yak mi bachimo, imamo:
  • Temperatura = 27,40 * C - Temperatura v stopinjah Celzija
  • Tlak = 97726 Pa - Atmosferski tlak v Pascalih
  • Nadmorska višina = 303,19 metrov — Nadmorska višina v metrih

Tlak na morski gladini (izračunano) = 97735 Pa - atmosferski tlak v Pascalih (manj kot morska gladina (rozrakhunkova))

Realna nadmorska višina = 317,47 metrov - Realna nadmorska višina (rozrakhunkova)

Prilagoditev in kalibracija senzorja BMP180

Želim pokazati spoštovanje tistim, da podatki Rozrakhunkova niso točni in so vključeni v skice. Informacije Lahko dobimo natančnejšo meritev višine.

Kot vemo, za naše koordinate obstaja stalen pritisk nad gladino morja, ki se bo spreminjal v položaju

vremenske misli

in podobno.

Če je 1015 milibarov, potem je vrednost enakovredna 101500 Pa.

Sedaj lahko ugotovimo svojo dejansko višino nad gladino morja s pomočjo Google zemljevidov, za katere bomo prešli na navodila.

V oknu z Google zemljevidom poiščemo svojo lokacijo in z levim gumbom miške postavimo oznako na zemljevid.

Prilagoditev koordinat glede na višinske vrednosti

Ker je višina nad morjem 203 m, če sem na 3. različici, to pomeni še 7 m in vzame se višina 210 metrov (približno) in si jo zapomnim.

Zdaj gremo na skico in vrednosti iz prikaza podatkov o atmosferskem tlaku Pa se pretvorijo v mmHg (vrednost se deli s 133,3) in prikaz Pa se spremeni v “mm”.

kodo

Če je 1015 milibarov, potem je vrednost enakovredna 101500 Pa.

Sedaj lahko ugotovimo svojo dejansko višino nad gladino morja s pomočjo Google zemljevidov, za katere bomo prešli na navodila.

Arduino

Serial.print("Tlak = "); Serial.print(bmp.readPressure()/133.3);) ;

Serial.println("mm");

Zdaj gremo na skico in vrednosti iz prikaza podatkov o atmosferskem tlaku Pa se pretvorijo v mmHg (vrednost se deli s 133,3) in prikaz Pa se spremeni v “mm”.

Serijski.

print("Tlak="); Serijski. print(bmp. readPressure()/133.3); Serijski. println("mm"); in še vedno tukaj Serial.print("Tlak na morski gladini (izračunan) = ");.

In smrad se bo pojavil kot vrsta, ki bo tekla iz dveh transformacij enot vimirvaniya - stopinj Celzija in stopinj Fahrenheita. print(bmp. readPressure()/133.3); Senzor print(bmp. readPressure()/133.3); :

  • Ne le tipalo barometričnega tlaka, temveč visoko natančno temperaturno tipalo.
  • To je zelo občutljiv pristop, na koncu članka bo prikazan pregledni videoposnetek, v katerem se boste čudili, kako lahko spremenite, kako občutljiv je.
  • No, zdaj lahko določite značilnosti senzorja
  • Živa napetost 3,3 volta
  • Strum 5 mKA pri delovni frekvenci 1 Hz
  • Priključni vmesnik - I2C

Razpon natančnosti za primež +-0,12 hPa (+-1 meter za višino) println("mm"); Temperaturno območje od -40 ° C do +85 * C print(bmp. readPressure()/133.3); :

Razpon primeža: od 300 do 1100 hPa

  • Prišel je čas za priključitev senzorja pred plačilom
  • , in ker smo izračunane in pretvorjene vrednosti bodo prikazane na 7-segmentnem zaslonu, bomo v spodnjem diagramu prikazali zunanje povezave vseh naprav, kot tudi pinout senzorja
  • Pri povezovalnem diagramu ni nič zapletenega, vse je vidno in razumljivo, zdaj bomo prešli na pisanje skice.
  • Nekaj ​​pomembnih točk pri izvajanju vizualizacije spreminjanja in transformacije vrednot:
  • Prikaz spremenjene vrednosti temperature (zakaj je opisano spodaj)

Vrednosti temperature se merijo v desetinkah stopinje (kot je razvidno iz prejšnje slike) print(bmp. readPressure()/133.3); Izvedite vizualizacijo ob pogledu na vrstico, ki jo želite izvesti

Obvezna je prisotnost diagnostičnih sporočil o senzorju, ko je vklopljen in inicializiran.

#include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" //Prototip funkcije drsenja msgScrolling() void msgScrolling(byte msg, int msgSize, int dScroll);< 8 + msgSize; i ++) { for(int n = i, j = 0; n >//Prototip funkcije za obdelavo temperaturnih podatkov //in pripravo informacij void TmsgPreparation(dvojna vrednost, bool stopinja);< 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; } } }

Prav tako bi rad povedal, da v standardni knjižnici LedControl ni bila najdena nobena funkcija drsenja, bomo morda mi tisti, ki bomo dodali to knjižnico?


No, vse je v redu za naše svetovalce, komentirajte, poskušajte, sprašujte ... Veselimo se vaših nasvetov.