Wysokościomierz barometryczny

Wysokościomierz barometryczny

Okres wakacji czy ferii zimowych to dla większości osób szansa na zwiększoną aktywność na świeżym powietrzu, niejednokrotnie powiązaną z przełamywaniem własnych barier i ograniczeń, a już na pewno codziennej rutyny. Zwykle to właśnie wtedy wyruszamy w szeroko pojęty świat, eksplorując wszystko, co nieznane i ciesząc się brakiem obowiązków. Właśnie z myślą o takich osobach powstał ten prosty projekt wysokościomierza barometrycznego, który pozwoli co sprawniejszym piechurom na poznanie parametrów środowiskowych eksplorowanych terenów.

Podstawowe parametry:
  • zakres obliczanej wysokości nad poziomem morza: 0…9000 m, z rozdzielczością 0,1 m,
  • zakres pomiarowy ciśnienia atmosferycznego: 300…1100 hPa, z rozdzielczością 1 hPa i dokładnością ±1,7 hPa,
  • zakres pomiarowy wilgotności powietrza: 0…100%, z rozdzielczością 1% i dokładnością ±3%,
  • zakres pomiarowy temperatury otoczenia: 0…85°C, z rozdzielczością 0,1°C i dokładnością ±0,5°C,
  • zakres regulacji ciśnienia: 900…1100 hPa, z rozdzielczością 1 hPa,
  • napięcie zasilania (jeśli nie korzystamy z baterii): 0,9…5,5 V,
  • pobór prądu z baterii zasilającej (uśpienie/praca): 9 μA/15 mA.

Zanim przejdę do opisu urządzenia, kilka słów należy napisać o samym ciśnieniu atmosferycznym, którego pomiar stoi u podstaw działania urządzenia. Z definicji, ciśnienie atmosferyczne jest stosunkiem wartości siły, z jaką słup powietrza atmosferycznego naciska na powierzchnię Ziemi, do powierzchni, na jaką ten słup naciska. Wynika z tego, że dla przykładu ciśnienie atmosferyczne w górach jest niższe, a na nizinach wyższe, ponieważ słup powietrza w tych rejonach ma różne wysokości. Zależność ta ma w przybliżeniu charakter wykładniczy, co pokazano na rysunku 1.

Rysunek 1. Wykres zależności bezwzględnego ciśnienia atmosferycznego od wysokości n.p.m.

Wartość ciśnienia atmosferycznego dla standardowych warunków pogodowych dla wysokości h (n.p.m.) możemy zatem wyznaczyć z uproszczonej zależności opisanej wzorem:

gdzie
ph – ciśnienie bezwzględne na wysokości h n.p.m.,
p0 – ciśnienie na poziomie morza (równe 1013,25 hPa dla standardowych warunków pogodowych),
h – wysokość n.p.m.
Z podobnej zależności możemy obliczyć wysokość nad poziomem morza, posiłkując się zmierzonym, bezwzględnym ciśnieniem atmosferycznym (właśnie na tejże wysokości) oraz ciśnieniem na poziomie morza. Wzór, o którym mowa, wygląda następująco:

Dociekliwi Czytelnicy już w tym momencie zorientują się, iż obliczenia tego typu wartości należy wykonywać na liczbach rzeczywistych (float lub fixed point), co dla mikrokontrolerów 8-bitowych stanowić może nie lada wyzwanie. Już teraz powiem, że program obsługi aplikacji korzystał będzie z funkcji pow() (plik nagłówkowy math.h, biblioteka libm.a), która sama w sobie spowoduje zwiększenie objętości kodu wynikowego o niespełna 2 kB. Na szczęście dobrać możemy mikrokontroler o odpowiedniej wielkości pamięci Flash, niejako niwelując ten problem, choć ciągle należy mieć na uwadze, iż obliczenia te zajmą sporo taktów zegara mikrokontrolera (a dokładnie aż 9500 taktów, co potrwa 9,5 ms). Dodatkowo, warto zauważyć, że aby stosowne obliczenia były wystarczająco dokładne, należy znać wartość ciśnienia atmosferycznego na poziomie morza, dla obszaru, dla którego wyznaczyć chcemy interesującą nas wysokość.

