Portal dla pasjonatów motoryzacji

Czujnik ciśnienia atmosferycznego BMP180. Czujnik ciśnienia atmosferycznego BMP085 oraz kod i połączenie Arduino

Czujnik ciśnienia bezwzględnego i temperatury (ostatnim dzisiaj nikogo nie zaskoczy) Bosch BMP180. Czujnik nie jest nowy i dobrze znany, arkusz danych został przestudiowany od góry do dołu i istnieje cała masa bibliotek.

Charakterystyka:
  • Zakres pomiaru ciśnienia: 300 – 1100 hPa.
  • Napięcie zasilania: od 1,8 - 3,3 i 5V (jeśli na płycie znajduje się regulator napięcia).
  • Niski pobór mocy: 3uA (tryb bardzo niskiego poboru mocy)
  • Dokładność: tryb niskiego poboru mocy, rozdzielczość 0,06 hPa (0,5 m).
  • Tryb High Line z rozdzielczością 0,02 hPa (0,17 m).
  • Połączenie: interfejs I2C.
  • Możliwość pomiaru temperatur w zakresie -40…+85°C.
  • Czas odpowiedzi: 5ms - 7,5ms (tryb standardowy).
  • Prąd czuwania: 0,1 uA
Zasada działania czujnika BMP180:

Czujnik posiada szczelną komorę, której jedną ze ścian stanowi elastyczna membrana z zamontowanymi tensometrami. Membrana zwisa proporcjonalnie do różnicy ciśnień wewnątrz komory i na zewnątrz, co wpływa na zmianę rezystancji tensometrów na prąd elektryczny. Jest też czujnik temperatury, którego rezystancja zmienia się proporcjonalnie do temperatury. ADC (przetwornik analogowo-cyfrowy) tłumaczy wyniki zmian czujnika na dane cyfrowe" nieskompensowane wyniki”, które są dostępne do odczytu z rejestrów czujnika: „Out MSB”, „Out LSB” i „Out xLSB”. Aby skompensować określone wyniki (kompensacja przesunięcia, zależność temperaturowa, błędy produkcyjne, niejednorodności materiału itp.), każdy czujnik jest kalibrowany w fabryce, a indywidualne dla każdego czujnika są zapisywane w pamięci EEPROM 11 współczynników kalibracji
(176 bitów) dostępnych do odczytu z rejestrów enkodera: „AC1”, „AC2”, „AC3”, „AC4”, „AC5”, „AC6”, „B1”, „B2”, „MB”, „MC, MD.

Chroń czujnik przed wilgocią i bezpośrednim światłem słonecznym.

Algorytm akwizycji danych:
  • Odczyt współczynników kalibracji:

Odczyt wartości z rejestrów o tej samej nazwie:
krótkie AC1, AC2, AC3, B1, B2, MB, MC, MD;
krótkie bez znaku AC4, AC5, AC6;

  • Odczyt temperatury: (wartość nieskompensowana)

Zapisujemy wartość do rejestru „Measurement Control”: 0x2E;

Odczytujemy wynik z rejestrów „Out MSB” i „Out LSB”;

  • Odczyt ciśnienia: (wartość nieskompensowana)

Zapisujemy wartość do rejestru „Measurement Control”: 0x34 + (OSS<<6);
Spodziewaj się, że flaga stanu „CSO” spadnie do „0”;
Odczytujemy wynik z rejestrów „Out MSB”, „Out LSB” i „Out xLSB”;
długi UP = ("Out MSB"<<16 + «Out LSB»<<8 + «Out xLSB») >> (8-OSS);

  • Obliczanie wartości rzeczywistych

Kod i połączenie.

Czujnik jest dość popularny. Najczęściej występuje już z opasaniem w postaci gotowego modułu. Możesz łatwo znaleźć wiele różnych, gotowych bibliotek. zatrzymałem się o godz BMP180_Breakout_Arduino_Library. Możesz pobrać z GitHub lub z naszego strona.

Połączenie jest opisane w bibliotece, ale na wszelki wypadek je zduplikuję:

SCL(zegar)

  • Uno, Nano, Pro do A5
  • Mega, w związku z 21
  • Leonarda k 3

SDA(dane)

  • Uno, Nano, Pro do A4
  • Mega, w związku z 20
  • Leonarda k 2

VIN- do +5 woltów.

IO- To wyjście jest na niektórych płytach, zasilacz omija stabilizator. NIE więcej niż 3,3 V.

