Pripojenie BMP180 k Arduinu.

Vikhovateľu

Barometer je zariadenie, ktoré zisťuje atmosférický tlak.

Je to ako tlak vetra, ako tlak na nás zo všetkých strán.


Aj v školách vieme, že prvým barometrom je ortuťová platňa a v nej obrátená skúmavka. Autorom tohto zariadenia bol Evangelista Torricelli, taliansky fyzik a matematik. Hodnoty ortuťového barometra možno brať rovnako jednoducho ako hodnoty alkoholového teplomera: čím väčší je tlak v banke, tým väčšia je koncentrácia ortuti v jej strede.

Pary ortuti, ako viete, sú veľmi silné.

Neskôr sa objavilo bezstarostné zariadenie - aneroidný barometer.

V tomto barometri bola ortuť nahradená vlnitým boxom vyrobeným z tenkej ocele, ktorá bola navrhnutá na riedenie.


Pri vstupe atmosféry sa krabička sťahuje a prostredníctvom systému kláves otáča šípkou na ciferníku.

K dostupným snímačom, ktoré sa často používajú v podlahových ovládačoch a v rôznych typoch svojpomocne vyrobených elektronických zariadení, môžete pridať snímače od firmy BOSH: BMP085 a BMP180.


Ďalší barometer je nový, ale skôr šialený so starou verziou.

  • Niektoré dôležité vlastnosti BMP180:
  • rozsah hodnôt vibrácií: od 300 do 1100 hPa (od -500m do +9000m nad morom);
    napájacie napätie: 3,3 až 5 Voltov;
  • Výkon struny: 5 µA pri rýchlosti napájania – 1 Hertz;

Úroveň hluku: 0,06 hPa (0,5 m) v režime ultra nízkej spotreby a 0,02 hPa (0,17 m) v režime pokročilého rozlíšenia.

Teraz pripojíme tento snímač k ovládaču a pokúsime sa vyhodnotiť atmosférický tlak.

Pripojenia BMP180

Oba senzory využívajú I2C rozhranie, takže ich možno bez problémov pripojiť k akejkoľvek platforme z rodiny Arduino.Os vyzerá ako pripojovacia tabuľka k Arduino Uno.BMP 180GNDVCC
S.D.A.Os vyzerá ako pripojovacia tabuľka k Arduino Uno.SCLArduino Uno+5V

A4

A5 Principiálny diagram


Vonkajší vzhľad

rozloženie

Program

Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Sťahuje sa z úložiska a inštaluje sa do Arduino IDE.

