{"id":387,"date":"2015-12-29T17:05:54","date_gmt":"2015-12-29T16:05:54","guid":{"rendered":"http:\/\/www.daniel.slask.pl\/?p=387"},"modified":"2021-02-12T21:15:24","modified_gmt":"2021-02-12T20:15:24","slug":"bmp180-obsluga-cyfrowego-czujnika-cisnienia-modul-gy-68","status":"publish","type":"post","link":"https:\/\/daniel.slask.pl\/m\/bmp180-obsluga-cyfrowego-czujnika-cisnienia-modul-gy-68\/","title":{"rendered":"BMP180 &#8211; obs\u0142uga cyfrowego czujnika ci\u015bnienia (modu\u0142 GY-68)"},"content":{"rendered":"\n<p>W poprzednim <strong><a href=\"http:\/\/www.daniel.slask.pl\/?p=334\">artykule<\/a><\/strong> przedstawi\u0142em bibliotek\u0119 do obs\u0142ugi czujnika ci\u015bnienia <strong>HP02S<\/strong>. Natomiast tym razem prezentuj\u0119 m\u00f3j pomys\u0142 na obs\u0142ug\u0119 czujnika ci\u015bnienia i temperatury <strong>BMP180<\/strong> firmy <strong>BOSCH<\/strong>. Czujnik ten zosta\u0142 kupiony wraz z modu\u0142em <strong>GY-68<\/strong>, kt\u00f3ry posiada odpowiednie komponenty do prawid\u0142owego (prawie &#8211; o tym mo\u017cna przeczyta\u0107 dalej) dzia\u0142ania ca\u0142ego uk\u0142adu &#8211; stabilizator, kondensatory, oraz rezystory.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Najwa\u017cniejsze cechy czujnika:<\/strong><\/span><\/p>\n\n\n\n<ul><li>zakres mierzonego ci\u015bnienia &#8211; 300 do 1100hPa (pomiar ci\u015bnienia bezwzgl\u0119dnego)<\/li><li>zakres mierzonej temperatury &#8211; -40 do +85\u00b0C<\/li><li>napi\u0119cie zasilania &#8211; 1,8 do 3,6V<\/li><li>pob\u00f3r pr\u0105du w trybie <em>standby<\/em> &#8211; 0.1 \u03bcA<\/li><li>interfejs <strong>I2C<\/strong><\/li><li>uk\u0142ad posiada 11 wsp\u00f3\u0142czynnik\u00f3w kompensuj\u0105cych \u2013 brak potrzeby kalibracji czujnika<\/li><li>czas konwersji zale\u017cny od rozdzielczo\u015bci<\/li><li>rozdzielczo\u015b\u0107 mierzonego ci\u015bnienia (w zale\u017cno\u015bci od rozdzielczo\u015bci) &#8211; 16 do 19 bit.<\/li><li>maksymalna cz\u0119stotliwo\u015b\u0107 linii SCL &#8211; 3.4MHz<\/li><\/ul>\n\n\n\n<p>Wi\u0119cej informacji dotycz\u0105cych parametr\u00f3w uk\u0142adu znajduje si\u0119 w nocie katalogowej. &#8211; nie b\u0119d\u0119 ich wszystkich tutaj przepisywa\u0142 Jak mo\u017cna zauwa\u017cy\u0107 jest to czujnik, kt\u00f3ry pobiera ma\u0142o energii w stosunku do swoich parametr\u00f3w &#8211; pob\u00f3r mocy jest zale\u017cny od rozdzielczo\u015b\u0107 mierzonego ci\u015bnienia. W zale\u017cno\u015bci od konfiguracji rejestr\u00f3w, mo\u017cliwy jest odczyt ci\u015bnienia z bardzo du\u017c\u0105 rozdzielczo\u015bci\u0105 do 19 bit\u00f3w, z dok\u0142adno\u015bci\u0105 do 0,03hPa. Producent uk\u0142adu BMP180 umo\u017cliwi\u0142 u\u017cytkownikowi obliczenie opr\u00f3cz ci\u015bnienia r\u00f3wnie\u017c temperatury otoczenia w kt\u00f3rym znajduje si\u0119 ten uk\u0142ad &#8211; w przeciwie\u0144stwie do wcze\u015bniej przeze mnie omawianego czujnika <strong>HP02S<\/strong>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Mapa-pami\u0119ci-uk\u0142adu-bmp180.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Mapa-pami\u0119ci-uk\u0142adu-bmp180-150x150.jpg\" alt=\"Podzia\u0142 pami\u0119ci uk\u0142adu BMP180 - zaczerpni\u0119te z noty katalogowej uk\u0142adu\" class=\"wp-image-390\"\/><\/a><figcaption>Podzia\u0142 pami\u0119ci uk\u0142adu BMP180 &#8211; zaczerpni\u0119te z noty katalogowej uk\u0142adu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Do obliczenia ci\u015bnienia, oraz temperatury wymagane jest odczytanie 11 wsp\u00f3\u0142czynnik\u00f3w koryguj\u0105cych, kt\u00f3re s\u0105 zapisane w rejestrze uk\u0142adu &#8211; odczyt odbywa si\u0119 od rejestru <strong>0xAA<\/strong> do <strong>0xBF<\/strong>. Dodatkowo w rejestrze konfigurujemy rozdzielczo\u015b\u0107 dla pomiaru ci\u015bnienia (2 najbardziej znacz\u0105ce bity kom\u00f3rki o adresie <strong>0xF4<\/strong> ). Jednorazowo z rejestru mo\u017cna odczyta\u0107 temperatur\u0119 b\u0105d\u017a ci\u015bnienie &#8211; aby mo\u017cna by\u0142o tego dokona\u0107 w kom\u00f3rce o adresie <strong>0xF4<\/strong> nale\u017cy umie\u015bci\u0107 warto\u015b\u0107 <strong>0x0E<\/strong> dla pomiaru temperatury, b\u0105d\u017a <strong>0x14<\/strong> dla pomiaru ci\u015bnienia (dodatkowo nale\u017cy skonfigurowa\u0107 <em>oversampling<\/em> &#8211; w skr\u00f3cie ilo\u015b\u0107 wykonywanych pomiar\u00f3w dla uzyskania wi\u0119kszej dok\u0142adno\u015bci). Start pomiar\u00f3w wykonuje si\u0119 ustawiaj\u0105c bit <em>5<\/em> rejestru <strong>0xF4<\/strong> w stan '1&#8242;. Odczyt zmierzonych warto\u015bci temperatury odczytuje si\u0119 z dw\u00f3ch rejestr\u00f3w (<strong>0xF6<\/strong>, <strong>0xF7<\/strong>), a ci\u015bnienia z trzech (<strong>0xF6<\/strong>, <strong>0xF7<\/strong>, oraz <strong>0xF8<\/strong>, przy czym pod ostatnim adresem znajduj\u0105 si\u0119 maksymalnie <em>3<\/em> bity &#8211; zale\u017cy od ustawionej warto\u015bci <em>oversampling<\/em>). Producent udost\u0119pni\u0142 u\u017cytkownikowi mo\u017cliwo\u015b\u0107 wykonania resetu uk\u0142adu (przynosi taki sam efekt jak reset zasilania) poprzez wpisania jedynek do pami\u0119ci pod adres <strong>0xE0<\/strong>.<\/p>\n\n\n\n<p>Dodatkowo mo\u017cna przeprowadzi\u0107 test dzia\u0142ania uk\u0142adu odczytuj\u0105c dane z rejestru <strong>0xD0<\/strong>. Warto\u015b\u0107 tego rejestru powinna wynosi\u0107 <strong>0x55<\/strong> &#8211; nie jest ona zmienna i powinna wynosi\u0107 tyle samo dla ka\u017cdego uk\u0142adu.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Kr\u00f3tki opis przedstawiaj\u0105cy korzystanie z czujnika BMP180:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignright\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Algorytm.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Algorytm-150x150.jpg\" alt=\"Algorytm przedstawiaj\u0105cy spos\u00f3b obs\u0142ugi czujnika BMP180\" class=\"wp-image-399\"\/><\/a><figcaption>Algorytm przedstawiaj\u0105cy spos\u00f3b obs\u0142ugi czujnika BMP180 &#8211; zaczerpni\u0119te z noty katalogowej<\/figcaption><\/figure><\/div>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Tabela-z-warto\u015bciami-dla-rejestru-okreslajaca-typ-pomiaru.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Tabela-z-warto\u015bciami-dla-rejestru-okreslajaca-typ-pomiaru-150x150.jpg\" alt=\"Tabela przedstawiaj\u0105ce warto\u015bci okre\u015blaj\u0105ce typ pomiaru - zaczerpni\u0119te z noty katalogowej\" class=\"wp-image-400\"\/><\/a><figcaption>Tabela przedstawiaj\u0105ce warto\u015bci okre\u015blaj\u0105ce typ pomiaru &#8211; zaczerpni\u0119te z noty katalogowej<\/figcaption><\/figure><\/div>\n\n\n\n<p>W nocie katalogowej znajduje si\u0119 algorytm przedstawiaj\u0105cy zasad\u0119 odczytu danych pomiarowych. Pierwsz\u0105 czynno\u015bci\u0105 jak\u0105 nale\u017cy wykona\u0107 jest wys\u0142anie do czujnika polecania startu pomiaru temperatury. Producent zaleca odczekanie przynajmniej 4.5ms &#8211; czas potrzebny na wykonanie pomiaru &#8211; przed odczytem danych z rejestru (z kom\u00f3rek o adresie <strong>0xF6<\/strong> oraz <strong>0xF7<\/strong>). Po odczytaniu <em>UT<\/em> nale\u017cy wys\u0142a\u0107 komend\u0119 rozpoczynaj\u0105c\u0105 pomiar ci\u015bnienia o okre\u015blonej dok\u0142adno\u015bci. Czas jaki nale\u017cy odczeka\u0107 do uzyskania wyniku pomiaru ci\u015bnienia, zale\u017cy od dok\u0142adno\u015bci tego pomiaru i mo\u017ce zawiera\u0107 si\u0119 w przedziale od 4.5ms do 25.5ms &#8211; s\u0105 to warto\u015bci graniczne dolne.Po odczekaniu tego okresu, mo\u017cna z rejestru odczyta\u0107 dane dla <em>UP<\/em> i w nast\u0119pnym kroku wykona\u0107 obliczenia dla uzyskania temperatury, oraz ci\u015bnienia. Podczas odczytywania danych dla ci\u015bnienia nale\u017cy pami\u0119ta\u0107, \u017ce dla rozdzielczo\u015bci wi\u0119kszej od 16 bit\u00f3w (czyli dla 17, 18 i 19 bit\u00f3w), nale\u017cy odczyta\u0107 pozosta\u0142e dane pomiarowe (odpowiednio bity 1, 2 i 3 w zale\u017cno\u015bci od rozdzielczo\u015bci pomiaru) z adresu <strong>0xF8<\/strong> (XLSB).<\/p>\n\n\n\n<p>Dodatkowo na samym pocz\u0105tku programu &#8211; przed p\u0119tl\u0105 g\u0142\u00f3wn\u0105 programu &#8211; nale\u017cy wykona\u0107 odczyt wsp\u00f3\u0142czynnik\u00f3w kalibruj\u0105cych, kt\u00f3re s\u0105 niezb\u0119dne do prawid\u0142owego obliczenia ci\u015bnienia i temperatury.<\/p>\n\n\n\n<p>Komendy rozpoczynaj\u0105ce okre\u015blony pomiar s\u0105 to warto\u015bci jakie nale\u017cy wpisa\u0107 w odpowiedni\u0105 kom\u00f3rk\u0119 w pami\u0119ci czujnika <strong>BMP180<\/strong>. Adres tej kom\u00f3rki to <strong>0xF4<\/strong> a warto\u015bci okre\u015blaj\u0105ce dany pomiar zosta\u0142y przedstawione na wcze\u015bniejszym obrazku &#8211; zaczerpni\u0119tym z noty katalogowej.<\/p>\n\n\n\n<p>Uk\u0142ad <strong>BMP180<\/strong> komunikuje si\u0119 z mikrokontrolerem przy u\u017cyciu magistrali <strong>I2C<\/strong>. Aby wi\u0119c do tej komunikacji mog\u0142o doj\u015b\u0107 potrzebny jest adres czujnika &#8211; adres ten jest na sta\u0142e zdefiniowany i ka\u017cdy czujnik posiada taki sam. Dla zapisu danych adres ten wynosi <strong>0xEE<\/strong>, natomiast dla odczytu <strong>0xEF<\/strong>.<\/p>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Modu\u0142 GY-68 &#8211; ciekawe rozwi\u0105zanie:<\/strong><\/span><\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"alignleft\"><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Parametry-i2c.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"150\" height=\"150\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Parametry-i2c-150x150.jpg\" alt=\"Parametry I2C - zaczerpni\u0119te z noty katalogowej\" class=\"wp-image-405\"\/><\/a><figcaption>Parametry I2C &#8211; zaczerpni\u0119te z noty katalogowej<\/figcaption><\/figure><\/div>\n\n\n\n<p>Do testowania, oraz dla cel\u00f3w rozwojowych kupi\u0142em modu\u0142 <strong>GY-68<\/strong> wraz z uk\u0142adem <strong>BMP180<\/strong>. Modu\u0142 ten zaciekawi\u0142 mnie tym, \u017ce posiada w swojej konstrukcji stabilizator na 3.3V do zasilenia czujnika. My\u015bla\u0142em r\u00f3wnie\u017c, \u017ce je\u017celi modu\u0142 posiada tylko stabilizator na 3.3V to nie potrzebna jest konwersja napi\u0119\u0107 dla linii sygna\u0142owych <strong>SDA<\/strong> i <strong>SCL<\/strong>. Modu\u0142 zakupi\u0142em i gdy przyszed\u0142 czas na zapoznanie si\u0119 szczeg\u00f3\u0142owo z not\u0105 katalogow\u0105 okaza\u0142o si\u0119, \u017ce napi\u0119cie na liniach magistrali <strong>I2C<\/strong> nie mo\u017ce by\u0107 wi\u0119ksze od napi\u0119cia zasilania (a dok\u0142adnie napi\u0119cie linie I\/O kt\u00f3re w tym module wynosi tyle samo co napi\u0119cie zasilania), kt\u00f3re maksymalnie mo\u017ce wynie\u015b\u0107 3.6V (w nocie mo\u017cna znale\u017a\u0107 r\u00f3wnie\u017c informacj\u0119 o tym, \u017ce maksymalne napi\u0119cie doprowadzone do wszystkich pin\u00f3w nie mo\u017ce by\u0107 wi\u0119ksze od 4.25V co i tak dyskwalifikuje uk\u0142ady zasilanie z 5V). Wi\u0119c po co producent tego uk\u0142adu zastosowa\u0142 stabilizator na napi\u0119cie 3.3V? Mo\u017ce dlatego, \u017ce przy testach uk\u0142ad dzia\u0142a\u0142a, bo &#8230;. dzia\u0142a\u0142 wbrew temu co producent umie\u015bci\u0142 w nocie katalogowej (mo\u017cliwe te\u017c, \u017ce producent za\u0142o\u017cy\u0142, \u017ce linie b\u0119d\u0105 dzia\u0142a\u0142y na 3.3V a zasilanie samego modu\u0142u b\u0119dzie wynosi\u0142o 5V &#8211; trudno odgadn\u0105\u0107 cel takiego rozwi\u0105zania). Ja zawsze zalecam aby \u015bci\u015ble stosowa\u0107 si\u0119 do tego co dany producent danego uk\u0142adu pisze w nocie, a szczeg\u00f3lnie bra\u0107 pod uwag\u0119 parametry graniczne &#8211; w tedy jest si\u0119 pewnym, \u017ce uk\u0142ad b\u0119dzie dzia\u0142a\u0142 poprawnie. Modu\u0142<strong> GY-68<\/strong> jest tani w por\u00f3wnaniu do samego uk\u0142adu <strong>BMP180<\/strong>, oraz do innych modu\u0142\u00f3w z tym uk\u0142adem, dlatego jest tak popularny, a cz\u0119\u015b\u0107 schemat\u00f3w co znalaz\u0142em nie posiada translacji poziom\u00f3w przy zasilaniu ca\u0142ego urz\u0105dzenia z 5V.<\/p>\n\n\n\n<p>Dla tego modu\u0142u polecam stosowanie konwersji napi\u0119\u0107 na liniach sygna\u0142owych <strong>SCL<\/strong> i <strong>SDA<\/strong>. Mo\u017cna tego dokona\u0107 stosuj\u0105c dedykowane uk\u0142ady, b\u0105d\u017a przy pomocy tranzystor\u00f3w polowych. Przyk\u0142ad takiego pod\u0142\u0105czenia z wykorzystanie tranzystor\u00f3w przedstawiam poni\u017cej:<\/p>\n\n\n\n<figure class=\"wp-block-gallery columns-1 is-cropped wp-block-gallery-1 is-layout-flex wp-block-gallery-is-layout-flex\"><ul class=\"blocks-gallery-grid\"><li class=\"blocks-gallery-item\"><figure><a href=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Pod\u0142\u0105czenie-z-konwersj\u0105-napi\u0119\u01072.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1582\" height=\"787\" src=\"http:\/\/www.daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Pod\u0142\u0105czenie-z-konwersj\u0105-napi\u0119\u01072.png\" alt=\"\" data-id=\"409\" class=\"wp-image-409\" srcset=\"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Pod\u0142\u0105czenie-z-konwersj\u0105-napi\u0119\u01072.png 1582w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Pod\u0142\u0105czenie-z-konwersj\u0105-napi\u0119\u01072-300x149.png 300w, https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/Pod\u0142\u0105czenie-z-konwersj\u0105-napi\u0119\u01072-956x476.png 956w\" sizes=\"(max-width: 1582px) 100vw, 1582px\" \/><\/a><\/figure><\/li><\/ul><\/figure>\n\n\n\n<p>Zamiast zaprezentowanych tranzystor\u00f3w MOSFET z kana\u0142em typu N mo\u017cna zastosowa\u0107 inne tranzystory, np. <strong>BSS138<\/strong> lub podobne. W powy\u017cszym schemacie nie umie\u015bci\u0142em rezystor\u00f3w podci\u0105gaj\u0105cych do 3.3V z tego powodu, \u017ce na p\u0142ytce modu\u0142u <strong>GY-68<\/strong> takie rezystory ju\u017c si\u0119 znajduj\u0105. Do uk\u0142adu zosta\u0142o dostarczone napi\u0119cie 5V (mo\u017ce by\u0107 r\u00f3wnie\u017c mniejsze &#8211; zakres od 3.3V do 5V), gdy\u017c jak ju\u017c wcze\u015bniej wspomnia\u0142em, modu\u0142 posiada w\u0142asny stabilizator na napi\u0119cie 3.3V.<\/p>\n\n\n\n<p>Natomiast dedykowanym uk\u0142adem do konwersji napi\u0119\u0107 na liniach sygna\u0142owych (translacji poziom\u00f3w) jest uk\u0142ad<strong> MAXIM-DALLAS <span style=\"text-decoration: underline;\">MAX3378EEUD<\/span><\/strong>. Zastosowanie tego uk\u0142adu dla hobbysty powoduje, \u017ce cena budowane urz\u0105dzenia troch\u0119 wzro\u015bnie. Wi\u0119c do wyboru jest, albo zastosowanie dedykowane translatora poziom\u00f3w, albo wykorzystanie tranzystor\u00f3w polowych.<\/p>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Budowa i dzia\u0142anie biblioteki:<\/span><\/strong><\/p>\n\n\n\n<p>Biblioteka sk\u0142ada si\u0119 z dw\u00f3ch plik\u00f3w:<\/p>\n\n\n\n<ol><li>Nag\u0142\u00f3wkowego &#8211;<strong> ds_bmp180.h<\/strong>, oraz<\/li><li>\u0179r\u00f3d\u0142owego &#8211; <strong>ds_bmp180.c<\/strong>.<\/li><\/ol>\n\n\n\n<p>Obs\u0142ug\u0119 czujnika stara\u0142em si\u0119 tak wykona\u0107, aby kod by\u0142a jak najbardziej uniwersalny. Dodatkowym atutem tej biblioteki jest to, \u017ce funkcje s\u0105 nie blokuj\u0105ce &#8211; jakiekolwiek op\u00f3\u017anienia wyst\u0119puj\u0105ce w programie, s\u0105 wykonane na timerach programowych (kt\u00f3re wykorzystuj\u0105 jeden timer sprz\u0119towy). U\u017cytkownikowi da\u0142em do dyspozycji struktur\u0119 w kt\u00f3rej znajduj\u0105 si\u0119 obliczone warto\u015bci temperatury, oraz ci\u015bnienia z podzia\u0142em na warto\u015bci po przecinku i ca\u0142o\u015bci (dla temperatury jest tak\u017ce zmienna okre\u015blaj\u0105ca czy dana warto\u015b\u0107 jest ujemna czy dodatnia). W strukturze tej znajduj\u0105 si\u0119 tak\u017ce inne informacje odczytane z pami\u0119ci uk\u0142adu &#8211; opis znajduje si\u0119 poni\u017cej:<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">typedef struct{\n\tint32_t\tbmp180_UT;\t\t\t\t\t\/\/wartosc UT odczytana z uk\u0142adu\n\tint32_t bmp180_UP;\t\t\t\t\t\/\/wartosc UP odczytana z uk\u0142adu\n\tuint8_t bmp180_temp_sign;\t\t\t\/\/temperatura - znak\n\tuint8_t bmp180_temp_cell;\t\t\t\/\/temperatura - calosc\n\tuint8_t bmp180_temp_frac;\t\t\t\/\/temperatura - wartosc po przecinku\n\tuint16_t bmp180_pressure_cell;\t\t\/\/cisnienie - calosc\n\tuint8_t bmp180_pressure_frac;\t\t\/\/cisnienie - wartosc po przecinku\n\tuint8_t chip_id;\t\t\t\t\t\/\/id chipu - 0x55\n\tuint8_t ver_regist;\t\t\t\t\t\/\/wersja rejestru\n}DS_BMP180;\n\nextern DS_BMP180\tds_bmp180;<\/code><\/pre>\n\n\n\n<p>Na pocz\u0105tku programu, przed p\u0119tl\u0105 g\u0142\u00f3wn\u0105 i uruchomieniem funkcji z biblioteki nale\u017cy zarejestrowa\u0107 funkcje do obs\u0142ugi magistrali I2C, wywo\u0142uj\u0105c nast\u0119puj\u0105ce funkcje:<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">\t\/\/********** \trejestracji funkcji i2c potrzebnych dla bmp180\n\tregister_twi_start_bmp180(TWI_start);\t\t\t\t\t\t\/\/rejestracja funkcji start z i2c\n\tregister_twi_stop_bmp180(TWI_stop);\t\t\t\t\t\t\t\/\/rejestracja funkcji stop z i2c\n\tregister_twi_read_bmp180(TWI_read);\t\t\t\t\t\t\t\/\/rejestracja funkcji read z i2c\n\tregister_twi_write_bmp180(TWI_write);\t\t\t\t\t\t\/\/rejestracja funkcji write z i2c<\/code><\/pre>\n\n\n\n<p>Dzi\u0119ki tym funkcjom, biblioteka jest uniwersalna, tzn. wsp\u00f3\u0142pracuj\u0105 z prawie ka\u017cd\u0105 bibliotek\u0105 do obs\u0142ugi I2C. Wymagania jakie powinny spe\u0142nia\u0107 rejestrowane funkcje do I2C to brak zwracanej warto\u015bci dla funkcji <em>start<\/em>, <em>stop<\/em> (dla tych dw\u00f3ch r\u00f3wnie\u017c brak przekazywanych argument\u00f3w), oraz <em>write<\/em>. Dla funkcji <em>read<\/em> zwracana warto\u015b\u0107 powinna by\u0107 typu<strong> uint8_t<\/strong>. Natomiast do funkcji <em>read<\/em>, oraz <em>write<\/em> powinny by\u0107 przekazywane argumenty o typie <strong>uint8_t<\/strong> &#8211; dla <em>read<\/em> przekazywana jest informacja o wysy\u0142anym potwierdzeniu (<strong>ACK<\/strong>), a dla <em>write<\/em>, adres b\u0105d\u017a dane.<\/p>\n\n\n\n<p>Po rejestracji funkcji, nale\u017cy odczyta\u0107 wsp\u00f3\u0142czynniki, kt\u00f3re s\u0105 niezb\u0119dne do prawid\u0142owego obliczenia ci\u015bnienia i temperatury. Wykonuje si\u0119 to raz na pocz\u0105tku programu poprzez wywo\u0142anie funkcji:<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c\">\t\/\/**********\todczyt wsp\u00f3\u0142czynnik\u00f3w potrzebnych do poprawnego pomiaru\n\tds_bmp180_coeff();<\/code><\/pre>\n\n\n\n<p>Do funkcji, kt\u00f3ra powoduje rozpocz\u0119cie pomiar\u00f3w, nale\u017cy przes\u0142a\u0107 informacj\u0119 o ilo\u015bci wykonanych pr\u00f3bek. Dzi\u0119ki temu, jest mo\u017cliwo\u015b\u0107 zmiany dok\u0142adno\u015bci w ka\u017cdym miejscu tworzonego programu. Funkcj\u0119 ta nie powinna by\u0107 wywo\u0142ywana za ka\u017cdym razem w obiegu p\u0119tli &#8211; pomiar mo\u017ce by\u0107 wykonywany na \u017c\u0105danie.<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c\">\/\/Start pomiaru\n\tds_bmp180_start(BMP180_OSS_8);\n\n\n\/\/wyra\u017cenia do wpisania w funkcji ds_bmp180_start okre\u015blaj\u0105ce ilo\u015b\u0107 pr\u00f3bek (oversampling)\nBMP180_OSS_1\nBMP180_OSS_2\nBMP180_OSS_4\nBMP180_OSS_8<\/code><\/pre>\n\n\n\n<p>Ca\u0142a obs\u0142uga czujnika <strong>BMP180<\/strong> znajduje si\u0119 w funkcji wykonuj\u0105cej pomiary. Funkcja ta powinna znale\u017a\u0107 si\u0119 w p\u0119tli g\u0142\u00f3wnej i nie powinna by\u0107 przerywana \u017cadnymi op\u00f3\u017anieniami typu <strong>_delay__<\/strong>, aby nie dosz\u0142o do b\u0142\u0119d\u00f3w podczas obs\u0142ugi czujnika. Po zako\u0144czeniu pomiaru funkcja zwraca 1, ale tylko na czas jednego obiegu p\u0119tli g\u0142\u00f3wnej &#8211; p\u00f3\u017aniej zwracana warto\u015b\u0107 wynosi 0.<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c\">ds_bmp180_measure();<\/code><\/pre>\n\n\n\n<p>Jedyny wym\u00f3g jaki jest postawiony u\u017cytkownikowi, to skonfigurowanie przerwania wykonywanego co <strong><span style=\"text-decoration: underline;\">1ms<\/span> <\/strong>i umieszczeniu wewn\u0105trz tego przerwania nast\u0119puj\u0105cego warunku:<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c\">if(bmp180_time_1ms--);<\/code><\/pre>\n\n\n\n<p>Zosta\u0142y r\u00f3wnie\u017c utworzone dwie dodatkowe funkcje. Pierwsza funkcja powoduje zresetowanie uk\u0142adu, czego skutkiem jest taki sam efekt jak przy zresetowaniu uk\u0142adu (przywr\u00f3cenie warto\u015bci domy\u015blnych w rejestrach), oraz funkcja sprawdzaj\u0105ca czy dany czujnik jest aktywny (zwraca 1 lub 0 w zale\u017cno\u015bci od tego czy pod\u0142\u0105czony uk\u0142ad dzia\u0142a czy nie).<\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c\">ds_bmp180_restart();\nds_bmp180_active();<\/code><\/pre>\n\n\n\n<p><span style=\"text-decoration: underline;\"><strong>Przyk\u0142adowy program:<\/strong><\/span><\/p>\n\n\n\n<pre class=\"wp-block-code height-set:true lang:c decode:true\"><code lang=\"c\" class=\"language-c line-numbers\">\/\/obs\u0142uga przerwania\nISR(TIMER0_COMP_vect){\n\n\tif(++time_1ms &lt; 9){\n\t\ttime_1ms=0;\n\n\t\tif(++time_10ms &lt; 99){\n\t\t\ttime_10ms=0;\n\n\t\t\tif(++time_1s &lt; 59) time_1s=0;\n\t\t}\n\t}\n\n\tif(bmp180_time_1ms--);\n\n}\/\/ \/isr\n\nint main(void){\n\t\n\t\/\/inicjalizacja LCD\n\tlcd_init();\n\n\t\/\/********** \trejestracji funkcji i2c potrzebnych dla bmp180\n\tregister_twi_start_bmp180(TWI_start);\t\t\t\t\t\t\/\/rejestracja funkcji start z i2c\n\tregister_twi_stop_bmp180(TWI_stop);\t\t\t\t\t\t\t\/\/rejestracja funkcji stop z i2c\n\tregister_twi_read_bmp180(TWI_read);\t\t\t\t\t\t\t\/\/rejestracja funkcji read z i2c\n\tregister_twi_write_bmp180(TWI_write);\t\t\t\t\t\t\/\/rejestracja funkcji write z i2c\n\n\t\/\/inicjalizacja przerwa\u0144\n\t\t\/\/timer0 w trybie ctc\n\tTCCR0 |= (1&lt;&lt;WGM01);\t\t\t\t\/\/tryb CTC\n\tTCCR0 |= (1&lt;&lt;CS01) | (1&lt;&lt;CS00);\t\t\t\/\/preskaler 64\n\tOCR0 = 255;\t\t\t\t\t\t\t\t\/\/co 1ms dla preskalera 64 bity i kwarcu 16MHz\n\tTIMSK |= (1&lt;OCIE0);\t\t\t\t\/\/aktywacja przerwania\n\n\t\/\/aktywacja przerwa\u0144\n\tsei();\n\t\n\t\/\/program w\u0142asciwy\n\tlcd_cls();\n\n\t\/\/**********\todczyt wsp\u00f3\u0142czynnik\u00f3w potrzebnych do poprawnego pomiaru\n\tds_bmp180_coeff();\n\n\tds_bmp180_start(BMP180_OSS_8);\n\n\twhile(1){\n\t\t\n\t\tif( (time_1s != time_ls) &amp;&amp; !(time_1s % 10) ){\n\t\t\ttime_ls = time_1s;\n\t\t\tds_bmp180_start(BMP180_OSS_8);\n\t\t\tlcd_locate(0,0);\n\t\t\tif(ds_bmp180.bmp180_temp_sign)\n\t\t\t\tlcd_char('-');\n\n\t\t\tlcd_int(ds_bmp180.bmp180_temp_cell);\n\t\t\tlcd_char(',');\n\t\t\tlcd_int(ds_bmp180.bmp180_temp_frac);\n\n\t\t\tlcd_locate(0,8);\n\t\t\tlcd_int(ds_bmp180.bmp180_pressure_cell);\n\t\t\tlcd_char(',');\n\t\t\tlcd_int(ds_bmp180.bmp180_pressure_frac);\n\t\t}\n\t\tds_bmp180_measure();\n\t}\n}<\/code><\/pre>\n\n\n\n<p><strong><span style=\"text-decoration: underline;\">Pliki biblioteki:<\/span><\/strong><\/p>\n\n\n\n<a  data-e-Disable-Page-Transition=\"true\" class=\"download-link download-button aligncenter\" title=\"Wersja v1.0\" href=\"https:\/\/daniel.slask.pl\/m\/download\/412\/?tmstv=1788161163\" rel=\"nofollow\" id=\"download-link-412\" >\n\t<p>\n\t\tPobierz &ldquo;DS_BMP180.zip&rdquo;\t<\/p>\n\t<small>DS_BMP180.zip\t\t&ndash; Pobrano 31711 razy\t\t&ndash; 4,57 KB<\/small>\n<\/a>\n\n\n\n<p>Zach\u0119cam do pobierania, oraz zadawania pyta\u0144.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W poprzednim artykule przedstawi\u0142em bibliotek\u0119 do obs\u0142ugi czujnika ci\u015bnienia HP02S. Natomiast tym razem prezentuj\u0119 m\u00f3j pomys\u0142 na obs\u0142ug\u0119 czujnika ci\u015bnienia i temperatury BMP180 firmy BOSCH. Czujnik ten zosta\u0142 kupiony wraz z modu\u0142em GY-68, kt\u00f3ry posiada odpowiednie komponenty do prawid\u0142owego (prawie&#8230;<br \/><a class=\"read-more-button\" href=\"https:\/\/daniel.slask.pl\/m\/bmp180-obsluga-cyfrowego-czujnika-cisnienia-modul-gy-68\/\">Wi\u0119cej<\/a><\/p>\n","protected":false},"author":1,"featured_media":429,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[6,7],"tags":[12,32,44,46,33,43,41,45,48,47],"views":6411,"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"https:\/\/daniel.slask.pl\/m\/wp-content\/uploads\/2015\/12\/GY-68_2.jpg","jetpack_shortlink":"https:\/\/wp.me\/pcPgV3-6f","_links":{"self":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/387"}],"collection":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/comments?post=387"}],"version-history":[{"count":18,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/387\/revisions"}],"predecessor-version":[{"id":1647,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/posts\/387\/revisions\/1647"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media\/429"}],"wp:attachment":[{"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/media?parent=387"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/categories?post=387"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/daniel.slask.pl\/m\/wp-json\/wp\/v2\/tags?post=387"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}