Wróćmy zatem do samego wzoru. Wynika z niego, iż zmianie ciśnienia atmosferycznego o 1 hPa odpowiada zmiana wysokości o 8,43 m. Co ciekawe, wspomniane ciśnienie na poziomie morza wprowadzają piloci, konfigurując wysokościomierz barometryczny, który jest jednym z wielu źródeł informacji o wysokości nad poziomem morza (nie mylić z wysokością nad terenem). Na koniec, warto podkreślić istotną różnicę pomiędzy wartością bezwzględnego ciśnienia atmosferycznego dla danej miejscowości (ciśnienia tam panującego) a wartością ciśnienia podawanego w prognozach pogody. To ostatnie jest ciśnieniem, jakie wystąpiłoby danego dnia w danej miejscowości, gdyby znajdowała się ona na poziomie morza, czyli de facto jest to bezwzględne ciśnienie atmosferyczne dla tego rejonu przeliczone dla poziomu morza. Tego typu konwersja ułatwia zorientowanie się co do warunków pogodowych dla różnych wysokości n.p.m.

Tyle w kwestii niezbędnej, acz ogólnikowej teorii. Wniosek z tego taki, że aby zmierzyć wysokość nad poziomem morza, na jakiej się znajdujemy, niezbędny jest dokładny element pomiarowy pozwalający na pomiar ciśnienia atmosferycznego. Tym razem wybór tego elementu był oczywisty. Jako że w EP 10/2019 opisałem projekt niewielkiej stacji pogodowej, zawierającej scalony barometr pod postacią układu scalonego firmy Bosch Sensortec o oznaczeniu BME280, także i tym razem pokuszę się o zastosowanie tego ciekawego elementu. Najbardziej optymalny będzie gotowy moduł, co w zamyśle ma ułatwić montaż urządzenia, gdyż sam scalak umieszczono w obudowie LGA, której implementacja mogłaby nastręczać wielu problemów w warsztacie typowego amatora.

Czujnik BME280

Przede wszystkim należy zwrócić uwagę na fakt, aby nie pomylić modułu z układem BME280 ze znacznie tańszym i starszym (a wizualnie identycznym) modułem z układem BMP280, gdyż ten ostatni nie wspiera pomiaru wilgotności powietrza. Układ BME280 jest scalonym, specjalizowanym przetwornikiem pozwalającym na pomiar bezwzględnego ciśnienia atmosferycznego, wilgotności powietrza i temperatury charakteryzującym się następującymi, wybranymi cechami użytkowymi:

  • pomiar ciśnienia atmosferycznego (300…1100 hPa), temperatury otoczenia (–40…85°C) i wilgotności (0…100%),
  • szeroki zakres napięć zasilania 1,7...3,6 V,
  • niski pobór prądu rzędu 3,6 μA/pomiar,
  • wysoka dokładność pomiaru oraz niski poziom szumów,
  • szybka magistrala I²C z dopuszczalną prędkością sygnału zegarowego, dochodzącą do 3,4 MHz,
  • szybka magistrala SPI z dopuszczalną prędkością sygnału zegarowego, dochodzącą do 10 MHz,
  • małe wymiary obudowy typu LGA 2,5×2,5 mm.

Powyższe parametry użytkowe idealnie wpisują się w założenia naszego projektu, dostarczając, niejako ekstra, dwie dodatkowe wielkości fizyczne. Jak to zwykle bywa, obsługa peryferiów tego typu polega na zapisie/odczycie wielu, specjalnych rejestrów konfiguracyjnych lub też rejestrów danych, przy udziale których, po pierwsze, możemy zainicjować proces pomiarowy, a po drugie, dokonać odczytu interesujących nas wartości surowego ciśnienia atmosferycznego, wilgotności i temperatury otoczenia. Dlaczego używam słowa surowego?

