SantyagoSantyago
Avatar

Witaj!
Blog archiwalny. Już niebawem nowy serwis!

YouTube RSS Facebook GitHub

Arduino poradnik

Wstęp

Teoria

Biblioteki

Komponenty

Czujniki i sensory

Rozwiązania i algorytmy

Narzędzia

Mikrokontrolery i Arduino IDE

Arduino i klony

Poradniki wideo

Reklama na Blogu

Najnowsze poradniki

Ostatnie komentarze

Ostatnie fotografie

polskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorypolskie-gorywieliczka-szyb-danilowicza

Czujnik ciśnienia i temperatury MS5611

MS5611 jest czujnikiem ciśnienia atmosferycznego i temperatury firmy Measurement Specialties, charakteryzują się pomiarem ciśnienia w zakresie 10 ÷ 1200 hPa oraz temperatury w zakresie -40 ÷ 85°C.

Jego ogromną zaletą jest 24-bitowy przetwornik ADC, który pozwala na podstawie pomiaru ciśnienia określić wysokość z dokładnością do 10cm. Typowe napięcie zasilania to 1.8 ÷ 3.6 V przy poborze prądu wynoszącym zaledwie 1μA. W zależności od wybranej dokładności pomiaru (liczba wykonywanych próbek od 256 ÷ 4096), czas odpowiedzi układu wynosi ÷ 10 ms.

Pełna karta katalogowa MS5611: https://www.jarzebski.pl/datasheets/MS5611.pdf

Obliczanie wysokości na podstawie pomiaru ciśnienia atmosferycznego

Znając ciśnienie jakie panuje na poziomie morza p0 (np.: 1013.25 hPa) oraz pomiar p, możemy określić aktualną wysokość, wyliczając ją z poniższego wzoru.

Zależność pomiędzy wysokością a ciśnieniem przedstawia poniższa charakterystyka, z której wynika, że zmiana ciśnienia Δp = 1 hPa odpowiada wysokości Δh = 8.43 m. Natomiast zmiana wysokości Δh = 10 m odpowiada zmianie ciśnienia Δp = 1 2hPa

Połączenie z Arduino

Na rynku istnieje kilka gotowych modułów z czujnikami MS5611, które różnią się one przede wszystkim poziomem napięcia zasilania. Najczęściej są to moduły zasilane napięciem 3.3V. W moim przypadku skorzystam z modułu IMU GY-86, który może być zasilany napięciem zarówno 5V jak i 3.3V. Jeśli zdecydujemy się na zasilanie 5V należy zwrócić szczególną uwagę na podłączenie do odpowiedniego pinu, podłączenie do pinu oznaczonego 3.3V może spowodować jego uszkodzenie. Pin oznaczony SCL (adapter) podłączamy do pinu A5 (Arduino), natomiast pin SDA (adapter) do pinu A4 (Arduino). Nie zapomnijmy również o masie GND.

Przykładowy program

Do obsługi modułów z układami MS5611 przygotowałem bibliotekę dla Arduino, którą można pobrać z repozytorium Githttps://github.com/jarzebski/Arduino-MS5611

  1. #include <Wire.h>
  2. #include <MS5611.h>
  3.  
  4. MS5611 ms5611;
  5.  
  6. double referencePressure;
  7.  
  8. void setup()
  9. {
  10.   Serial.begin(9600);
  11.  
  12.   // Inicjalizacja MS5611
  13.   Serial.println("Inicjalizacja MS5611 Sensor");
  14.  
  15.   // Ultra high resolution: MS5611_ULTRA_HIGH_RES
  16.   // (default) High resolution: MS5611_HIGH_RES
  17.   // Standard: MS5611_STANDARD
  18.   // Low power: MS5611_LOW_POWER
  19.   // Ultra low power: MS5611_ULTRA_LOW_POWER
  20.   while(!ms5611.begin(MS5611_HIGH_RES))
  21.   {
  22.     Serial.println("Nie mozna znalezc czujnika MS5611, sprawdz polaczenie!");
  23.     delay(500);
  24.   }
  25.  
  26.   // Pobieramy poczatkowe cisnienie do okreslenia wysokosci
  27.   referencePressure = ms5611.readPressure();
  28.  
  29.   // Sprawdzamy ustawienia
  30.   checkSettings();
  31. }
  32.  
  33. void checkSettings()
  34. {
  35.   Serial.print("Oversampling: ");
  36.   Serial.println(ms5611.getOversampling());
  37. }
  38.  
  39. void loop()
  40. {
  41.   // Odczyt surowych wartosci
  42.   uint32_t rawTemp = ms5611.readRawTemperature();
  43.   uint32_t rawPressure = ms5611.readRawPressure();
  44.  
  45.   // Odczyt przekonwertowanych wartosci
  46.   double realTemperature = ms5611.readTemperature();
  47.   long realPressure = ms5611.readPressure();
  48.  
  49.   // Obliczanie wysokosci
  50.   float absoluteAltitude = ms5611.getAltitude(realPressure);
  51.   float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure);
  52.  
  53.   // Wyswietlenie wynikow
  54.   Serial.println("--");
  55.  
  56.   Serial.print(" rawTemp = ");
  57.   Serial.print(rawTemp);
  58.   Serial.print(", realTemp = ");
  59.   Serial.print(realTemperature);
  60.   Serial.println(" *C");
  61.  
  62.   Serial.print(" rawPressure = ");
  63.   Serial.print(rawPressure);
  64.   Serial.print(", realPressure = ");
  65.   Serial.print(realPressure);
  66.   Serial.println(" Pa");
  67.  
  68.   Serial.print(" absoluteAltitude = ");
  69.   Serial.print(absoluteAltitude);
  70.   Serial.print(" m, relativeAltitude = ");
  71.   Serial.print(relativeAltitude);    
  72.   Serial.println(" m");
  73.  
  74.   delay(1000);
  75. }