GND- podłącz do minusa.

Oto przykładowy kod z objaśnieniami:

#włączać #włączać // Zadeklaruj zmienną, aby uzyskać dostęp do SFE_BMP180: SFE_BMP180 pressure; #define ALTITUDE 203.0 // wysokość nad poziomem morza w metrach. void setup() ( Serial.begin(9600); Serial.println("REBOOT"); // inicjalizacja if (pressure.begin()) Serial.println("BMP180 init ok"); else ( // Jeśli jesteśmy tutaj coś się wtedy nie zgrało.Z reguły ościeża z połączeniem Serial.println("BMP180 init fail\n\n"); while(1); //rozłącz się ) ) void loop() ( char status; double T,P, p0,a; // Jeśli chcesz poznać ciśnienie powietrza skorygowane o poziom morza, które jest powszechnie używane w prognozach pogody // Musisz znać poziom morza w miejscu, w którym dokonujesz pomiaru // To musi być określona w stałej ALTITUDE na początku kodu seryjnego .println(); Serial.print("Poziom morza: "); Serial.print(ALTITUDE,0); Serial.print("metry, "); Serial .print(ALTITUDE*3.28084,0);Serial.println("ft"); // Jeśli chcesz poznać wysokość nad poziomem morza i znasz ciśnienie // musisz podać aktualne ciśnienie atmosferyczne. aby to zrobić jest napisane na końcu kodu. // Jeśli wszystko jest równe, pressure.startTemperature zwróci wartość w statusie milisekund, // którą trzeba czekać na pomiar temperatury // Jeśli jest jakiś błąd, zwróci status 0 = pressure.startTemperature(); if (status != 0) ( // wait: delay(status); // Pobierz temperaturę // Funkcja zwróci 1 jeśli wszystko jest OK, 0 jeśli nie OK status = pressure.getTemperature(T); if (status != 0) ( Serial.print("Temperatura: "); Serial.print(T,2); Serial.print("stopnie C, "); // Celsjusza Serial.print((9,0/5,0)*T+ 32.0,2 ); Serial.println("stopnie F"); // w stopniach Fahrenheita // Określ ciśnienie barometryczne: // Parametr określa rozdzielczość, od 0 do 3 (im wyższa rozdzielczość, tym większa dokładność, dłużej czekać).status = pressure .startPressure(3); if (status != 0) ( delay(status); // Teraz możesz uzyskać ciśnienie w zmiennej P. // Funkcja zwróci 1, jeśli wszystko jest OK, 0 jeśli nie OK. status = pressure.getPressure(P ,T); if (status != 0) ( Serial.print("Ciśnienie bezwzględne: "); Serial.print(P,2); Serial.print( " millibar, "); // milibar (mb) Serial. print(P*0.750064,2); Serial.println("mmHg"); // Parametry: P = ciśnienie czujnika w milibarach, ALTITUDE = wysokość w metrach. / / Wynik: p0 = ciśnienie skorygowane o poziom morza p0 = pressure.sealevel(P,ALTITUDE); Serial.print("Ciśnienie na poziomie morza: "); Serial.print(p0,2); Serial.print("milibary, "); Serial.print(p0*0. 750064.2); Serial.println("mmHg"); // Lub jeśli chcesz zrobić odwrotnie i określić wysokość na podstawie znanego ciśnienia, // Parametry: P = ciśnienie czujnika w milibarach, p0 = ciśnienie skorygowane o poziom morza. // Wynik: a = wysokość nad poziomem morza w metrach. a = wysokość.ciśnieniowa(P,p0); Serial.print("Obliczona wysokość: "); Serial.print(a,0); Serial.print("liczniki, "); Serial.print(a*3.28084.0); Serial.println("stopy"); ) else Serial.println("Błąd pobierania ciśnienia\n"); ) else Serial.println("Nie udało się uzyskać ciśnienia\n"); ) else Serial.println("błąd pobierania temperatury\n"); ) else Serial.println("błąd podczas pobierania temperatury\n"); opóźnienie(5000); // pauza 5 sekund. )

BMP085 to barometryczny czujnik ciśnienia (kontroluje również temperaturę).