Teraz je všetko pripravené pred napísaním prvého programu.

  1. Skúsme extrahovať nespracované dáta zo senzora a poslať ich do COM portu monitora.
  2. #include
  3. tlak SFE_BMP180;
  4. void setup())( Serial.begin(9600); pressure.begin(); ) void loop())( double P; P = getPressure(); Serial.println(P, 4); delay(100); ) double getPressure ()( char status; double T,P,p0,a; status = pressure.startTemperature(); if (stav != 0)( // oneskorenie detekcie teploty (stav); status = pressure.getTemperature(T) ; if (stav != 0)( stav = tlak.startPressure(3); if (stav != 0)( // obnovenie oneskorenia zveraka (stav); stav = tlak.getPressure(P,T); if (stav ! ) = 0) ( návrat (P); ) ) ) ) )
  5. Postup na odstránenie tlaku snímača nie je taký triviálny a pozostáva z niekoľkých etáp.
  6. Zjednodušene povedané, algoritmus vyzerá takto:
  7. Údaje zabudovaného snímača teploty sa privádzajú do barometra;

kontroluje sa hodinu A, kým snímač vyhodnocuje teplotu; Teplota je zistiteľná; spýtal sa z barometra;

Ak spustíte program na Arduino Uno, zabráni vyhasnutiu atmosférického tlaku.

Skúsme zdvihnúť senzor nad hlavu a spustiť ho na úroveň základne.

Stretnutia sa na chvíľu zmenia.

Ostáva už len toľko k zamysleniu, ako tieto nepredstaviteľné čísla previesť na výšku nad hladinou mora. Transformácia zveráka vo výške nad riekou mora Snímač BMP180 otáča hodnotu zveráka v hektopascaloch (hPa).

Týchto veľmi málo ľudí má tendenciu potláčať atmosférický tlak.

1 hPa = 100 pascalov.

Zdá sa, že na hladine mora je tlak v priemere 1013 hPa a každý ďalší meter nad hladinou mora sa tento tlak mení len o 0,11 hPa (približne).

Týmto spôsobom, ako môžeme vidieť z výsledku funkcie getPressurečíslo je 1013 a stratený rozdiel vydelíme 0,11, potom odčítame hodnotu nadmorskej výšky v metroch.

Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Náš program sa zmení takto:

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

V skutočnosti je tlak ležať vo výškach nad hladinou mora nelineárny a náš vzorec je vhodný len pre nadmorské výšky, v ktorých vás nazývame živými.

Našťastie sú ľudia oboznámení s presnosťou tlaku vo výške, ktorú môžeme použiť na získanie presnejších výsledkov.

Tu p je tlak v tomto bode, p0 je tlak, v ktorej výške. Knižnica SFE_BMP180 má funkciu podľa špecifikácie. vzorec na odstránenie

presná výška Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library tlak SFE_BMP180;

SerialFlow rd(&Serial);


dvojité P0 = 0;

void setup())( rd.setPacketFormat(VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin(9600); pressure.begin(); P0 = getPressure(); ) void loop())( double P; P = getPressure( rd.setPacketValue(100+int((P - P0)*100)); Výsledkom je, že program robota vytvorí graf v pascaloch: Višňovok

Ako sme sa dozvedeli z lekcie, výška nad hladinou mora nie je až taká triviálna úloha.

Nielenže je nelineárne udržiavať tlak vo výškach, ale obraz je plný krviprelievania

Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library vonkajšie faktory

BMP180 - Senzor absolútneho tlaku, poháňaný odporovým obvodom, má nízku hlučnosť a vysokú linearitu, ako aj vysokú rýchlosť inštalácie. Na čipe sa MEMS senzor javí ako tenká kremíková membrána, ktorá uzatvára komoru štandardným zverákom. Na membráne sú inštalované tenzometre, ktoré sú zapojené za mostíkovým obvodom a pri ohýbaní membrány sa mení podpera.

Tlak membrány leží medzi tlakom a tlakom v komore a výstupný signál z tenzometrického mostíka leží pod tlakom.

    dovkilla

    .

    Pretože parametre membrány a rezistorov závisia od teploty, kryštály digitálneho teplomera, ktorého hodnoty sú upravené tak, aby kompenzovali údaje barometra, alebo môžu byť nastavené nezávisle.

    Neodporúča sa používať údaje o teplote z iných snímačov na kompenzáciu údajov barometra.

    Teplomer BMP180 je namontovaný na samotnom teplotnom kryštáli a meria teplotu citlivého prvku - jeho údaj je najbližšie k teplote barometra a presnejšie.

    Barometer je možné merať s maximálnou presnosťou 2 Pa (keďže barometrický výškomer ukazuje výškový rozdiel 17 cm).

    Technické vlastnosti:

Živé napätie 1,62V - 3,6V.

Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library
Na prácu so senzorom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library

/***************************************************
Rozhranie pripojenia I2C.
Presnosť až 0,02 hPa (17 cm).
Rozsah: 300hPa až 1100hPa (+9000m až -500m).
Výstupné údaje: 16-bitový tlak a teplota
samostatná budova za zverákom 0,01hPa
samostatné budovy pri teplote 0,1 o C
Príklad kódu Arduino
Tento zadok je určený pre snímač barometrického tlaku a teploty BMP085
Navrhnuté špeciálne pre prácu s Adafruit BMP085 Breakout
----> https://www.adafruit.com/products/391
****************************************************/

CI displeje používajú na komunikáciu I2C, na to sú potrebné 2 piny
rozhranie
Adafruit investuje čas a zdroje poskytuje otvorený zdrojový kód,
podporte Adafruit a open-source hardvér zakúpením
produkty od Adafruit!
Napísal Limor Fried/Ladyada pre Adafruit Industries.

BSD licencia, všetok text vyššie musí byť zahrnutý do akejkoľvek redistribúcie

// Pripojte snímač VCC BMP085 k 3,3 V (NIE 5,0 V!)
//Pripojenie GND k zemi
// Pripojte SCL k hodinám i2c - na "168/"328 Arduino Uno/Duemilanove/etc thats Analog 5
// Pripojte SDA k i2c dátam - na "168/"328 Arduino Uno/Duemilanove/atď. to je Analog 4
zatiaľ čo (1) ()
}
}

Void loop() (
Serial.print("Teplota = ");
Serial.print(bmp.readTemperature());
Serial.println("*C");

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

// Výpočet nadmorskej výšky za predpokladu "štandardnej" barometrickej hodnoty
// tlak 1013,25 milibar = 101325 Pascal

Serial.print("Nadmorska vyska = ");
Serial.print(bmp.readAltitude());
Serial.println("metre");

Serial.print("Tlak na úrovni mora (vypočítaný) = ");
Serial.print(bmp.readSealevelPressure());
Serial.println("Pa");

// Dôležitejšie hodnotenie môžete zrušiť
// ak poznáte aktuálny tlak na hladine mora, ktorý bude
// menia sa podľa počasia a podobne.
Ak je to 1015 milibarov

// to sa rovná 101500 Pascalom.
Serial.print("Skutocna nadmorska vyska = "); 101500 ));
Serial.println("metre");

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