Otóż każdy element BME280 przechodzi na etapie produkcji proces kalibracji, który zapewnia osiągnięcie założonej dokładności pomiarów, niezależnie od właściwości elementu piezorezystancyjnego, który stanowi w nim przetwornik ciśnienia na napięcie. Proces ten kończy się ustaleniem szeregu (dokładnie osiemnastu) specjalnych współczynników korekcyjnych (zapisanych w nieulotnej pamięci EEPROM elementu), dzięki którym możliwe staje się obliczenie skompensowanej wartości ciśnienia atmosferycznego, wilgotności i temperatury. Jest to dość typowe rozwiązanie stosowane przez wielu producentów w przypadku elementów tego rodzaju, które przechodzą proces kalibracji na ostatnim etapie produkcji. Biorąc to pod uwagę, pierwszą czynnością, jaką należy wykonać w przypadku obsługi układu BME280, jest odczyt osiemnastu, 16- i 8-bitowych rejestrów, które przechowują wartości współczynników korekcyjnych. Następnie wysyłamy do układu BME280 rozkaz inicjujący pomiary, by po pewnym czasie odczytać surowe (czyli nieskompensowane) wartości interesujących nas parametrów. Dalej, na podstawie dość skomplikowanych wzorów dostarczonych przez producenta układu, obliczamy wartości skompensowanego ciśnienia atmosferycznego, wilgotności i temperatury otoczenia.

Szczerze mówiąc, nie rozumiem tego rodzaju podejścia, które o dziwo, prezentują producenci większości scalonych barometrów. Przecież korzystając z faktu, iż wspomniane współczynniki korekcyjne znajdują się w nieulotnej pamięci układu, można byłoby całą procedurę obliczeń pozostawić po stronie elementu, a użytkownikowi udostępnić gotowe wartości skompensowanego ciśnienia, wilgotności i temperatury, co znacznie ułatwiłoby obsługę takiego rodzaju peryferium. Niemniej jednak trzeba przyznać, że firma Bosch Sensortec dostarcza gotowy driver do obsługi swojego czujnika, co znacznie upraszcza proces implementacji własnego oprogramowania. O samej implementacji nie napiszę w tym momencie ani słowa, gdyż nie ma sensu kopiować informacji zawartych w moim artykule, o którym była mowa powyżej. Dla ciekawskich nadmienię, że aby zwiększyć dokładność pomiarów ciśnienia i temperatury oraz zmniejszyć wpływ chwilowych wahań na wynik pomiaru, zastosowano oversampling oraz cyfrowy filtr IIR, dostępne z poziomu rejestrów układu (w ramach opcji konfiguracyjnych). Tyle w kwestii układu BME280.

Budowa i działanie

Schemat urządzenia został pokazany na rysunku 2. Zaprojektowano bardzo prosty system mikroprocesorowy, którego sercem jest niewielki mikrokontroler firmy Microchip (dawniej Atmel) pod postacią układu ATtiny84A taktowany wewnętrznym generatorem RC o częstotliwości 1 MHz, realizujący całą, założoną funkcjonalność urządzenia. Mikrokontroler ten steruje pracą niewielkiego graficznego wyświetlacza OLED o organizacji 128×32 piksele stanowiącego element graficznego interfejsu użytkownika, wykorzystując do tego celu programową implementację interfejsu I²C, w który wyposażony jest zastosowany rodzaj wyświetlacza. Mikrokontroler obsługuje też scalony czujnik temperatury, wilgotności i ciśnienia atmosferycznego pod postacią układu firmy Bosch Sensortec o oznaczeniu BME280, wykorzystując ten sam sprzęg I²C.

Rysunek 2. Schemat ideowy wysokościomierza barometrycznego