Czujnik jest używany w wielu projektach, w tym wykorzystujących Arduino, ponieważ praktycznie nie ma analogów. Ponadto jest również niedrogi. Pierwsze pytanie, które się nasuwa, brzmi: dlaczego ktoś miałby mierzyć ciśnienie atmosferyczne? Są tego dwa powody. Pierwszym z nich jest kontrola wysokości. Wraz ze wzrostem wysokości ciśnienie spada. Bardzo wygodny do uprawiania turystyki pieszej, jako alternatywa dla nawigatorów GPS. Ponadto wskaźnik ciśnienia barometrycznego służy do prognozowania pogody.

BMP085 został zastąpiony czujnikiem BMP180, który łączy się z Arduino i innymi mikrokontrolerami w taki sam sposób jak jego poprzednik, ale jest mniejszy i tańszy.

Dane techniczne BMP085

  • Zakres czułości: 300-1100 hPa (9000 m - 500 m n.p.m.);
  • Rozdzielczość: 0,03 hPa / 0,25 m;
  • Temperatura pracy -40 do +85°C, dokładność pomiaru temperatury +-2°C;
  • połączenie i2c;
  • V1 na module wykorzystuje moc 3,3 V i moc logiczną;
  • V2 na module wykorzystuje moc 3,3-5 V i moc logiczną;

Po ponownym uruchomieniu Arduino IDE można uruchomić pierwszy szkic, którego kod podano poniżej:

#include <Wire.h>

#include <Adafruit_Sensor.h>

#include <Adafruit_BMP085_U.h>

Adafruit_BMP085_Unified bmp = Adafruit_BMP085_Unified(10085);

unieważnienie konfiguracji (pustość)

Serial.begin(9600);

Serial.println("Test czujnika ciśnienia"); Serial.println("");

/* Inicjalizacja czujnika */

if(!bmp.begin())

/* Jeśli pojawił się napis: "Wystąpił problem podczas wykrywania BMP085...",

Sprawdź podłączenie czujnika */

Serial.print("Ups, nie wykryto BMP085... Sprawdź okablowanie lub ADDR I2C!");

czujniki_event_t zdarzenie;

bmp.getEvent(&event);

/* wyświetl wyniki (ciśnienie barometryczne jest mierzone w hPa) */

jeśli (ciśnienie zdarzenia)

/* Wyświetl ciśnienie atmosferyczne w hPa */

Serial.print("Ciśnienie: "); Serial.print(zdarzenie.ciśnienie); Serial.println("hPa");

Otwórz okno monitora szeregowego (szybkość transmisji - 9600). Nasz szkic powinien wyświetlać dane dotyczące ciśnienia w hPa (hektopaskalach). Możesz sprawdzić, czy czujnik działa, naciskając palec na czujnik. Na rysunku przedstawiono wartości nacisku po naciśnięciu palcem.


Pomiar wysokości

Zapewne wiesz, że ciśnienie spada wraz z wysokością. Oznacza to, że możemy obliczyć wysokość, znając ciśnienie i temperaturę. Ponownie zostawiamy matematykę za kulisami. Jeśli jesteś zainteresowany obliczeniami, możesz je przeczytać na tej stronie Wikipedii.

Poniższy przykład użyje biblioteki dodatków Arduino. Aby obliczyć wysokość za pomocą czujnika BMP085, zaktualizuj funkcję „void loop()”. Wymagane zmiany w szkicu pokazano na poniższym szkicu. W rezultacie otrzymasz wartość temperatury na podstawie poziomu ciśnienia i wartości temperatury.

/* utwórz nowe zdarzenie (zdarzenie) dla czujnika */

czujniki_event_t zdarzenie;

bmp.getEvent(&event);

/* wyświetl wyniki (ciśnienie barometryczne w hPa) */

jeśli (ciśnienie zdarzenia)

/* Wyświetl ciśnienie atmosferyczne w hPa */

Serial.print("Ciśnienie: ");

Serial.print(zdarzenie.ciśnienie);

Serial.println("hPa");

/* aby obliczyć wysokość z określoną dokładnością, musisz znać *

* średnie ciśnienie i temperatura otoczenia

* w stopniach Celsjusza w momencie odczytu*

* jeśli nie posiadasz tych danych możesz skorzystać z "wartości domyślnej",

* co jest równe 1013,25 hPa (ta wartość jest zdefiniowana jako

* SENSORS_PRESSURE_SEALEVELHPA *

* w pliku czujniki.h). Ale wyniki nie będą dokładne *

*Wymagane wartości znajdują się na stronach z prognozami temperatur*

* lub na zasobach centrów informacyjnych na dużych lotniskach *

* na przykład dla Paryża we Francji można znaleźć aktualną średnią wartość ciśnienia *

* przez stronę internetową: http://bit.ly/16Au8ol */