oneskorenie(500);

  • Tento náčrt je zobrazený
  • Teplota = xx.xx * C - Teplota v stupňoch Celzia
  • Tlak = xx Pa - Atmosférický tlak v pascaloch
  • Nadmorská výška = xx.xx metrov — Nadmorská výška v metroch
  • Tlak na hladine mora (vypočítaný) = xx Pa - Atmosférický tlak v Pascaloch (hladina mora (rozrakhunkova))

Skutočná výška = xx.xx metrov - Skutočná výška (rozrahunkova)

Ak chcete upraviť atmosférický tlak v mm ortuťového stĺpca, musíte zmeniť počet riadkov.

Serial.print("Tlak=");

Serial.print(bmp.readPressure() / 133,322);

// Vydelte hodnotu 133,322 a odstráňte mmHg.

Serial.println("mm");

// a určite zmeňte "Pa" na "mm"

Serial.print("Tlak na úrovni mora (vypočítaný) = ");

Serial.print(bmp.readSealevelPressure() / 133,322);

Serial.println("mm"); Nastavenie snímača BMP180 V mieste zániku leží atmosférický tlak, teplota a počasie.

Normálny atmosférický tlak na hladine mora je približne 101,3 kPa alebo 101 325 Pa. Je jednoduchšie rýchlo nájsť požadovanú hodnotu online kalkulačka - Rozrakhunok atmosférický zverák v rôznych výškach a na prenos(mmHg.) Vє (Pa) jednoduchý vzorec * 133,322 Pa = mm Hg.

čl.

.

Na kalibráciu výšky budeme musieť vykonať zmeny v riadku

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

namiesto hodnoty 101 500 zadajte svoju nepoistiteľnú hodnotu. Prejavy, na ktoré si treba dať pozor Daj ti to:

Pamätajte, že BMP180 vyžaduje nadmerný prístup vzduchu na utiahnutie zveráka, preto ho nie je možné umiestniť do zapečateného puzdra. Ale nemusí príliš veľa hovoriť:

Na druhej strane, prílev veterných prúdov alebo vetrov, ktoré sa prudko zrútia, môže spôsobiť krátkodobý oscilačný tlak, ktorý naplní vaše údaje. Pri silných prúdoch vetra zatlačte na zariadenie.

Teplotný rozsah: Keďže na to, aby zverák vibroval, je potrebná presná teplota, dávajte pozor, aby ste zariadenie nevystavovali náhlym zmenám teploty a držte ho ďalej od horúcich častí a iných zdrojov tepla. voda:

BMP180 je citlivý na vodu a neprichádza do styku s vodou.

Svetlo:

Snímač BMP180 je mimoriadne citlivý na svetlo, ktoré sa do zariadenia môže dostať cez otvor v hornej časti čipu.

Ak chcete dosiahnuť maximálnu presnosť sledovania, odstráňte z čipu príliš veľa svetla.

  • Kveten 2, 2015
  • Senzor atmosférického tlaku BMP180 od spoločnosti Bosch je energeticky efektívnejší a presnejší, s nižšou prednou časťou.
  • Senzor BMP180
  • Hlavné charakteristiky snímača BMP180:
  • Rozsah vibrácií zveráka: 300 – 1100 hPa
  • Napájacie napätie: 3,3 a 5V
  • Nízka spotreba energie: 3 µA (režim ultra nízkej spotreby)
  • Presnosť: nízkoenergetický režim, samostatná budova 0,06 hPa (0,5 m)
  • Vysoko lineárny režim so samostatnou sekciou 0,02 hPa

  • Pripojenie: I2C komunikačný protokol
  • Možnosť nastavenia teploty v rozsahu -40…+85°C
  • Hlasová hodina: 5 ms
  • Strum v režime ochladzovania: 0,1 µA

VCC – pre 5V pripojenie

GND – pre pripojenie na mínus (GND)

SCL a SDA – pre pripojenie na zbernicu I2C

3.3 – pre pripojenie na 3,3V život

Kúpiť snímač BMP180:

Ako používať knižnicu pre roboty s virtuálnym senzorom.

Pohľad na knižnicu BMP085, ktorá predtým pracovala so štatistikami

Ako príklad použijem knižnicu Adafruit.

  • Pre začiatok spustíme testovací náčrt z knižnice a otvoríme port monitora.
  • Yak mi bachimo, máme:
  • Teplota = 27,40 * C - Teplota v stupňoch Celzia
  • Tlak = 97726 Pa - Atmosférický tlak v pascaloch
  • Nadmorská výška = 303,19 metra – nadmorská výška v metroch

Tlak na hladine mora (vypočítaný) = 97735 Pa - Atmosférický tlak v Pascaloch (krátko od hladiny mora (rozrakhunkova))

