Блок с датойБлок с временемБлок с возрастом сайта
Mr.ALB

    Анатолий Беляев (aka Mr.ALB). Персональный сайт

    Да пребудут с вами Силы СВЕТА!

     

    Ардуино (Arduino). #4

    Тестируем BMP280

    Недавно приобрёл себе крошечный (12 х 15 мм) модуль абсолютного давления BMP280, в котором дополнительно имеется ещё и датчик температуры. Ниже рассмотрю подключение этого модуля к Arduino UNO. Рассмотрю некоторые особенности настройки, с которыми столкнулся. Вывод значений будем осуществлять в [Монитор порта] Arduino IDE.

    Такой модуль может послужить основой небольшой погодной станции, барометра или барографа, если использовать вывод информации на графический экран, где выводить график изменения давления от времени.

    Модуль BMP280 может обмениваться данными с микроконтроллером двумя способами: через I2C, и через SPI. В этом примере рассмотрим подключение по I2C, так как контактов у Arduino будет задействовано меньше.

    Для этого соединения в Arduino используются два пина: А4 и А5, которые запараллелены с контактами SDA и SCL на противоположной стороне платы Arduino UNO. Можно соединиться как с теми, так и с другими.

    Модуль BMP280
    Pic 1. Модуль BMP280

    Напряжение питания модуля 3.3В, но вполне нормально модуль работает и от 5В.

    Для вывода высоты используется соответствующая функция из библиотеки <Adafruit_BMP280.h>. Чтобы не учитывать текущее атмосферное давление, применил кнопку – по нажатии на неё происходит обнуление высоты. На схеме эта кнопка – SB1, подключаем её к пину D8, но можно к любому свободному и сделав соответствующие поправки в скетче.

    Схема для скетча #4
    Pic 2. Схема для скетча #4

    Модуль и кнопку SB1 установим на макетной панельке. Делаем надлежащие подключения к плате Arduino и переходим к скетчу (программе).

    Новое, что применяю в скетче – это библиотека для кнопок, скачал её в Интернете. Очень она мне понравилась, удобна при использовании.

    Ещё нужно сказать, что когда я вначале подключил модуль, то он не заработал, Ардуино его не видел. Оказалось, что в библиотеке <Adafruit_BMP280.h> нужно было сделать несколько правок.

    Во-первых, пришлось закоментировать строку с подключением библиотеки <Adafruit_Sensor.h> – такой у меня не было, скорее всего она от старых проектов. Без неё и так всё работает. Всё, что нужно, есть в библиотеке <Adafruit_BMP280.h>.

    Во-вторых, потребовалось в этой библиотеке для модуля указать его реальный адрес, который установил изготовитель. У моего модуля адрес был 0х76, а в библиотеке указано было 0х77.

    Для определения адреса устройства по соединению I2C, можно написать небольшой скетч сканирования I2C адресов, и загрузить его вначале в Ардуино, чтобы через [Монитор порта] увидеть адрес вашего модуля, который вы потом пропишете в библиотеке <Adafruit_BMP280.h> в параметре:

    #define BMP280_ADDRESS (0х76)

    Сканер устройств по I2C

    Ниже публикую небольшой скетч сканера устройств по I2C. Подключите устройства к Ардуино. Запишите в него скетч сканера и через [Монитор порта] в Arduino IDE вы можете узнать адреса подключенных устройств.

    /**********************************************************************
     * Scaner I2C devices
     * Тестировалось на Arduino IDE 1.8.6
     * Дата тестирования 2018-05-25
    **********************************************************************/
    /* Подключение библиотеки для I2C */
    #include <Wire.h>
    
    byte error, address;
    int nDevices;
    
    void setup()
    {
     Wire.begin();
     Serial.begin(9600); // Настройка скорости порта
     while(!Serial);    // Ожидаем подключение порта
     Serial.println("I2C Сканер");
    }
    
    void loop()
    {
     Serial.println("Поиск...");
     nDevices = 0;
    
     /* Опрос адресов */
     for(address = 8; address < 127; address++)
     {
       Wire.beginTransmission(address);
       error = Wire.endTransmission();
    
       if(error == 0)
       {
         Serial.print("I2C устройство найдено по адресу 0x");
         if(address < 16) Serial.print("0");
         Serial.print(address,HEX);
         Serial.println(" !");
         nDevices++;
       }
       else if(error == 4)
       {
         Serial.print("Неизвестная ошибка по адресу 0x");
         if(address < 16) Serial.print("0");
         Serial.print(address,HEX);
       }
     }
    
     if(nDevices == 0)
       Serial.println("Устройства I2C не найдены.");
     else
       Serial.println("Сканирование завершено.");
    
     delay(5000);
    }
    

    Скетч для тестирования модуля BMP280

    После таких несложных изменений, программа заработала. Ардуино увидел модуль BMP280 по соединению I2C.

    Ниже скетч подключения модуля BMP280, который можно скопировать и вставить в свой Arduino IDE:

    /**********************************************************************
     * 2018-05-24 Mr.ALB Тренировка в программировании Ардуино
     * 
     * Arduino  - BMP280 
     *  A5      - SCL
     *  A4      - SDA
     *  3.3V    - VCC
     *  GND     - GND
     *
     * 2018-05-26 v1.0 Вывод информации на Монитор порта
     * 
    **********************************************************************/
    /* Подключение библиотек */
    #include <Wire.h>           // для I2C
    #include <Adafruit_BMP280.h>// для BMP280
    #include <Button.h>         // для кнопок
    
    /**********************************************************************
     * Чтобы всё заработало необходимо 
     * 1. Сканером I2C найти адрес BMP280 или в библиотеке <Adafruit_BMP280.h> 
     *  
     *  1)  Изменить адрес  #define BMP280_ADDRESS (0x77)
     *      на адрес        #define BMP280_ADDRESS (0x76)
     *  2)  Закоментировать библиотеку #include <Adafruit_Sensor.h>
     * 
    **********************************************************************/
    Adafruit_BMP280 bme;// Создаём объект барометра
    
    #define BUTTON_SET_LEVEL 8 // Кнопка обнуления текущего давления
    
    // Создание объекта для кнопки
    Button buttonSetLevel(BUTTON_SET_LEVEL,20);
    
    /**********************************************************************
     * мБар       - мм рт. ст.
     * 1013.2472  - 760 k=1.33322
     * 1005.24788 - 754
     * 
    **********************************************************************/
    
    // Нулевой уровень для давления 1005.24788 мБар => 754 мм рт.ст.
    float null_level = 1005.24788;
    // Коэффициент для перевода Па в мм рт.ст.
    float kp = 133.322;
    float press_now, press_last, press_tmp, altit;// Переменные давления
    float temp, temp_last;      // Переменные температуры
    float temp_correct = -2.94; // Коррекция температуры
    
    /**********************************************************************
     * Настроечная функция, выполняется один раз вначале
    **********************************************************************/
    void setup()
    {
     pinMode(LED_BUILTIN,OUTPUT);
     digitalWrite(LED_BUILTIN,LOW);// Потушим светодиод
    
     /* Настройка последовательного порта для вывода информации */
     Serial.begin(9600);
     Serial.println("Test BMP280");
     if(!bme.begin())
     {
       Serial.println("Не найден датчик BMP280, проверьте соединение!");
       while(1);// Остановка программы
     }
    }
    
    /**********************************************************************
     * Функция loop() выполняется постоянно
    **********************************************************************/
    void loop()
    {
     buttonSetLevel.scanState();// Считывание состояния кнопки
     press_now = bme.readPressure();      // Считывание давления
     altit = bme.readAltitude(null_level);// Считывание высоты
     temp = bme.readTemperature()+temp_correct;// Считывание температуры
    
    /**********************************************************************
     * Если давление изменилось больше чем на 0,1 мм рт.ст.
     * или нажата кнопка обнуления высоты...
     * или температура изменилась больше чем на 0,05°С
    **********************************************************************/
     if((press_now/kp<(press_last/kp-.1))||
         (press_now/kp>(press_last/kp+.1))||
         (temp<(temp_last-.05)||temp>(temp_last+.05))||
          buttonSetLevel.flagClick == true
        )
     {
       if(buttonSetLevel.flagClick == true)// Было нажатие кнопки
       {
         buttonSetLevel.flagClick = false;// Сброс признака клика
         // Обнуляем значение высоты при текущем давлении
         null_level=press_now/100;// В мБарах
       }
    
       Serial.print("Температура = ");
       Serial.print(temp);// Вывод скорректированной температуры
       Serial.println("°C");
    
       Serial.print("Давление = ");
       Serial.print(press_now/kp);// Перевод Па в мм рт.ст.
       Serial.print(" мм рт.ст., ");
       Serial.print(press_now/100);// Перевод Па в мБар
       Serial.println(" мБар");
    
       Serial.print("Приблизительная высота = ");
       Serial.print(altit);
       Serial.println(" м");
       Serial.println();
    
       /* Перезаписываем бывшие значения */
       press_last = press_now;
       temp_last = temp;
       delay(50);
     }
    }// Конец loop()
    
    

    Замечу, что датчик температуры модуля BMP280 показывает несколько смещённую температуру и для её коррекции добавил соответствующий коэффициент. В вашем модуле этот коэффициент может быть другим, нужно его подбирать конкретно под ваш модуль. Поверку своего модуля делал по цифровому датчику DS18B20, про который расскажу на следующих страницах. На датчике DS18B20 я построил термомерт-регулятор. Пока конструкция ещё не полностью завершена, так как ожидается посылка с модулем реле. Реле будет управлять силовой частью, к которой можно будет подключать ТЭНы или вентиляторы, так как термометр-регулятор может работать в режимах: индикации температуры, регулятор-нагреватель, регулятор-охладитель.

    Ещё небольшая заметка: в моей программе значение выводится только при определённом изменении давления, температуры и при нажатии на кнопку SB1. Величины отслеживания изменений можете задать свои, как вам удобно.

    Для большего удобства и ближе к законченной конструкции, скетч тестирования модуля BMP280 можно дополнить индикатором, на который можно вывести значения температуры, давления и высоты. В таком случае будет уже более автономная конструкция, не привязанная к компьютеру. Про это расскажу уже на следующей странице.

    Код, как обычно, закоментирован достаточно подробно и понятно.

    2018-06-03

    Скетч можно скачать тут: sketch__4.zip

    Скетч сканера устройств по I2C: scaner_I2C.zip

    2018-08-11

    Используемая библиотека: Button.zip

    2018-07-23
    . Mr.ALB
    Предыдущая страница Страница 5 Далее