Czujnik Ciśnienia I Temperatury MS5611 - Dev/Jarzębski

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 Git: https://github.com/jarzebski/Arduino-MS5611

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

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

Prezentacja YouTube

Materiały dodatkowe

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

Tag » Arduino Ms5611 Sketch