Vstúpiť
Portál logopédie
  • História vzniku románu
  • Ako nainštalovať ruštinu na iPhone
  • Vyšetrovacie kódy qr strážnych psov
  • Widescreen Fix - širokouhlé rozlíšenie pre Need for Speed: Most Wanted (2005) Mod pre nfs, ktoré sú najžiadanejšie pre rozlíšenie
  • Ako pridať alebo odstrániť jazyk v systéme Windows XP, povoliť pravopis zľava a hieroglyfy
  • Ako pridať jazyk na panel jazykov Windows
  • Senzor atmosférického tlaku BMP085 a Arduino. Tlakové snímače Arduino bmp280, bmp180, bme280 Pripojte bmp180 k arduino

    Senzor atmosférického tlaku BMP085 a Arduino. Tlakové snímače Arduino bmp280, bmp180, bme280 Pripojte bmp180 k arduino

    Dobrý deň všetkým, dobre ... stačí začať !!! Tento článok je o pripojení snímača barometrického tlaku BMP180 k jednému palubnému počítaču Arduino Uno , ale nie tak jednoduché, ako by sme si na prvý pohľad priali. Namerané a prevedené hodnoty teploty zobrazíme na 7segmentovom displeji podľa vodiča MAX7219 ... A budú zobrazené ako plazivá čiara z dvoch prevedených jednotiek merania - stupňov Celzia a stupňov Fahrenheita.

    Senzor BMP180 je nielen snímač barometrického tlaku, ale aj veľmi presný snímač teploty. Toto je veľmi citlivé zariadenie, na konci článku sa zobrazí prehľadné video, ktorého sledovaním si môžete byť istí, aké je to citlivé. Ďalej môžete uviesť charakteristiky snímača BMP180 :

    • Napájacie napätie 3,3 voltov
    • Spotreba prúdu 5 mKA pri vzorkovacej frekvencii 1 Hz
    • Pripojovacie rozhranie - I2C
    • Šírenie presnosti pri nameranom tlaku + -0,12 hPa (+ -1 meter na výšku)
    • Rozsah merania teploty od -40 * C do + 85 * C
    • Rozsah merania tlaku: od 300 do 1100 hPa

    Je čas pripojiť snímač k doske Arduino Uno , ale keďže sa naše namerané a prevedené hodnoty zobrazia na 7-segmentovom displeji, v nasledujúcom diagrame ukážeme kompletné pripojenie všetkých zariadení, ako aj pinout snímača BMP180 :

    Vo všeobecnosti nie je v schéme zapojenia nič zložité, všetko je viditeľné a zrozumiteľné, ďalším krokom je prechod k napísaniu náčrtu. Niekoľko dôležitých bodov pri implementácii vizualizácie nameraných a prevedených hodnôt:

    • Zobraziť iba prevedené hodnoty teploty (pozri nižšie)
    • Hodnoty teploty musia byť implementované v desatinách stupňa (ako je vidieť na ukážke)
    • Implementujte plazivé vykreslenie
    • Prítomnosť diagnostických správ o stave snímača pri zapnutí a inicializácii je povinná
    • Na prácu so snímačom používame knižnicu

    Prečo je stále možné zobraziť iba hodnoty teplôt ... Rád by som, samozrejme, úplne pokryl všetky možnosti snímača BMP180 , ale pre vizualizáciu na 7-segmentovom displeji bude potrebné na zobrazenie „plazivých čiar“ v správach použiť zložitejšie znaky, ako tie, ktoré je možné skutočne vytvoriť pomocou vizualizačných modulov tohto typu. Preto bolo rozhodnuté zobraziť iba prevedené hodnoty teploty, ale spravidla sa zriedka niekto pozerá na údaje o atmosférickom tlaku, napríklad keď sa ide prechádzať. A napriek tomu - ak chce niekto podrobnejšie študovať, ako pracovať so snímačom BMP180, potom v knižnici doplnkov existujú dva príklady, ktoré môžu podrobnejšie vysvetliť, ako pomocou tohto snímača získať a prevádzať tlak a teplotu.

    Výsledkom bolo vytvorenie nasledujúceho náčrtu s komentármi vývojára:

    #include "SFE_BMP180.h" #include "Wire.h" #include "LedControl.h" // Prototyp funkcie na posúvanie správy msgScrolling () void msgScrolling (byte msg, int msgSize, int dScroll); // Prototyp funkcie na spracovanie teplotných údajov // a prípravu správy void TmsgPreparation (dvojitá hodnota, bool stupeň); // Vytvorte objekt LC triedy LedControl pre prácu s displejom LedControl LC \u003d LedControl (12, 11, 10, 8); // Vytvorte objekt BMP180Sensor triedy SFE_BMP180 pre prácu s SFE_BMP180 BMP180Sensor; // Časové oneskorenie pre kreslenie znakov pri rolovaní const int delayScrolling \u003d 300; // Správa „Inicializácia senzora úspešná“ byte msgInitSuccess \u003d (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 91, 28, 13, 13, 79, 91, 91); // Správa „Inicializácia senzora zlyhala“ byte msgInitFail \u003d (91, 79, 21, 91, 29, 5, 16, 21, 16, 15, 0, 71, 119, 48, 14); // Pole číselných znakov bez bodkového bajtu Digit \u003d (126, 48, 109, 121, 51, 91, 95, 112, 127, 123); // Pole číselných znakov s bodkovým bajtom pDigit \u003d (254, 176, 237, 249, 179, 219, 223, 240, 255, 251); // Bajt symbolov deg \u003d 99; // Symbol pre „degree“ byte C \u003d 78; // Symbol "C" - bajt Celzia F \u003d 71; // Symbol "F" - Fahrenheitov byte S \u003d 1; // Symbol „-“ je znamienko mínus (ak je nameraná hodnota pod nulou) void setup () (// Zariadenie (7-segmentové zobrazenie) je vyňaté z režimu spánku LC.shutdown (0, false); // Nastaviť jas displeja na 8 // Celkový možný režim jasu od 0 do 15 LC.setIntensity (0, 8); // Jasný displej LC.clearDisplay (0); // Inicializácia senzora na zbernici I2C if (BMP180Sensor.begin ()) (// správa na posúvanie - inicializácia senzora bola úspešná void loop () (char status; double T, tCelsius, tFahrenheit; // Start temperature measurement // function startTemperature () returns the number of milliseconds // from the beginning of the measurement process, if if the measurement process was correct, // save this value into the status variable // Ak funkcia vráti 0, potom je proces merania chybný stav \u003d BMP180Sensor.startTemperature (); if (status! \u003d 0) (// Počkajte na rovnaký počet milisekúnd oneskorenie (stav); // Získajte nameranú a spracovanú hodnotu teploty // v stupňoch Celzia a uložte ju do premennej T // funkcia getTemperature () vráti 1, ak ju zavoláte // úspešne prešiel a 0, ak funkcia nemohla inicializovať // premennú T so stavom nameranej hodnoty \u003d BMP180Sensor.getTemperature (T); if (stav! \u003d 0) (// Priradenie hodnoty premenným // a spracovanie odstupňovania stupnice Fahrenheita tCelsius \u003d T; tFahrenheit \u003d (9.0 / 5.0) * T + 32.0;)) // Spracovanie hodnoty a // príprava správy - teplota TmsgPreparation (tCelsius, nepravda); TmsgPreparation (tFahrenheit, true); ) // Tu je skutočná funkcia na posúvanie pripravených správ // sprava doľava / * * Parametre: * byte msg - ukazovateľ na pole znakových údajov * int msgSize - veľkosť poľa znakových údajov * int dScroll - oneskorené rolovanie (posun správy dole) * v milisekundách * / void msgScrolling (byte msg, int msgSize, int dScroll) (pre (int i \u003d 0; i< 8 + msgSize; i ++) { for(int n = i, j = 0; n >\u003d 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; } } }

    Tiež by som chcel povedať, že v štandardnej knižnici LedControl sa nenašli žiadne rolovacie funkcie, možno túto knižnicu pridáme my? Všetko záleží na želaniach našich návštevníkov, komentujte, skúšajte, pýtajte sa ... Čakáme na vašu spätnú väzbu. Video náčrtu je tiež pripojené k tomuto článku, pozri výsledky náčrtu:


    Ak chcete, aby komentáre fungovali, povoľte javascript.

    Program Arduino s komentármi:

    / * Vzorový náčrt knižnice SFE_BMP180

    Tento náčrt ukazuje, ako používať knižnicu SFE_BMP180 na čítanie súboru
    Senzor barometrického tlaku Bosch BMP180.
    https://www.sparkfun.com/products/11824
    Ako väčšina senzorov tlaku, aj BMP180 meria absolútny tlak.
    Toto je skutočný tlak okolia, ktorý zariadenie vidí
    sa líšia v závislosti od nadmorskej výšky a počasia.
    Pred vykonaním tlakového odpočtu musíte absolvovať medzičasové čítanie.
    To sa robí pomocou startTemperature () a getTemperature ().
    Výsledok je v stupňoch C.
    Keď máte odčítanú teplotu, môžete odčítať tlak.
    To sa deje pomocou startPressure () a getPressure ().
    Výsledok je v milibaroch (mb) aka hektopascaloch (hPa).
    Ak budete monitorovať počasie, budete pravdepodobne chcieť
    odstrániť účinky nadmorskej výšky. Toto vyprodukuje údaje, ktoré môžu
    porovnávať s publikovanými hodnotami tlaku z iných miest.
    Použijete na to funkciu sealevel (). Budete musieť poskytnúť
    známa nadmorská výška, v ktorej sa tlak meral.
    Ak chcete merať nadmorskú výšku, musíte poznať tlak
    v základnej výške. Môže to byť priemerný tlak na morskej hladine, príp
    v takom prípade predchádzajúce odčítanie tlaku vo vašej nadmorskej výške
    nasledujúce hodnoty nadmorskej výšky budú + alebo - počiatočná základná hodnota.
    To sa deje pomocou funkcie nadmorskej výšky ().

    Hardvérové \u200b\u200bpripojenia:
    - (GND) na GND
    + (Vin) na 5V
    Budete tiež musieť pripojiť I2C piny (SCL a SDA) k vášmu
    Arduino. Kolíky sa líšia na rôznych Arduinos:
    Akékoľvek kolíky Arduino označené: SDA SCL
    Uno, Redboard, Pro: A4 A5
    Mega2560, splatnosť: 20 21
    Leonardo: 2 3

    Knižnica SFE_BMP180 používa rovnice s pohyblivou rádovou čiarkou vyvinuté
    Projekt záznamníka údajov o meteorologickej stanici: http://wmrx00.sourceforge.net/

    V10 Mike Grusin, SparkFun Electronics 24. 10. 2013
    Aktualizácie V1.1.2 pre Arduino 1.6.4 5/2015
    */

    // Váš náčrt musí # obsahovať túto knižnicu a knižnicu Wire.
    // (Wire je štandardná knižnica dodávaná s Arduino.):

    #include
    #include
    #include

    const int rs \u003d 12, en \u003d 11, d4 \u003d 5, d5 \u003d 4, d6 \u003d 3, d7 \u003d 2;
    LiquidCrystal lcd (rs, en, d4, d5, d6, d7);

    // Budete musieť vytvoriť objekt SFE_BMP180, tu nazývaný „tlak“:
    Tlak SFE_BMP180;

    nastavenie neplatnosti ()
    {
    lcd.začiatok (16, 2);
    // Inicializujte snímač (je dôležité uložiť kalibračné hodnoty uložené v prístroji).
    tlak.zaciatok ();
    }

    neplatná slučka ()
    {
    status char;
    dvojnásobok T, P, p0 \u003d 1013,0, a; // 1013,0 - tlak v hPa na úrovni mora

    // Najprv musíte merať teplotu, aby ste mohli odčítať tlak.
    // Spustenie merania teploty:

    status \u003d pressure.startTemperature ();
    if (status! \u003d 0)
    {
    oneskorenie (stav);

    // Načítanie ukončeného merania teploty:
    // Všimnite si, že meranie je uložené v premennej T.

    status \u003d pressure.getTemperature (T);
    if (status! \u003d 0)
    {
    lcd.setCursor (0, 0);
    lcd.print ("Teplota \u003d");
    lcd.tlač (T, 2);
    lcd.print ("C");
    // Spustenie merania tlaku:
    // Parameter je nastavenie prevzorkovania od 0 do 3 (najvyššie rozlíšenie, najdlhšie čakanie).
    // Ak je požiadavka úspešná, vráti sa počet ms na čakanie.
    // Ak je požiadavka neúspešná, vráti sa 0.

    stav \u003d tlak.startTlak (3);
    if (status! \u003d 0)
    {
    // Počkajte na ukončenie merania:
    oneskorenie (stav);

    // Načítanie ukončeného merania tlaku:
    // Všimnite si, že meranie je uložené v premennej P.
    // Upozorňujeme tiež, že táto funkcia vyžaduje predchádzajúce meranie teploty (T).
    // (Ak je teplota stabilná, môžete vykonať jedno meranie teploty pre niekoľko meraní tlaku.)
    // Funkcia vráti 1, ak je úspešná, 0, ak je úspešná.

    stav \u003d tlak.getTlak (P, T);
    if (status! \u003d 0)
    {
    // Vytlačte meranie:
    lcd.setCursor (0, 1);
    lcd.print ("P \u003d");
    lcd.tlač (P / 1,333,0); // coeff. 1,333 - prepočet hPa na mm Hg

    // Ak chcete zistiť svoju nadmorskú výšku z nameraného tlaku,
    // použitie funkcie nadmorskej výšky spolu so základným tlakom (hladina mora alebo iné).
    // Parametre: P \u003d absolútny tlak v mb, p0 \u003d 1013 základný tlak v mb.
    // Výsledok: a \u003d nadmorská výška vm.

    a \u003d tlak.výška (P, p0);
    lcd.print ("H \u003d");
    lcd.tlač (a, 2);
    lcd.print ("m");
    }
    else lcd.print ("chyba");
    }
    else lcd.print ("chyba");
    }
    else lcd.print ("chyba");
    }
    else lcd.print ("chyba");
    oneskorenie (5 000); // Pauza na 5 sekúnd.

    #include #include // Deklarujte premennú pre prístup k tlaku SFE_BMP180: SFE_BMP180; #define ALTITUDE 1655.0 // výška nad morom pri triku v metroch void setup () (Serial.begin (9600); Serial.println ("REBOOT"); // inicializácia if (pressure.begin ()) Serial.println ( "BMP180 init ok"); else (// Ak tu niečo nenarástlo dohromady. Spravidla platí, že jambs s pripojením Serial.println ("BMP180 init fail \\ n \\ n"); while (1); // hang) ) void loop () (char status; double T, P, p0, a; // Ak chcete poznať tlak vzduchu upravený podľa hladiny mora, ktorý sa zvyčajne používa v predpovediach počasia // Potrebujete poznať hladinu mora vo vašej oblasti, kde meranie // Musí byť zadané v konštante ALTITUDE na začiatku kódu Serial.println (); Serial.print ("Sea level:"); Serial.print (ALTITUDE, 0); Serial.print ("meters"); Serial .print (ALTITUDE * 3.28084,0); Serial.println ("stopy"); // Ak chcete vedieť nadmorskú výšku naopak, ale poznáte tlak // musíte určiť aktuálny atmosférický tlak. Ako to urobiť, je napísané na konci kódu. ... // Pretože tlak závisí do istej miery od teploty, musíte najskôr zistiť teplotu // BMP180 má zabudovaný teplomer. Meranie teploty trvá určitý čas. // Ak je všetko plynulé, tlak.startTemperature vráti v stave počet milisekúnd // musíte počkať na meranie teploty // Ak je k dispozícii komora s drôtmi, vráti hodnotu 0 status \u003d pressure.startTemperature (); if (status! \u003d 0) (// wait: delay (status); // Načítajte teplotu, vložte ju do premennej T: // Funkcia vráti 1, ak je všetko v poriadku, 0, ak nie je v poriadku stav \u003d pressure.getTemperature (T); if (status! \u003d 0) (// zapíš teplotu: Serial.print ("temperature:"); Serial.print (T, 2); Serial.print ("stupne C,"); // v stupňoch Celzia Serial.print ((9.0 / 5.0) * T + 32.0,2); Serial.println ("stupne F"); // vo stupňoch Fahrenheita // Určte atm. Tlak: // Parameter označuje rozlíšenie od 0 do 3 (čím vyššie je rozlíšenie, čím vyššia je presnosť, tým dlhšie je čakanie). // Ak je všetko plynulé, tlak.startPressure vráti v stave počet milisekúnd //, ktoré musíte počkať na zmeranie atm.pressure // Ak nastane problém, vráti hodnotu 0 status \u003d pressure.startPressure ( 3); if (status! \u003d 0) (// počkajte na koniec merania: delay (status); // Teraz môžete získať tlak v premennej P. // Funkcia vráti 1, ak je všetko v poriadku, 0, ak nie je v poriadku. Stav \u003d tlak. getPressure (P, T); if (status! \u003d 0) (// vytlačiť všetko: Seri al.print ("absolútny tlak:"); Sériová tlač (P, 2); Serial.print ("millibar"); Sériová tlač (P * 0. 0295333727,2); Serial.println ("ortuťové palce"); // senzor vracia atm. tlak, ktorý sa mení v závislosti od výšky snímača. // Ak to chceme ako v predpovedi počasia, musíme urobiť pochybné výpočty // Parametre: P \u003d tlak zo snímača v milibaroch, ALTITUDE \u003d výška nad morom v metroch. // Výsledok: p0 \u003d tlak upravený podľa hladiny mora p0 \u003d tlak.sealevel (P, ALTITUDE); Serial.print ("Tlak na hladine mora:"); Sériová tlač (p0,2); Serial.print ("millibar"); Sériová tlač (p0 * 0,0295333727,2); Serial.println ("ortuťové palce"); // Alebo ak chcete urobiť opak a určiť nadmorskú výšku zo známeho tlaku, // Parametre: P \u003d tlak zo snímača v milibaroch, p0 \u003d tlak upravený pre hladinu mora. // Výsledok: a \u003d výška nad morom v metroch. a \u003d tlak.výška (P, p0); Serial.print ("vypočítaná výška nad morom:"); Serial.print (a, 0); Serial.print ("metre"); Serial.print (a * 3,28084,0); Serial.println ("stopy"); ) else Serial.println ("chyba pri tlaku \\ n"); ) else Serial.println ("chyba pri spustení tlaku \\ n"); ) else Serial.println ("chyba pri meraní teploty \\ n"); ) else Serial.println ("chyba pri spustení merania teploty \\ n"); oneskorenie (5 000); // pauza na 5 sekúnd. )

    Barometer je zariadenie, ktoré meria atmosférický tlak. Teda tlak vzduchu, ktorý na nás tlačí zo všetkých strán. Zo školy vieme, že prvým barometrom bola doska s ortuťou, v ktorej bola obrátená skúmavka. Autorom tohto zariadenia bol Evangelista Torricelli, taliansky fyzik a matematik. Odčítanie hodnôt ortuťového barometra môže byť také jednoduché ako čítanie liehového teplomeru: čím väčší je tlak mimo banku, tým vyšší je stĺpec ortuti v nej. Je známe, že ortuťové pary sú vysoko toxické.

    Neskôr sa objavilo bezpečnejšie zariadenie - aneroidný barometer. V tomto barometri bola ortuť nahradená vlnitou krabicou vyrobenou z tenkého plechu, v ktorej bolo vytvorené vákuum. Pod vplyvom atmosféry sa skrinka zmenšuje a otáča rukou na číselníku prostredníctvom sústavy pák. Takto vyzerajú tieto dva barometre. Vľavo - aneroid, vpravo - barometer Torricelli.

    Prečo potrebujeme barometer? Najčastejšie sa toto zariadenie používa v lietadlách na určovanie letovej výšky. Čím vyššie vozidlo vystúpi nad hladinu mora, tým menší tlak zažíva palubný barometer. Ak poznáte tento vzťah, je ľahké určiť výšku.


    Ďalším bežným prípadom použitia je domáca meteorologická stanica. V tomto prípade môžeme použiť známe závislosti prichádzajúceho počasia od atmosférického tlaku. Na týchto staniciach sú okrem barometra inštalované aj snímače vlhkosti a teploty.

    Elektronický barometer

    Takéto objemné barometre nemôžeme použiť v robotike. Potrebujeme miniatúrne a energeticky efektívne zariadenie, ktoré sa ľahko pripojí k rovnakému Arduino Uno. Väčšina moderných barometrov sa vyrába pomocou technológie MEMS, rovnako ako gyrotachometre s akcelerometrami. Barometre MEMS sú založené na piezorezistívnej alebo tenzometrickej metóde, ktorá využíva efekt zmeny odporu materiálu pri pôsobení deformačných síl.

    Ak otvoríte kryt barometra MEMS, môžete vidieť snímací prvok (vpravo), ktorý je umiestnený priamo pod otvorom v ochrannom puzdre prístroja, a riadiacu dosku (vľavo), ktorá vykonáva primárnu filtráciu a prevod merania.


    Senzory BMP085 a BMP180

    Snímače BMP085 a BMP180 spoločnosti BOSH patria medzi najdostupnejšie snímače tlaku, ktoré sa často používajú na letových ovládačoch a vo všetkých druhoch domácich elektronických zariadení. Druhý barometer je novší, ale plne kompatibilný so starou verziou.


    Niektoré dôležité vlastnosti BMP180:

    • rozsah nameraných hodnôt: od 300 hPa do 1100 hPa (od -500 m od + 9000 m n. m.);
    • napájacie napätie: od 3,3 do 5 voltov;
      prúdová sila: 5 μA pri rýchlosti dotazovania 1 Hertz;
    • hladina hluku: 0,06 hPa (0,5 m) v hrubom režime (režim veľmi nízkej spotreby) a 0,02 hPa (0,17 m) v režime pokročilého rozlíšenia.

    Teraz pripojme tento snímač k regulátoru a pokúsme sa odhadnúť atmosférický tlak.

    Pripojenie BMP180

    Oba snímače majú rozhranie I2C, takže sa dajú ľahko pripojiť k akejkoľvek platforme z rodiny Arduino. Takto vyzerá tabuľka pripojení pre Arduino Uno.

    BMP 180GNDVCCSDASCL
    Arduino UnoGND+ 5VA4A5

    Schematický diagram

    Vzhľad rozloženia


    Program

    Na prácu so snímačom potrebujeme knižnicu: BMP180_Breakout_Arduino_Library

    Stiahnite si ho z úložiska a nainštalujte ho do Arduino IDE. Teraz ste pripravení napísať svoj prvý program. Pokúsme sa získať surové dáta zo snímača a odoslať ich na monitor COM portu.

    #include #include Tlak SFE_BMP180; void setup () (Serial.begin (9600); pressure.begin ();) void loop () (double P; P \u003d getPressure (); Serial.println (P, 4); delay (100);) double getPressure () (char status; double T, P, p0, a; status \u003d pressure.startTemperature (); if (status! \u003d 0) (// čakanie na oneskorenie merania teploty (status); status \u003d pressure.getTemperature (T); if (status! \u003d 0) (status \u003d pressure.startPressure (3); if (status! \u003d 0) (// čakanie na oneskorenie merania tlaku (status); status \u003d pressure.getPressure (P, T); if (status! \u003d 0) (návrat (P);)))))

    Postup získania požadovaného tlaku zo senzora nie je taký triviálny a pozostáva z niekoľkých etáp. V zjednodušenej podobe vyzerá algoritmus takto:

    1. požadujeme hodnoty zabudovaného teplotného senzora z barometra;
    2. počkajte čas A, kým senzor vyhodnotí teplotu;
    3. dostaneme teplotu;
    4. požiadajte barometer o tlak;
    5. čakacia doba B, kým senzor vyhodnotí tlak;
    6. získajte hodnotu tlaku;
    7. vráti hodnotu tlaku z funkcie.

    Čas B závisí od presnosti merania, ktorá je nastavená vo funkcii startPressure... Jediným argumentom pre túto funkciu môžu byť hodnoty od 0 do 3, kde 0 je najhrubší a najrýchlejší odhad a 3 je najpresnejší odhad tlaku.

    Načítame program na Arduino Uno a sledujeme priebeh meraní atmosférického tlaku. Skúsme zdvihnúť snímač nad našu hlavu a spustiť ho na úroveň podlahy. Čítanie sa bude mierne líšiť. Zostáva len prísť na to, ako môžeme tieto nepochopiteľné čísla previesť do výšky nad morom.

    Preveďte tlak na nadmorskú výšku

    Senzor BMP180 vracia tlak v hektopascaloch (hPa). Práve v týchto jednotkách je zvykom merať atmosférický tlak. 1 hPa \u003d 100 Pascalov. Je známe, že priemerný tlak na hladine mora je 1013 hPa a každý ďalší meter nad hladinou mora zníži tento tlak iba o 0,11 hPa (približne).

    Ak teda odpočítame od výsledku funkcie getPressure číslo 1013, a zvyšný rozdiel vydelíme 0,11, potom dostaneme hodnotu výšky nad morom v metroch. Takto sa zmení náš program:

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

    Tlak v skutočnosti nie je lineárny s nadmorskou výškou a náš vzorec je vhodný iba pre nadmorské výšky, v ktorých obvykle žijeme. Ľudstvo našťastie pozná presnejšiu závislosť tlaku od nadmorskej výšky, ktorú môžeme použiť na získanie presnejších výsledkov.

    Tu p je tlak nameraný v tomto bode, p0 je tlak, v súvislosti s ktorým sa meria výška.

    Knižnica SFE_BMP180 už má funkciu, ktorá používa zadanú. vzorec na získanie presnej výšky. Používame to v našom programe.

    #include #include Tlak SFE_BMP180; dvojitý P0 \u003d 0; void setup () (Serial.begin (9600); pressure.begin (); P0 \u003d pressure.getPressure ();) void loop () (double P, Alt; P \u003d getPressure (); Alt \u003d pressure.altitude (P , P0) Serial.println (Alt, 2); delay (100);) double getPressure () (...)

    Funkciu getPressure som úplne nekopíroval, aby bol text čitateľný.

    V programe sa objavila ďalšia premenná P0 - to je tlak, ktorý zmeriame na začiatku programu. V prípade lietadla bude P0 tlak v mieste vzletu, z ktorého začneme stúpať.

    Vizualizácia

    Teraz sa pokúsime zobraziť namerané hodnoty tlaku v programe SFMonitor, a pozrime sa, ako sa mení tlak, keď sa senzor pohybuje do výšky 2 metrov.

    Statický konštantný bajt PACKET_SIZE \u003d 1; statický konštantný bajt VALUE_SIZE \u003d 2; static const boolean SEPARATE_VALUES \u003d true; #include #include #include Tlak SFE_BMP180; SerialFlow rd (& Serial); dvojitý P0 \u003d 0; void setup () (rd.setPacketFormat (VALUE_SIZE, PACKET_SIZE, SEPARATE_VALUES); rd.begin (9600); pressure.begin (); P0 \u003d getPressure ();) void loop () (double P; P \u003d getPressure (); rd.setPacketValue (100 + int ((P - P0) * 100)); rd.sendPacket (); delay (100);) double getPressure () (...)

    Ako výsledok programu dostaneme tlakový graf v Pascaloch:


    Záver

    Ako sme sa dozvedeli z lekcie, stanovenie výšky nad morom nie je taká triviálna úloha. Nielenže tlak závisí nelineárne od výšky, ale obraz kazia aj rôzne vonkajšie faktory. Napríklad tlak v našej domácnosti sa časom neustále mení. Aj za pár minút sa výška nameraná našim prístrojom môže pohybovať v rozmedzí 0,5 - 1 meter. Teplota tiež veľmi ovplyvňuje kvalitu meraní, takže ju musíme brať do úvahy pri výpočte tlaku.

    Pre lietadlá sa odporúča používať pokročilé presné snímače, ako napríklad MS5611. Tento barometer môže merať až 0,012 hPa, čo je 5-krát lepšie ako BMP180. Na objasnenie barometrickej nadmorskej výšky letu sa používajú aj súradnice GPS.

    Veľa šťastia v pozorovaní atmosféry! 🙂

    2. apríla 2015

    Senzor atmosférického tlaku BMP180 od spoločnosti Bosch je energeticky efektívnejší a presnejší ako jeho predchodca.

    Senzor BMP180

    Hlavné charakteristiky snímača BMP180:

    • Rozsah merania tlaku: 300 - 1100 hPa
    • Napájacie napätie: 3,3 a 5V
    • Nízka spotreba energie: 3 μA (režim veľmi nízkej spotreby)
    • Presnosť: Režim nízkej spotreby, rozlíšenie 0,06 hPa (0,5 m)
    • Vysoko lineárny režim s rozlíšením 0,02 hPa
    • Pripojenie: komunikačný protokol I2C
    • Meranie teploty v rozmedzí -40 ... +85 ° C
    • Čas odozvy: 5ms
    • Pohotovostný prúd: 0,1 μA

    • VCC - na pripojenie 5V napájacieho zdroja
    • GND - na pripojenie k mínusu (GND)
    • SCL a SDA - na pripojenie k zbernici I2C
    • 3,3 - na pripojenie napájacieho zdroja 3,3 V.

    Kúpiť snímač BMP180:

    Knižnice pre snímač BMP180:

    Na prácu so snímačom BMP180 sa používajú knižnice určené pre snímač BMP085.

    Knižnica snímača atmosférického tlaku Adafruit BMP085

    Knižnica pre prácu so snímačom tlaku BMP085

    Ktorú knižnicu použijete na prácu so snímačom, je len na vás. Knižnicu BMP085 som si preštudoval už skôr v článku

    Napríklad použijem knižnicu od Adafruitu. Najskôr spustíme skúšobný náčrt z knižnice a otvoríme monitor portov ...

    Ako vidíme, máme:

    • Teplota \u003d 27,40 * C - Teplota v stupňoch Celzia
    • Tlak \u003d 97726 Pa - Atmosférický tlak v pascaloch
    • Nadmorská výška \u003d 303,19 metra - výška v metroch
    • Tlak na úrovni mora (vypočítaný) \u003d 97735 Pa - Atmosférický tlak v Pascaloch (vzhľadom na hladinu mora (vypočítaný))
    • Skutočná nadmorská výška \u003d 317,47 metrov - skutočná nadmorská výška (odhadovaná)

    Nastavenie a kalibrácia snímača BMP180

    Chcem vás upozorniť na skutočnosť, že vypočítané údaje nie sú presné a sú uvedené v náčrte.

    Informácie

    Môžeme získať presnejšie meranie výšky. Ak poznáme pre svoje súradnice súčasný tlak nad morom, zmení sa to v závislosti od poveternostných podmienok a podobne. Ak je to 1015 milibarov, potom je hodnota 101 500 Pa.

    Teraz zisťujeme našu skutočnú výšku nad morom pomocou máp od Google, kvôli tomu sledujeme odkaz. V okne s mapou od Google nájdeme naše bydlisko a kliknutím ľavým tlačidlom myši nastavíme značku na mape.

    Súradnice mojej polohy s hodnotami nadmorskej výšky

    Ako vidíte, nadmorská výška je 203 m, ale ja som na 3. poschodí, čo znamená, že pridáme ďalších 7 m a dostaneme výšku 210 metrov (približne) a zapamätáme si to. Teraz ideme na náčrt a hodnota so zobrazením údajov o atmosférickom tlaku v Pa sa prevedie na mm Hg (hodnota sa vydelí 133,3) a zmeníme zobrazenie „Pa“ na „mm“.

    kód

    Arduino

    Serial.print ("Tlak \u003d"); Serial.print (bmp.readPressure () / 133,3); Serial.println ("mm");

    Sériové. tlač ("Tlak \u003d");

    Sériové. print (bmp. readPressure () / 133,3);

    Sériové. println ("mm");

    a stále tu

    kód

    Arduino

    Serial.print ("Tlak na morskej úrovni (vypočítaný) \u003d"); Serial.print (bmp.readSealevelPressure () / 133,3); Serial.println ("mm");

    Sériové. tlačiť ( "Tlak na úrovni mora (vypočítaný) \u003d") ;

    Sériové. print (bmp. readSealevelPressure () / 133,3);

    Sériové. println ("mm");

    Znova nahrajte náš náčrt na dosku a uvidíte, čo máme v monitore portov