/* pobierz aktualną wartość temperatury z czujnika BMP085 */

płynna temperatura;

bmp.getTemperatura(&temperatura);

Serial.print("Temperatura: ");

Druk seryjny (temperatura);

Serial.println("C");

/* przekonwertuj odebrane dane na wysokość */

/* zaktualizuj następną linię aktualnymi wartościami */

float seaLevelPressure = SENSORS_PRESSURE_SEALEVELHPA;

Serial.print("Wysokość: ");

Serial.print(bmp.pressureToAltitude(seaLevelPressure,

Serial.println("m");

Serial.println("");

Serial.println("Błąd czujnika");

Uruchamiamy szkic i widzimy obliczoną wysokość nad poziomem morza.

Dokładność odczytów BMP085 można znacznie poprawić, określając średnią wartość ciśnienia, która zmienia się w zależności od pogody. Każdy 1 hPa ciśnienia, którego nie uwzględniliśmy, daje błąd 8,5 metra!

Poniższy rysunek przedstawia wartości ciśnienia z jednego z zasobów informacyjnych europejskiego lotniska. Wartość ciśnienia jest podświetlona na żółto, dzięki czemu możemy zawęzić wyniki.


Zmieńmy następujący wiersz na naszym szkicu, wpisując w nim rzeczywistą wartość (1009 hPa):

float seaLevelPressure = 1009;

W rezultacie otrzymujemy nieco inne wyniki:

Wskazówka: Podczas określania ciśnienia pamiętaj o przekonwertowaniu użytych danych na hPa.

Korzystanie z BMP085 (API v1)

Powtarzamy jeszcze raz: aby poznać ciśnienie i wysokość nad poziomem morza, musimy wykonać pewne obliczenia. Ale wszystkie z nich są już zawarte w bibliotece Arduino Adafruit_BMP085 (API v1), którą można pobrać z linku.

Po zainstalowaniu bibliotek należy zrestartować Arduino IDE

Po ponownym uruchomieniu możesz uruchomić pierwszy przykład szkicu:

#include <Wire.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.println("*C");

Serial.print("Ciśnienie = ");

Serial.println("Pa");

Serial.println();

Po flashowaniu Arduino otwórz monitor szeregowy. Ustaw szybkość transmisji na 9600. Szkic wyświetli temperaturę w stopniach Celsjusza i ciśnienie w paskalach. Jeśli położysz palec na elemencie czujnikowym czujnika, temperatura i ciśnienie wzrosną:


Pomiar wysokości (API v1)

Aby kontrolować wysokość nad poziomem morza, po prostu uruchom poniższy szkic:

#include <Wire.h>

#include <Adafruit_BMP085.h>

Adafruit_BMP085 bmp;

Serial.begin(9600);

Serial.print("Temperatura = ");

Serial.print(bmp.readTemperature());

Serial.println("*C");

Serial.print("Ciśnienie = ");

Serial.print(bmp.readPressure());

Serial.println("Pa");

// oblicz wysokość nad poziomem morza, zaczynając od wartości

// „standardowe” ciśnienie barometryczne równe 1013,25 mibar = 101325 paskali

Serial.print("Wysokość = ");

Serial.print(bmp.readAltitude());

Serial.println("liczniki");

Serial.println();

Uruchom szkic, aby wyświetlić wyniki:


Sądząc po powyższych odczytach, znajdujemy się na wysokości -21,5 metra nad poziomem morza. Ale wiemy, że jesteśmy nad morzem! Przypominamy ten sam problem, co przy korzystaniu z API V2. Musimy wziąć pod uwagę pogodę! OK. Załóżmy, że znajdujemy wysokiej jakości witrynę pogodową, a ciśnienie wynosi 101,964 Pa. Otwórz przykład testowy Examples->BMP085 w Arduino IDE i edytuj linię, która jest podświetlona na poniższym rysunku:


Wprowadź aktualne dane ciśnienia w tym wierszu. Po nowym starcie okaże się, że dane diametralnie się zmieniły i otrzymaliśmy 29,58 metra ze znakiem plus, co znacznie bardziej przypomina prawdę.


Zostaw swoje komentarze, pytania i podziel się swoimi osobistymi doświadczeniami poniżej. W dyskusji często rodzą się nowe pomysły i projekty!

Program dla Arduino z komentarzami:

/* Przykładowy szkic biblioteki SFE_BMP180

Ten szkic pokazuje, jak używać biblioteki SFE_BMP180 do odczytu
Barometryczny czujnik ciśnienia Bosch BMP180.
https://www.sparkfun.com/products/11824
Podobnie jak większość czujników ciśnienia, BMP180 mierzy ciśnienie bezwzględne.
Jest to rzeczywiste ciśnienie otoczenia widziane przez urządzenie, które będzie
zmieniać się zarówno w zależności od wysokości, jak i pogody.
Przed wykonaniem pomiaru ciśnienia należy wykonać pomiar temperatury.
Odbywa się to za pomocą startTemperature() i getTemperature().
Wynik jest w stopniach C.
Po odczytaniu temperatury możesz wykonać odczyt ciśnienia.
Odbywa się to za pomocą startPressure() i getPressure().
Wynik jest podany w milibarach (mb), czyli hektopaskalach (hPa).
Jeśli będziesz monitorować wzorce pogodowe, prawdopodobnie będziesz chciał
usunąć wpływ wysokości. Spowoduje to odczyty, które mogą
porównać z opublikowanymi odczytami ciśnienia z innych lokalizacji.
Aby to zrobić, użyj funkcji sealevel(). Będziesz musiał podać
znana wysokość, na której zmierzono ciśnienie.
Jeśli chcesz zmierzyć wysokość, musisz znać ciśnienie
na wysokości bazowej. Może to być średnie ciśnienie na poziomie morza lub
poprzedni odczyt ciśnienia na danej wysokości, w takim przypadku
kolejne odczyty wysokości będą + lub - początkowej linii bazowej.
Odbywa się to za pomocą funkcji height().

połączenia sprzętowe:
- (GND) do GND
+ (Vin) do 5V
Będziesz także musiał podłączyć piny I2C (SCL i SDA) do swojego
Arduino. Kołki są różne w różnych Arduino:
Wszelkie piny Arduino oznaczone: SDA SCL
Uno, Redboard, Pro: A4 A5
Mega2560, Termin: 20 21
Leonarda: 2 3

Biblioteka SFE_BMP180 wykorzystuje równania zmiennoprzecinkowe opracowane przez
Projekt rejestratora danych stacji pogodowej: http://wmrx00.sourceforge.net/

V10 Mike Grusin, SparkFun Electronics 24.10.2013
Aktualizacje V1.1.2 dla Arduino 1.6.4 5/2015
*/

// Twój szkic musi #zawierać tę bibliotekę oraz bibliotekę Wire.
// (Wire to standardowa biblioteka dołączona do Arduino.):

#włączać
#włączać
#włączać

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

// Będziesz musiał utworzyć obiekt SFE_BMP180, tutaj zwany „naciskiem”:
ciśnienie SFE_BMP180;

anuluj konfigurację ()
{
lcd.begin(16, 2);
// Zainicjuj czujnik (ważne jest, aby wartości kalibracji zostały zapisane w urządzeniu).
ciśnienie.rozpocznij();
}

pusta pętla ()
{
stan znaku;
podwójne T,P,p0=1013,0,a;// 1013,0 - ciśnienie w hPa na poziomie morza

// Najpierw musisz wykonać pomiar temperatury, aby wykonać odczyt ciśnienia.
// Rozpocznij pomiar temperatury:

stan = ciśnienie. startTemperatura();
jeśli (stan != 0)
{
opóźnienie (stan);

// Pobierz zakończony pomiar temperatury:
// Zauważ, że pomiar jest przechowywany w zmiennej T.

status = ciśnienie.pobierzTemperaturę(T);
jeśli (stan != 0)
{
lcd.setCursor(0, 0);
lcd.print("Temp=");
lcd.print(T,2);
lcd.print("C");
// Rozpocznij pomiar ciśnienia:
// Parametr to ustawienie nadpróbkowania, od 0 do 3 (najwyższa rozdzielczość, najdłuższe oczekiwanie).
// Jeśli żądanie się powiedzie, zwracana jest liczba ms oczekiwania.
// Jeśli żądanie nie powiedzie się, zwracane jest 0.

stan = ciśnienie.startPressure(3);
jeśli (stan != 0)
{
// Poczekaj na zakończenie pomiaru:
opóźnienie (stan);

// Pobierz zakończony pomiar ciśnienia:
// Zauważ, że pomiar jest przechowywany w zmiennej P.
// Zauważ też, że funkcja wymaga wcześniejszego pomiaru temperatury (T).
// (Jeśli temperatura jest stabilna, możesz wykonać jeden pomiar temperatury dla kilku pomiarów ciśnienia.)
// Funkcja zwraca 1, jeśli się powiedzie, 0, jeśli się nie powiedzie.

stan = ciśnienie.pobierzCiśnienie(P,T);
jeśli (stan != 0)
{
// Wydrukuj pomiar:
lcd.setCursor(0, 1);
lcd.print("P=");
lcd.print(P/1.333,0); // współczynnik 1,333 - konwersja hPa na mm Hg.

// Jeśli chcesz określić swoją wysokość na podstawie odczytu ciśnienia,
// użyj funkcji wysokości wraz z ciśnieniem bazowym (na poziomie morza lub innym).
// Parametry: P = ciśnienie bezwzględne w mb, p0 = 1013 ciśnienie bazowe w mb.
// Wynik: a = wysokość w m.

a = wysokość.ciśnieniowa(P,p0);
lcd.print("H=");
lcd.print(a,2);
wydruk lcd("m");
}
else lcd.print("błąd");
}
else lcd.print("błąd");
}
else lcd.print("błąd");
}
else lcd.print("błąd");
opóźnienie(5000); // Pauza na 5 sekund.

Czujniki ciśnienia atmosferycznego bmp180, bmp280, bme280 są częstymi gośćmi w projektach inżynierskich. Z ich pomocą można przewidzieć pogodę czy zmierzyć wysokość nad poziomem morza. Dziś tę konkretną linię można nazwać najpopularniejszymi i najtańszymi czujnikami dla arduino. W tym artykule wyjaśnimy zasadę działania czujników, schemat połączeń z różnymi płytami Arduino oraz podamy przykłady szkiców programistycznych.

Barometr to urządzenie służące do pomiaru ciśnienia atmosferycznego. Barometry elektroniczne są wykorzystywane w robotyce i różnych urządzeniach elektronicznych. Najpopularniejsze i niedrogie są czujniki ciśnienia firmy BOSH: są to BMP085, BMP180, BMP280 i inne. Pierwsze dwa są do siebie bardzo podobne, BMP280 to nowszy i ulepszony sensor.

Czujniki ciśnienia działają na zasadzie przekształcania ciśnienia w ruch mechaniczny. Czujnik ciśnienia składa się z przetwornika z elementem czułym, obudowy, elementów mechanicznych (membrany, sprężyny) oraz układu elektronicznego.

BMP280 jest specjalnie zaprojektowany do zastosowań, w których wymagane są niewielkie rozmiary i niskie zużycie energii. Takie zastosowania obejmują systemy nawigacyjne, prognozowanie pogody, wskazanie prędkości pionowej i inne. Czujnik ma wysoką dokładność, dobrą stabilność i liniowość. Dane techniczne czujnika BMP280:

  • Wymiary 2x2,5x0,95mm.
  • Ciśnienie 300-1100hPa;
  • Temperatury od 0°C do 65°C;
  • Obsługa interfejsów I2C i SPI;
  • Napięcie zasilania 1,7V - 3,6V;
  • Średni prąd 2,7uA;
  • 3 tryby pracy - tryb uśpienia, tryb WYMUSZONY (dokonywanie pomiarów, odczyt wartości, przejście w stan uśpienia), tryb NORMALNY (przejście czujnika do pracy cyklicznej - czyli urządzenie automatycznie wybudza się po zadanym czasie, dokonuje pomiarów, odczytuje odczyty , zapisuje zmierzone wartości i wraca do trybu uśpienia).

BMP180 to niedrogi i łatwy w użyciu czujnik dotykowy, który mierzy ciśnienie barometryczne i temperaturę. Jest zwykle używany do określania wysokości iw stacjach pogodowych. Urządzenie składa się z czujnika piezo-rezystancyjnego, czujnika termicznego, przetwornika ADC, pamięci nieulotnej, pamięci RAM oraz mikrokontrolera.

Dane techniczne czujnika BMP180:

  • Granice mierzonego ciśnienia 225-825 mm Hg. Sztuka.
  • Napięcie zasilania 3,3 - 5 V;
  • Prąd 0,5mA;
  • Obsługa interfejsu I2C;
  • Czas odpowiedzi 4,5 ms;
  • Wymiary 15x14mm.

Czujnik bme280 zawiera 3 urządzenia - do pomiaru ciśnienia, wilgotności i temperatury. Zaprojektowany z myślą o niskim poborze prądu, wysokiej niezawodności i długotrwałej stabilnej pracy.

Specyfikacja czujnika bme280:

  • Wymiary 2,5x2,5x0,93mm;
  • Metalowa obudowa LGA wyposażona w 8 wyjść;
  • Napięcie zasilania 1,7 - 3,6 V;
  • Dostępność interfejsów I2C i SPI;
  • Pobór prądu w trybie czuwania 0,1 uA.

Jeśli porównamy ze sobą wszystkie urządzenia, to czujniki są bardzo podobne. W porównaniu do swojego poprzednika, który obejmuje BMP180, nowszy czujnik BMP280 jest zauważalnie mniejszy. Jego ośmiopinowa miniaturowa obudowa wymaga ostrożności podczas instalacji. Urządzenie obsługuje również interfejsy I2C i SPI, w przeciwieństwie do swoich poprzedników, które obsługiwały tylko I2C. Zgodnie z logiką czujnika zmian praktycznie nie ma, poprawiono jedynie stabilność temperaturową i zwiększono rozdzielczość przetwornika ADC. Czujnik temperatury, wilgotności i ciśnienia BME280 jest również podobny do BMP280. Różnica między nimi polega na wymiarach obudowy, ponieważ BME280 ma czujnik wilgotności, który nieznacznie zwiększa wymiary. Liczba styków i ich lokalizacja na obudowie są takie same.

Opcje połączeń dla Arduino

Podłączenie czujnika BMP180 do Arduino. Do podłączenia potrzebny będzie sam czujnik BMP180, płytka Arduino UNO, przewody łączące. Schemat połączeń pokazano na poniższym rysunku.

Masa z Arduino musi być podłączona do masy na czujniku, napięcie wynosi 3,3 V, SDA - do pinu A4, SCL - do A5. Piny A4 i A5 są wybierane na podstawie ich obsługi interfejsu I2C. Sam czujnik działa na napięciu 3,3 V, a Arduino - od 5 V, więc na module z czujnikiem zainstalowany jest regulator napięcia.

Podłączanie BMP 280 do Arduino. Pinout i widok z góry płytki pokazano na rysunku.

Sam moduł czujnika ciśnienia wygląda następująco:

Aby połączyć się z Arduino należy podłączyć wyjścia w następujący sposób: podłączyć masę do Arduino i na czujniku, VCC - do 3,3V, SCL/SCK - do pinu analogowego A5, SDA/SDI - do A4.

Podłączenie czujnika BME280. Układ pinów i pinout BME280 jest taki sam jak w BMP280.

Ponieważ czujnik może pracować poprzez I2C i SPI, połączenie można zrealizować na dwa sposoby.

Podczas łączenia przez I2C należy połączyć piny SDA i SCL.

Łącząc się przez SPI należy podłączyć SCL z modułu i SCK (pin 13 na Arduino), SDO z modułu na Arduino pin 12, SDA na pin 11, CSB (CS) na dowolny pin cyfrowy, w tym przypadku na pin 10 na Arduino. W obu przypadkach napięcie jest podłączone do 3,3 V na Arduino.

Opis biblioteki do pracy z czujnikiem. Przykład szkicu

Do pracy z czujnikiem BMP180 dostępne są różne biblioteki, które upraszczają pracę. Należą do nich SFE_BMP180, Adafruit_BMP085. Te same biblioteki są odpowiednie do pracy z czujnikiem BMP080. Czujnik bmp280 wykorzystuje podobną bibliotekę Adafruit_BMP280.

Pierwszy szkic testowy będzie zawierał odczyty ciśnienia i temperatury z czujnika. Kod pasuje zarówno do czujnika BMP180 jak i do BMP280, wystarczy podłączyć odpowiednią bibliotekę i podać odpowiednie piny do których podłączony jest moduł. Przede wszystkim w kodzie należy połączyć wszystkie biblioteki i zainicjować działanie czujnika. Aby określić ciśnienie, musisz najpierw znać temperaturę. W tym celu używany jest następujący element kodu.

Status = pressure.startTemperature();// Odczyt danych temperaturowych z czujnika if(status!=0)( delay(status); // Status oczekiwania = pressure.getTemperature(T); // Zapisanie odebranych danych temperaturowych if( status !=0)( Serial.print("Temperatura: "); // Wyświetlenie słowa "Temperatura" Serial.print(T,2); // Wydruk wartości temperatury. Serial.println("deg C, "); //Wydrukuj symbol Celsjusza.

Następnie musisz uzyskać informacje o ciśnieniu atmosferycznym.

Stan = ciśnienie.startPressure(3); // odczyt ciśnienia if(status!=0)(opóźnienie(status); //stan oczekiwania = pressure.getPressure(P,T); //pobranie ciśnienia, zapisanie if(status!=0)( Serial.print( " Ciśnienie bezwzględne: "); // Wydruk napisu "Ciśnienie atmosferyczne" Serial.print(P,2); // Wydruk wartości zmiennej mBar Serial.print(" mbar, "); // Wydruk tekstu na ekranie "mBar" Serial.print(P*0.7500637554192,2); // wyświetl wartość w mmHg (mmHg) Serial.println(" mmHg");) // wydrukuj jednostkę ciśnienia "mmHg" " (mmHg.).

Po przesłaniu szkicu w oknie monitorowania portu zostaną wyświetlone dane dotyczące temperatury i ciśnienia atmosferycznego.

Czujnik BME280 pokazuje również ciśnienie i temperaturę, dodatkowo może odczytywać odczyty wilgotności, która jest domyślnie wyłączona. W razie potrzeby możesz dostosować ustawienia czujnika i rozpocząć odczytywanie odczytów wilgotności. Zakres pomiarowy od 0 do 100%. Biblioteka potrzebna do pracy z czujnikiem nazywa się Adafruit_BME280.

Kod jest podobny do opisanego powyżej, tylko dodaje się do niego linie w celu określenia wilgotności.

Void printValues() ( Serial.print("Temperatura = "); Serial.print(bme.readTemperature()); Serial.println("C"); //Określ temperaturę, wyświetl ją na ekranie w stopniach Celsjusza. Serial.print("Pressure = "); Serial.print(bme.readPressure() / 100.0F); Serial.println(" hPa"); //Wyznaczanie ciśnienia, wyświetlanie go na ekranie Serial.print("Humidity = "); Serial.print(bme.readHumidity()); Serial.println(" %"); //określenie wilgotności w procentach, wyświetlenie zmierzonej wartości na ekranie. Serial.println(); )

Możliwe błędy połączenia i ich eliminacja

Najczęstszym błędem są błędne dane dotyczące ciśnienia i temperatury, które różnią się o kilka rzędów wielkości od wartości rzeczywistej. Powodem tego najczęściej jest nieprawidłowe podłączenie - np. biblioteka wskazuje, że trzeba połączyć się przez I2C, a czujnik jest podłączony przez SPI.

Ponadto podczas korzystania z „chińskich” czujników można napotkać niestandardowe adresy I2C lub SPI. W takim przypadku zaleca się przeskanowanie wszystkich podłączonych urządzeń za pomocą jednego z popularnych szkiców i sprawdzenie, na który adres odpowiada czujnik ciśnienia.

Innym problemem może być rozbieżność pomiędzy napięciem roboczym zasilania modułu a napięciem bazowym zastosowanego sterownika. Tak więc, aby pracować z czujnikiem 3,3 V, musisz utworzyć dzielnik napięcia lub użyć jednego z istniejących gotowych modułów dopasowujących poziom. Nawiasem mówiąc, takie moduły są dość tanie i zaleca się korzystanie z nich początkującym.

Niewielkie odchylenia od rzeczywistej wartości mogą wynikać z kalibracji czujnika. Na przykład dla czujnika BMP180 wszystkie dane są obliczane i określane na szkicu. Aby uzyskać dokładniejszą wartość wysokości, musisz znać aktualną wartość ciśnienia nad poziomem morza dla tych współrzędnych.

Wniosek

Czujniki ciśnienia atmosferycznego bmp180, bmp280 nie należą do najtańszych typów czujników, ale w wielu przypadkach praktycznie nie ma alternatywy dla takich czujników. W projekcie stacji pogodowej czujnik wychwytuje ważny parametr – ciśnienie atmosferyczne, co pozwala przewidywać pogodę. W projektach związanych z tworzeniem pojazdów latających barometr jest wykorzystywany jako czujnik rzeczywistej wysokości nad poziomem morza.

Podłączenie czujników nie jest trudne, ponieważ. Wykorzystuje standardowe połączenie i2C lub SPI. Do programowania możesz użyć jednego z gotowych plików .