Jako że wysokościomierz z założenia zaprojektowano jako urządzenie przenośne, dla którego krytycznym parametrem jest pobór mocy ze źródła napięcia zasilającego, zadbano o odpowiednią implementację bloku zasilającego. Zdecydowałem się na zastosowanie popularnej baterii pastylkowej typu CR2032 o pojemności ok. 240 mAh. Z uwagi na fakt, iż napięcie takiej baterii w trakcie rozładowania może spaść nawet poniżej 2 V, a zastosowany rodzaj wyświetlacza nie toleruje (lub słabo toleruje) tego poziomu napięcie zasilające, zdecydowałem się na zastosowanie prostej, acz nowoczesnej przetwornicy step-up pod postacią układu scalonego XC9140C331MR-G firmy Torex, która dostarcza napięcie wyjściowe rzędu 3,3 V już przy napięciu wejściowym na poziomie 0,9 V i zapewnia niski prąd spoczynkowy w granicach 6,5 μA oraz wysoką sprawność, co nie jest bez znaczenia dla zastosowanego źródła napięcia zasilającego. W ten sposób rozwiązałem problem spadku napięcia baterii CR2032 w czasie użytkowania urządzenia, maksymalizując tym samym czas pracy na jednej baterii zasilającej.

Dla minimalizacji zużycia energii w trybie uśpienia urządzenia zastosowano sterowanie zasilaniem wbudowanego wyświetlacza OLED, które to realizowane jest dzięki tranzystorowi MOSFET z kanałem P (T1). Dzięki temu zabiegowi zaoszczędzono dodatkowe 10 μA, które pobiera logika wyświetlacza wyłączonego tylko programowo. Niby niewiele, ale w przypadku zasilania bateryjnego każdy mikroamper jest na wagę złota. Co ważne, w przypadku sterowania zasilaniem wyświetlacza OLED konieczne jest wylutowanie rezystorów podciągających magistralę I²C (2×10 kΩ) umieszczonych na module czujnika BME280. W przeciwnym wypadku wyświetlacz, mimo iż wyłączony przez tranzystor T1, będzie nadal zasilany poprzez rezystory podciągające umieszczone na module czujnika, pobierając tym samym dość znaczny, jak na stan uśpienia, prąd. Może wydawać się to dziwne, gdyż dość duża wartość rezystorów podciągających umieszczonych na module czujnika nie wydaje się wystarczająca do zasilenia wyświetlacza OLED (zwłaszcza, że to zasilanie odbywa się poprzez kolejne rezystory podciągające R4 i R5), jednak testy praktyczne pokazały, że taki stan rzeczy jest jak najbardziej możliwy. Wniosek z tego taki, iż bezwzględnie usuwamy wspomniane rezystory z płytki modułu BME280 (widoczne na zdjęciu tytułowym – tylko te podciągające magistralę).

Dodatkowo, aby ograniczyć pobór mocy, w trybie uśpienia zastosowano następujące rozwiązania sprzętowo-programowe:

  • mikroprocesor wprowadzany jest w tryb niskiego poboru mocy Power Down (<0,2 μA),
  • czujnik BME280 wprowadzany jest w tryb niskiego poboru mocy Power Down (<0,1 μA),
  • zasilanie OLED-a jest wyłączane.

Aby ocenić, jak długo urządzenie będzie pracować na pojedynczej baterii CR2032, należy zastanowić się, z jakich etapów składa się jego praca i jakie są wtedy prądy pobierane ze źródła napięcia zasilającego. Przystępując do obliczeń, przyjąłem następujący podział cyklu pracy urządzenia:

  • etap trybu Power Down (uśpienia), który trwa z dużym przybliżeniem 24 h/dobę i podczas którego pobierany jest prąd rzędu 9 μA (większość tego prądu to prąd spoczynkowy przetwornicy),
  • etap pracy urządzenia, a zatem wykonywania i wyświetlania pomiarów, który trwa średnio 10 s i podczas którego pobierany jest średni prąd rzędu 15 mA.

Założono ponadto, iż wybudzanie urządzenia następuje 15 razy na dobę. Przy tych założeniach otrzymano teoretyczny, niespełna 10-miesięczny czas pracy na pojedynczej baterii CR2032 co wydaje się wartością satysfakcjonującą.