Skutočná nadmorská výška = 317,47 metrov - Skutočná nadmorská výška (rozrakhunkova)

Nastavenie a kalibrácia snímača BMP180

Chcem prejaviť úctu tým, že údaje Rozrakhunkova nie sú presné a sú zahrnuté v náčrtoch. Informácie Môžeme získať presnejšie meranie výšky.

Ako vieme, nad hladinou mora je pre naše súradnice neustály tlak, ktorý sa bude meniť v polohe

počasie mysli

a podobne.

Ak je to 1015 milibarov, potom je hodnota ekvivalentná 101500 Pa.

Teraz sa o našej skutočnej výške nad hladinou mora môžeme dozvedieť pomocou Google máp, pre ktoré prejdeme k návodu.

V okne s mapou Google nájdeme svoju polohu a kliknutím ľavým tlačidlom myši umiestnime značku na mapu.

Nastavenie súradníc podľa hodnôt výšky

Keďže výška nad hladinou mora je 203 m, ak som na 3. verzii, znamená to ďalších 7 m a počíta sa s výškou 210 metrov (približne).

Teraz prejdeme na náčrt a hodnoty zo zobrazenia údajov o atmosférickom tlaku Pa sa prevedú na mmHg (hodnota sa vydelí 133,3) a zobrazenie Pa sa zmení na „mm“.

kód

Ak je to 1015 milibarov, potom je hodnota ekvivalentná 101500 Pa.

Teraz sa o našej skutočnej výške nad hladinou mora môžeme dozvedieť pomocou Google máp, pre ktoré prejdeme k návodu.

Arduino

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

Serial.println("mm");

Teraz prejdeme na náčrt a hodnoty zo zobrazenia údajov o atmosférickom tlaku Pa sa prevedú na mmHg (hodnota sa vydelí 133,3) a zobrazenie Pa sa zmení na „mm“.

Serial.

print("Tlak="); Serial. print(bmp. readPressure()/133,3); Serial. println("mm"); a stále tu Serial.print("Tlak na úrovni mora (vypočítaný) = ");.

A smrad sa objaví ako rad, ktorý bude prebiehať z dvoch transformácií jednotiek vimirvania - stupňov Celzia a stupňov Fahrenheita. print(bmp. readPressure()/133,3); Senzor print(bmp. readPressure()/133,3); :

  • Nielen snímač barometrického tlaku, ale aj vysoko presný snímač teploty.
  • Toto je veľmi citlivý prístup, na konci článku sa zobrazí prehľadné video, ktoré žasne nad tým, ako môžete zmeniť jeho citlivosť.
  • Teraz môžete určiť vlastnosti snímača
  • Živé napätie 3,3 voltov
  • Strum 5 mKA pri pracovnej frekvencii 1 Hz
  • Rozhranie pripojenia - I2C

Rozsah presnosti za zverákom +-0,12 hPa (+-1 meter na výšku) println("mm"); Teplotný rozsah od -40 ° C do +85 * C print(bmp. readPressure()/133,3); :

Rozsah zveráka: od 300 do 1100 hPa

  • Nastal čas pripojiť senzor pred zaplatením
  • , a keďže sme vypočítali a prepočítané hodnoty sa zobrazia na 7-segmentovom displeji, potom v spodnom diagrame zobrazíme externé pripojenia všetkých zariadení, ako aj vývod snímača
  • V schéme pripojenia nie je nič zložité, všetko je viditeľné a zrozumiteľné, teraz prejdeme k písaniu náčrtu.
  • Niekoľko dôležitých bodov pri implementácii vizualizácie zmeny a transformácie hodnôt:
  • Zobrazenie zmenenej hodnoty teploty (prečo je popísané nižšie)

Hodnoty teploty sa merajú v desatinách stupňa (ako je vidieť na predchádzajúcom obrázku) print(bmp. readPressure()/133,3); Implementujte vizualizáciu pri pohľade na riadok, ktorý sa má spustiť

Povinná je prítomnosť diagnostických správ o senzore pri jeho zapnutí a inicializácii.

#include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" //Prototyp rolovacej funkcie msgScrolling() void msgScrolling(byte msg, int msgSize, int dScroll);< 8 + msgSize; i ++) { for(int n = i, j = 0; n >//Prototyp funkcie na spracovanie teplotnych udajov //a pripravu notifikacii void TmsgPreparation(double value, bool degree);< 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; } } }

Chcel by som tiež povedať, že v štandardnej knižnici LedControl sa nenašla žiadna funkcia posúvania, možno budeme tí, ktorí do tejto knižnice pridáme?


Nuž, pre našich poradcov je všetko v poriadku, komentujte, skúšajte, pýtajte sa... Tešíme sa na vaše rady.