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 1 ÷ 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
- #include <Wire.h>
- #include <MS5611.h>
- MS5611 ms5611;
- double referencePressure;
- void setup()
- {
- Serial.begin(9600);
- // Inicjalizacja MS5611
- Serial.println("Inicjalizacja MS5611 Sensor");
- // Ultra high resolution: MS5611_ULTRA_HIGH_RES
- // (default) High resolution: MS5611_HIGH_RES
- // Standard: MS5611_STANDARD
- // Low power: MS5611_LOW_POWER
- // Ultra low power: MS5611_ULTRA_LOW_POWER
- while(!ms5611.begin(MS5611_HIGH_RES))
- {
- Serial.println("Nie mozna znalezc czujnika MS5611, sprawdz polaczenie!");
- delay(500);
- }
- // Pobieramy poczatkowe cisnienie do okreslenia wysokosci
- referencePressure = ms5611.readPressure();
- // Sprawdzamy ustawienia
- checkSettings();
- }
- void checkSettings()
- {
- Serial.print("Oversampling: ");
- Serial.println(ms5611.getOversampling());
- }
- void loop()
- {
- // Odczyt surowych wartosci
- uint32_t rawTemp = ms5611.readRawTemperature();
- uint32_t rawPressure = ms5611.readRawPressure();
- // Odczyt przekonwertowanych wartosci
- double realTemperature = ms5611.readTemperature();
- long realPressure = ms5611.readPressure();
- // Obliczanie wysokosci
- float absoluteAltitude = ms5611.getAltitude(realPressure);
- float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure);
- // Wyswietlenie wynikow
- Serial.println("--");
- Serial.print(" rawTemp = ");
- Serial.print(rawTemp);
- Serial.print(", realTemp = ");
- Serial.print(realTemperature);
- Serial.println(" *C");
- Serial.print(" rawPressure = ");
- Serial.print(rawPressure);
- Serial.print(", realPressure = ");
- Serial.print(realPressure);
- Serial.println(" Pa");
- Serial.print(" absoluteAltitude = ");
- Serial.print(absoluteAltitude);
- Serial.print(" m, relativeAltitude = ");
- Serial.print(relativeAltitude);
- Serial.println(" m");
- delay(1000);
- }
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.
- #include <Wire.h>
- #include <MS5611.h>
- MS5611 ms5611;
- void setup()
- {
- Serial.begin(115200);
- // Initialize MS5611 sensor
- // Ultra high resolution: MS5611_ULTRA_HIGH_RES
- // (default) High resolution: MS5611_HIGH_RES
- // Standard: MS5611_STANDARD
- // Low power: MS5611_LOW_POWER
- // Ultra low power: MS5611_ULTRA_LOW_POWER
- while(!ms5611.begin(MS5611_ULTRA_HIGH_RES))
- {
- delay(500);
- }
- }
- void loop()
- {
- // Odczyt wartosci nieskompensowanych
- double realTemperature = ms5611.readTemperature();
- long realPressure = ms5611.readPressure();
- double realAltitude = ms5611.getAltitude(realPressure);
- // Odczyt wartosci skompensowanych
- double realTemperature2 = ms5611.readTemperature(true);
- long realPressure2 = ms5611.readPressure(true);
- double realAltitude2 = ms5611.getAltitude(realPressure2);
- // Wyjscie
- Serial.print(realTemperature);
- Serial.print(":");
- Serial.print(realTemperature2);
- Serial.print(":");
- Serial.print(realPressure);
- Serial.print(":");
- Serial.print(realPressure2);
- Serial.print(":");
- Serial.print(realAltitude);
- Serial.print(":");
- Serial.print(realAltitude2);
- Serial.println();
- }
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
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ść. ;)
No to ładnie. Serio nie wiem co mi się ubzdurało :) Dzięki! Poprawione.
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
I\'m try bought this chip. Unfortunately, at the moment it does not have
I use two MS5611 with one pitot, giving IAS speed + altitude + vario