Wizualizacja w Processing i kompensacja

Biblioteka pozwala również na obliczenie skompensowanych wartości dla temperatur poniżej 20°C i -15°C dodając do funkcji odczytujących parametr true. Poniżej znajduje się program, zwracający wyniki dla programu Processing, za pomocą którego będziemy mogli zobaczyć wyniki zarówno nieskompensowane jak i skompensowane.

  1. #include <Wire.h>
  2. #include <MS5611.h>
  3.  
  4. MS5611 ms5611;
  5.  
  6. void setup()
  7. {
  8.   Serial.begin(115200);
  9.  
  10.   // Initialize MS5611 sensor
  11.   // Ultra high resolution: MS5611_ULTRA_HIGH_RES
  12.   // (default) High resolution: MS5611_HIGH_RES
  13.   // Standard: MS5611_STANDARD
  14.   // Low power: MS5611_LOW_POWER
  15.   // Ultra low power: MS5611_ULTRA_LOW_POWER
  16.   while(!ms5611.begin(MS5611_ULTRA_HIGH_RES))
  17.   {
  18.     delay(500);
  19.   }
  20. }
  21.  
  22. void loop()
  23. {
  24.   // Odczyt wartosci nieskompensowanych
  25.   double realTemperature = ms5611.readTemperature();
  26.   long realPressure = ms5611.readPressure();
  27.   double realAltitude = ms5611.getAltitude(realPressure);
  28.  
  29.   // Odczyt wartosci skompensowanych
  30.   double realTemperature2 = ms5611.readTemperature(true);
  31.   long realPressure2 = ms5611.readPressure(true);
  32.   double realAltitude2 = ms5611.getAltitude(realPressure2);
  33.  
  34.   // Wyjscie
  35.   Serial.print(realTemperature);
  36.   Serial.print(":");
  37.   Serial.print(realTemperature2);
  38.   Serial.print(":");
  39.   Serial.print(realPressure);
  40.   Serial.print(":");
  41.   Serial.print(realPressure2);
  42.   Serial.print(":");
  43.   Serial.print(realAltitude);
  44.   Serial.print(":");
  45.   Serial.print(realAltitude2);
  46.   Serial.println();
  47. }

Prezentacja YouTube

Materiały dodatkowe

Biblioteka dla Arduino: https://github.com/jarzebski/Arduino-MS5611
Pełna karta katalogowa MS5611: https://www.jarzebski.pl/datasheets/MS5611.pdf

Reklama

Komentarze Komentarze
Avatar 1
Sebastian Linux x86_64 / Mozilla Firefox 29.0
15 May 2014 - 23:46 Warszawa

Symbol ± jest niepoprawnie użyty. Trochę razi w oczy w tak technicznym wpisie, chyba, że rzeczywiście układ może być zasilany ujemnym napięciem, ale ujemne czas odpowiedzi to dla mnie zupełna nowość. ;)

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 29.0
16 May 2014 - 05:50 Bytom

No to ładnie. Serio nie wiem co mi się ubzdurało :) Dzięki! Poprawione.

Avatar 1
Diff. pressure sensor MS4525DO 1 psi Windows 7 / Mozilla 11.0
26 October 2014 - 17:31 Brak informacji

Hello Korneliusz,

I am very glad to have your Arduino sketch for thrr MS6511 barometric pressure sensor ... but now I would Need an Arduino sketch for the differentiel pressure sensor MS4525DO (I2C/ 1 psi range) for air velocity measurements wit a Pitot tube sensor ... ? Do you have such a sketch ... or can you tell me how to modify the MS5611.ino sketch and the library program: #include
Thanks a lot for helping me ..I am a retired physicist(73 y)... and airplane modellist ... many Kind regards, Bruno Hoegger, Marly, Switzerland

Avatar 2
Korneliusz Linux x86_64 / Mozilla Firefox 31.0
26 October 2014 - 19:53 Bytom

I\'m try bought this chip. Unfortunately, at the moment it does not have

Avatar 1
robert Linux Ubuntu / Mozilla Firefox 44.0
16 February 2016 - 17:51 Brak informacji

I use two MS5611 with one pitot, giving IAS speed + altitude + vario