Jeśli chodzi o samo wybudzanie i zarazem uruchamianie urządzenia, to możliwe jest ono poprzez naciśnięcie któregokolwiek z przycisków funkcyjnych, a to wszystko dzięki wykorzystaniu (wyłącznie w trybie uśpienia) przerwania zewnętrznego Pin Change Interrupt 1.

Włączone urządzenie pozostaje w tym stanie przez 10 sekund, po czym automatycznie przechodzi do stanu uśpienia, chyba że w międzyczasie nastąpi jakiekolwiek użycie przycisków funkcyjnych, które każdorazowo wydłuża czas przejścia do stanu uśpienia systemu mikroprocesorowego.

Już zupełnie dla porządku dodam, że aplikacja urządzenia korzysta również z wbudowanego w strukturę mikrokontrolera przetwornika ADC (wejście ADC0), przy udziale którego (poprzez prosty dzielnik napięciowy R1/R2) mierzony jest poziom napięcia baterii zasilającej, co pozwala na zgrubne określenie stanu tej baterii. Jest to oczywiście rozwiązanie dość proste, gdyż dokładne określenie stanu baterii wymagałoby zastosowania specjalizowanego kontrolera wielkości traconego ładunku (lub innych rozwiązań sprzętowo-programowych), jednak w tak prostych systemach wydaje się w zupełności wystarczające.

Montaż i uruchomienie

Schemat płytki PCB urządzenia pokazano na rysunku 3. Jak widać, zaprojektowano niewielki, dwustronny obwód drukowany ze zdecydowaną przewagą elementów SMD montowanych po obu stronach laminatu, który wymiarami zbliżony jest do wymiarów płytki drukowanej zastosowanego modułu wyświetlacza OLED. Montaż urządzenia rozpoczynamy od warstwy BOTTOM, gdzie w pierwszej kolejności montujemy półprzewodniki, a następnie elementy bierne. W tym momencie przechodzimy na warstwę TOP, gdzie jak poprzednio, w pierwszej kolejności przylutowujemy półprzewodniki a na końcu elementy bierne. Dalej ponownie przechodzimy na warstwę BOTTOM, gdzie przylutowujemy koszyczek baterii zasilającej. I znowu powrót na warstwę TOP, gdzie montujemy switche UP i DOWN oraz moduły wyświetlacza OLED i czujnika BME280, zwyczajnie lutując ich wyprowadzenia GOLDPIN w przeznaczone do tego celu pola lutownicze (należy sprawdzić polaryzację zasilania), gdyż połączenia elektryczne zapewniają im jednocześnie wystarczająco stabilny montaż mechaniczny.

Rysunek 3. Schemat montażowy wysokościomierza barometrycznego

Poprawnie zmontowany układ powinien działać tuż po włączeniu zasilania. Na fotografii 1 pokazano zmontowane urządzenie od strony warstwy TOP tuż przed przylutowaniem wyświetlacza OLED, zaś na fotografii 2 to samo urządzenie od strony warstwy BOTTOM.

Fotografia 1. Zmontowany wysokościomierz od strony warstwy TOP tuż przed przylutowaniem wyświetlacza OLED (wersja prototypowa)
Fotografia 2. Zmontowany wysokościomierz od strony warstwy BOTTOM (wersja prototypowa)

Obsługa

Projektując interfejs użytkownika urządzenia, kierowałem się zasadą maksymalnego uproszczenia sposobu obsługi układu, jak i chęcią wyposażenia go w odpowiednią paletę możliwości. W realizacji tego celu posłużyłem się niewielkim, lecz bardzo atrakcyjnym wyświetlaczem OLED o organizacji 128×32 piksele oraz dwoma mikroprzełącznikami oznaczonymi umownie jako UP i DOWN. Urządzenie wyświetla wyłącznie jeden ekran graficznego interfejsu użytkownika, który pokazano na rysunku 4.

