В этом уроке мы научимся подключать датчик барометра/альтиметра (высотомера) MS5611 к плате Arduino с помощью кода на C/C++. MS5611 — это новое поколение датчиков альтиметра высокого разрешения от компании MEAS Switzerland с интерфейсом шины SPI и I2C. Этот датчик барометрического давления оптимизирован для альтиметров и вариометров с разрешением по высоте 10 см.
Датчик может использоваться в мобильных высотомерах и мобильных барометрических измерительных системах, навигационных устройствах, метеостанциях, спортивных часах, системах управления воздушным движением и дронах.
В этой статье представлен базовый обзор датчика MS5611 вместе с распиновкой и подробностями протокола связи. Позже мы будем использовать датчик MS5611 с Arduino IDE и 0,96″ OLED-дисплеем и отображать показания датчика на OLED дисплее. Мы также сделаем подробное сравнение между датчиком BME280 и MS5611.
Необходимые компоненты
- Плата Arduino Nano (купить на AliExpress).
- Датчик альтиметра/барометра MS5611 (купить на AliExpress).
- Модуль OLED дисплея SSD1306 128×64 с интерфейсом I2C (купить на AliExpress).
- Макетная плата
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик барометра/альтиметра MS5611
MS5611-01BA — это датчик альтиметра/барометра высокого разрешения от MEAS Switzerland. Датчик работает с интерфейсами шин SPI и I2C. Датчик также имеет встроенный датчик температуры, который используется для компенсации изменений окружающей среды и калибровки измерений.
MS5611 включает в себя датчик давления с высокой линейностью и сверхнизкоэнергетический 24-битный ΔΣ АЦП с внутренними заводскими калибровочными коэффициентами. Он обеспечивает точное цифровое 24-битное значение давления и температуры и различные режимы работы, которые позволяют пользователю оптимизировать скорость преобразования и потребление тока.
Диапазон измеряемого им давления составляет от 10 мбар до 1200 мбар с абсолютной точностью ±1,5 мбар. Датчик оптимизирован для высотомеров и вариометров с разрешением по высоте 10 см. Диапазон измеряемых им температур составляет от -40˚C до +85˚C с точностью ±0,8˚C.
Модуль оснащен точным регулятором напряжения MIC5205 3,3 В и преобразователем уровня напряжения. Поэтому мы можем использовать его с микроконтроллером 3,3 В или 5 В.
Более подробную информацию об этом датчике можно найти в техническом описании MS6511.
Характеристики датчика MS5611
- Диапазон давления: от 10 до 1200 мбар.
- Диапазон температур: от -40 °C до 85 °C.
- Разрешение АЦП: 24 бита.
- Разрешение по высоте: 10 см.
- Разрешение давления: 0,012 мбар.
- Разрешение температуры: 0,01 °C.
- Напряжение питания: от 1,8 до 3,6 В.
- Очень низкое потребление тока: в режиме ожидания макс. 0,14 мкА.
- Интерфейс I²C и SPI.
- Защита от электростатического разряда.
- Корпус QFN: 5,0 x 3,0 x 0,95 мм³.
- Соответствует RoHS и REACH.
Интерфейсы и протокол связи MS5611
MS5611 взаимодействует через шину I2C или SPI. На плате датчика имеется вывод PS. Если вывод PS подтянут к LOW, то интерфейс SPI включен. Подтягивание PS к HIGH выбирает интерфейс I2C. По умолчанию интерфейс I2C доступен.
MS5611 имеет несколько адресов I2C: 0x77 и 0x76. Адрес I2C по умолчанию — 0x77. Если мы подключим вывод CSB к VCC, адрес I2C станет 0x76.
Чтобы включить и использовать интерфейс SPI, нам необходимо подключить контакт PS (выбор протокола) к земле.
Распиновка модуля MS5611
Модуль MS5611 имеет в общей сложности 7 контактов, включая контакты питания, контакты SPI, контакты I2C и контакты выбора.
Название контакта | Функция контакта |
VCC | Разъем питания для входа 3,3 В или 5 В |
GND | Земля (общий провод) |
SCL | Входной контакт синхронизации SPI/ Контакт синхронизации I2C |
SDA | Вывод последовательного входа данных (MOSI)/вывод данных I2C |
CSB | Вывод выбора чипа (Chip Select) |
SD0 | Последовательный вывод данных (MISO) |
PS | Контакт выбора протокола |
Как можно видеть из представленной таблицы распиновка датчика интуитивно понятна.
Взаимодействие датчика барометра/альтиметра MS5611 с Arduino
Схема подключения датчика барометра/альтиметра MS5611 к плате Arduino представлена на следующем рисунке.
Подключите VCC и GND MS5611 к контактам Arduino 3.3V/5V и GND соответственно. Подключите контакты I2C датчика SDA и SCL к контактам Arduino A4 и A5 соответственно.
В этом руководстве мы будем подключать MS5611 к Arduino только в режиме I2C, поскольку при подключении в режиме SPI обнаружена проблема нагрева.
Исходный код программы
Код для MS5611 можно написать в Arduino IDE. Но прежде чем продолжить, нам нужно добавить библиотеку MS5611 в Arduino IDE.
Загрузите библиотеку и добавьте ее в Arduino IDE с помощью менеджера библиотек.
Теперь скопируйте следующий код и загрузите его на плату Arduino Nano.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 |
#include <Wire.h> #include <MS5611.h> MS5611 ms5611; double referencePressure; void setup() { Serial.begin(9600); // Initialize MS5611 sensor Serial.println("Initialize MS5611 Sensor"); while (!ms5611.begin()) { Serial.println("Could not find a valid MS5611 sensor, check wiring!"); delay(500); } // Get reference pressure for relative altitude referencePressure = ms5611.readPressure(); // Check settings checkSettings(); delay(2000); } void checkSettings() { Serial.print("Oversampling: "); Serial.println(ms5611.getOversampling()); } void loop() { // Read raw values uint32_t rawTemp = ms5611.readRawTemperature(); uint32_t rawPressure = ms5611.readRawPressure(); // Read true temperature & Pressure double realTemperature = ms5611.readTemperature(); long realPressure = ms5611.readPressure(); // Calculate altitude float absoluteAltitude = ms5611.getAltitude(realPressure); float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure); 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(2000); } |
После загрузки кода откройте Serial Monitor (окно монитора последовательной связи). Параметры измерения барометра/альтиметра MS5611, такие как температура, давление и высота, можно наблюдать в Arduino IDE.
Вы можете перемещать датчик снаружи помещения или внутри помещения для измерения разницы давления. Вы также можете нагревать датчик для наблюдения за изменением температуры.
Взаимодействие MS5611 с Arduino и OLED-дисплеем
Вместо отображения температуры, давления и высоты на последовательном мониторе мы можем использовать 0,96-дюймовый SSD1306 I2C OLED-дисплей.
Подключите VCC и GND OLED-дисплея к контактам Arduino 3.3V/5V и GND соответственно. Подключите контакты OLED I2C SDA и SCL к контактам Arduino A4 и A5 соответственно.
Исходный код программы
Код требует дополнительную библиотеку SSD1306 вместе с библиотекой MS5611 Arduino. Загрузите библиотеку и добавьте ее в Arduino IDE с помощью менеджера библиотек.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 |
#include <Wire.h> #include <Adafruit_SSD1306.h> #include <MS5611.h> //https://github.com/jarzebski/Arduino-MS5611 #define SCREEN_WIDTH 128 // OLED display width, in pixels #define SCREEN_HEIGHT 64 // OLED display height, in pixels #define OLED_RESET -1 //Reset pin # (or -1 if sharing Arduino reset pin) #define SCREEN_ADDRESS 0x3C //See datasheet for Address Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET); MS5611 ms5611; double referencePressure; void setup() { Serial.begin(9600); // Initialize MS5611 sensor Serial.println("Initialize MS5611 Sensor"); while (!ms5611.begin()) { Serial.println("Could not find a valid MS5611 sensor, check wiring!"); delay(500); } // SSD1306_SWITCHCAPVCC = generate display voltage from 3.3V internally if (!display.begin(SSD1306_SWITCHCAPVCC, SCREEN_ADDRESS)) { Serial.println(F("SSD1306 allocation failed")); for (;;); // Don't proceed, loop forever } display.clearDisplay(); display.display(); delay(500); // Get reference pressure for relative altitude referencePressure = ms5611.readPressure(); // Check settings checkSettings(); delay(2000); } void checkSettings() { Serial.print("Oversampling: "); Serial.println(ms5611.getOversampling()); } void loop() { // Read raw values uint32_t rawTemp = ms5611.readRawTemperature(); uint32_t rawPressure = ms5611.readRawPressure(); // Read true temperature & Pressure double realTemperature = ms5611.readTemperature(); long realPressure = ms5611.readPressure(); // Calculate altitude float absoluteAltitude = ms5611.getAltitude(realPressure); float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure); 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"); display.clearDisplay(); display.setTextColor(SSD1306_WHITE); display.setCursor(0, 0); display.setTextSize(1); display.print("Temperature: "); display.print(realTemperature); display.print("*C"); display.setCursor(0, 20); display.setTextSize(1); display.print("Pressure: "); display.print(realPressure); display.print("Pa"); display.setCursor(0, 40); display.setTextSize(1); display.print("Altitude: "); display.print(relativeAltitude); display.print("m"); display.display(); delay(2000); } |
После загрузки кода вы увидите на своем OLED-дисплее значения давления, температуры и высоты.
Поскольку это портативное устройство, вы можете брать его с собой куда угодно и заряжать его с помощью внешнего аккумулятора.
Сравнение MS5611 и BME280
Датчик BME280 похож на MS5611, поскольку оба они могут измерять давление, температуру и высоту.
Таким образом, необходимо сравнить BME280 и MS5611, чтобы выяснить, какой из них является лучшим датчиком и насколько велика разница в показаниях.
Сначала подключите датчики BME280 и MS5611 к плате Arduino через контакты I2C.
Код, объединяющий библиотеку MS5611 и библиотеку BME280, был создан для считывания значений температуры, давления и высоты. Поэтому скопируйте следующий код и загрузите его на плату Arduino Nano.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
#include <Wire.h> #include <MS5611.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) MS5611 ms5611; Adafruit_BME280 bme; double referencePressure; void setup() { Serial.begin(9600); // Initialize MS5611 sensor Serial.println("Initialize MS5611 & BME280 Sensor"); if (!bme.begin(0x76)) { Serial.println("Could not find a valid BME280 sensor, check wiring!"); while (1); } while (!ms5611.begin()) { Serial.println("Could not find a valid MS5611 sensor, check wiring!"); delay(500); } // Get reference pressure for relative altitude referencePressure = ms5611.readPressure(); // Check settings checkSettings(); delay(2000); } void checkSettings() { Serial.print("Oversampling: "); Serial.println(ms5611.getOversampling()); } void loop() { // Read raw values uint32_t rawTemp = ms5611.readRawTemperature(); uint32_t rawPressure = ms5611.readRawPressure(); // Read true temperature & Pressure double realTemperature = ms5611.readTemperature(); long realPressure = ms5611.readPressure(); // Calculate altitude float absoluteAltitude = ms5611.getAltitude(realPressure); float relativeAltitude = ms5611.getAltitude(realPressure, referencePressure); Serial.print("MS6511 Temperature = "); Serial.print(realTemperature); Serial.println("*C"); Serial.print("BME280 Temperature = "); Serial.print(bme.readTemperature()); Serial.println("*C"); Serial.println(""); Serial.print("MS6511 Pressure = "); Serial.print(realPressure); Serial.println("Pa"); Serial.print("BME280 Pressure = "); Serial.print(bme.readPressure()); Serial.println("Pa"); Serial.println(""); Serial.print("MS5611 Altitude = "); Serial.print(absoluteAltitude); Serial.println("m"); Serial.print("BME280 Altitude = "); Serial.print(bme.readAltitude(SEALEVELPRESSURE_HPA)); Serial.println("m"); Serial.println(""); delay(2000); } |
После загрузки кода откройте Serial Monitor (окно монитора последовательной связи) - он покажет значение температуры, давления и высоты обоих датчиков.
Из показаний видно, что значение температуры для обоих датчиков почти одинаковое. Но есть разница в давлении в 120-130 паскалей и разница в высоте около 10 метров.