Rysunek 4. Graficzny interfejs użytkownika wysokościomierza barometrycznego

Na ekranie tym standardowo wyświetlane są następujące informacje:

  • obliczeniowa wysokość nad poziomem morza,
  • zmierzone, bezwzględne ciśnienie atmosferyczne,
  • zmierzona wilgotność powietrza,
  • zmierzona temperatura otoczenia,
  • stan baterii zasilającej (w sposób graficzny).
Ustawienia Fuse-bitów:
CKSEL3...0: 0010
SUT1...0: 10
CKDIV8: 0
CKOUT: 1
DWEN: 1
EESAVE

Wszystkie wartości pokazywane w ramach graficznego interfejsu użytkownika odświeżane są 5 razy na sekundę. W przypadku naciśnięcia któregokolwiek z przycisków regulacyjnych (UP lub DOWN) urządzenie przechodzi w tryb regulacji ciśnienia atmosferycznego na poziomie morza dla obszaru, gdzie się znajdujemy, co pozwala (i o czym napisano wcześniej) na dokładny pomiar wysokości nad poziomem morza. Urządzenie pozostaje w tym trybie przez 2 sekundy (czas jest przedłużany przy każdym naciśnięciu przycisku regulacyjnego), po czym automatycznie przechodzi do trybu głównego, gdzie w tym miejscu wyświetlana jest wartość zmierzonego, bezwzględnego ciśnienia atmosferycznego. Fakt regulacji (a zatem tryb regulacji) pokazywany jest poprzez podświetlenie (negację) wartości ciśnienia. Nieużywane urządzenie po 10 sekundach przechodzi w stan uśpienia (wyłącza się).

Robert Wołgajew, EP

Wykaz elementów:
Rezystory: (SMD0805)
  • R1: 2,1 MΩ
  • R2: 1 MΩ
  • R3: 1 kΩ
  • R4, R5: 4,7 kΩ
Kondensatory: (SMD0805)
  • C1, C4: 100 nF ceramiczny X7R
  • C2: 4,7 μF/10 V ceramiczny X5R
  • C3: 10 μF/10 V ceramiczny X5R
Półprzewodniki:
  • U1: ATtiny84A (SOIC14)
  • U2: XC9140C331MR-G (SOT-25)
  • T1: DMP2045U-7 (SOT-23)
  • MOD: moduł z układem BME280 (6 pinów, magistrala I²C, wymiary 15×10 mm)
  • OLED: wyświetlacz OLED 128×32 px, 0,91" (sterownik SSD1306, magistrala I²C, wymiary 38×12 mm)
Pozostałe:
  • L1: dławik drutowy 4,7 μH typu LQH32CN4R7M33L MURATA (SMD1210)
  • UP, DOWN: mikroprzełącznik TACT SMD typu TACTM-67N-F NINIGI (wysokość 7 mm)
  • BATT: koszyczek baterii CR2032 typu DS1092-11-N8S
  • BATERIA: bateria CR2032
Artykuł ukazał się w
Elektronika Praktyczna
grudzień 2022
DO POBRANIA
Materiały dodatkowe

Elektronika Praktyczna Plus lipiec - grudzień 2012

Elektronika Praktyczna Plus

Monograficzne wydania specjalne

Elektronik kwiecień 2024

Elektronik

Magazyn elektroniki profesjonalnej

Raspberry Pi 2015

Raspberry Pi

Wykorzystaj wszystkie możliwości wyjątkowego minikomputera

Świat Radio marzec - kwiecień 2024

Świat Radio

Magazyn krótkofalowców i amatorów CB

Automatyka, Podzespoły, Aplikacje marzec 2024

Automatyka, Podzespoły, Aplikacje

Technika i rynek systemów automatyki

Elektronika Praktyczna kwiecień 2024

Elektronika Praktyczna

Międzynarodowy magazyn elektroników konstruktorów

Elektronika dla Wszystkich kwiecień 2024

Elektronika dla Wszystkich

Interesująca elektronika dla pasjonatów