Простая метеостанция на датчике BME280 и Arduino


В этом уроке мы узнаем, как сделать простую метеостанцию ​​с помощью платы Arduino и датчика барометрического давления BME280, который может предоставлять информацию об атмосферном давлении, температуре и влажности в режиме реального времени. Используя BME280, мы даже можем измерять высоту над уровнем моря.

Простая метеостанция на датчике BME280 и Arduino

Также на нашем сайте вы можете посмотреть проекты беспроводной метеостанции на основе платы Arduino и метеостанции на основе платы Raspberry Pi.

Обзор проекта

BME280 довольно прост в использовании, предварительно откалиброван и не требует дополнительных компонентов. Вы можете просто начать измерять относительную влажность, температуру, барометрическое давление и приблизительную высоту над уровнем моря в кратчайшие сроки. Поэтому здесь мы просто подключим датчик барометрического давления BME280 к плате Arduino и отобразим все измеренные параметры, такие как температура, давление, влажность и высота, на ЖК-дисплее 20×4. Вы также можете добавить анемометр в проект для измерения скорости ветра.

Метеостанция — это устройство, которое собирает данные, связанные с погодой и окружающей средой, используя различные датчики. Существует два типа метеостанций: один из них имеет собственные датчики, а второй тип метеостанций — это станции, где мы извлекаем данные с серверов метеостанций с помощью процессора интернета вещей (IoT). В этом руководстве мы выберем первый вариант, то есть мы разработаем собственную метеостанцию, используя только один датчик BME280.

Собранный проект метеостанции на датчике BME280 и Arduino

Необходимые компоненты

  1. Плата Arduino Nano (купить на AliExpress).
  2. Датчик BME280 (купить на AliExpress).
  3. ЖК дисплей 20х4 (купить на AliExpress).
  4. Потенциометр 10 кОм (купить на AliExpress).
  5. Макетная плата
  6. Соединительные провода.

Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158

Датчик давления, температуры и влажности BME280

Нижняя и верхняя сторона датчика BME280

Датчик влажности, температуры и давления Bosch BME280 — это интегрированный датчик окружающей среды, который очень мал по размеру и потребляет мало энергии. Этот атмосферный датчик BME280 — это простой способ измерения барометрического давления, влажности и показаний температуры, не занимая при этом слишком много места. По сути, все, что вам нужно знать об атмосферных условиях, вы можете узнать из этого крошечного датчика.

Чип датчика BME280

Этот модуль использует датчик окружающей среды производства Bosch с датчиком температуры и барометрического давления, который является следующим поколением обновлений популярного датчика BMP085/BMP180/BMP183. Этот датчик отлично подходит для всех видов погодных измерений и может использоваться как с интерфейсом I2C, так и с интерфейсом SPI! Этот прецизионный датчик от Bosch является лучшим недорогим, точным решением для измерения барометрического давления с абсолютной точностью ±1 гПа и температуры с точностью ±1,0 °C. Поскольку давление меняется с высотой, а измерения давления настолько хороши, вы также можете использовать его в качестве высотомера с точностью ±1 метр. Чтобы узнать больше об этом датчике, проверьте спецификацию BME280.

Особенности BME280

  1. Интерфейс: I2C и SPI.
  2. Напряжение питания: от 1,71 В до 3,6 В.
  3. Диапазон температур: от -40 до +85°C.
  4. Диапазон влажности: от 0% до 100% отн. влажности.
  5. Диапазон давления: от 300 гПа до 1100 гПа.
  6. Датчик влажности и датчик давления можно включать/отключать независимо друг от друга.

Приложения

  1. Контекстная осведомленность, например, обнаружение кожи, обнаружение смены помещения.
  2. Мониторинг здоровья/благополучия.
  3. Управление домашней автоматикой.
  4. Управление отоплением, вентиляцией, кондиционированием воздуха (HVAC).
  5. Интернет вещей.
  6. Улучшение GPS и навигация внутри и вне помещений.
  7. Прогноз погоды.
  8. Индикация вертикальной скорости (скорость подъема/опускания).

Распиновка BME280

Интерфейс BME280 I2C использует следующие контакты:
1. VCC: от 1,71 В до 3,6 В.
2. GND: подключить к GND.
3. SCL: линия синхронизации (SCK).
4. SDA: линия передачи данных (SDI).
5. CSB: должен быть подключен к VDDIO для выбора интерфейса I2C.
6. SDO: адрес I2C определяет контакт. Если SDO подключается к GND(0), адрес будет 0x76, если он подключается к VDDIO(1), адрес будет 0x77. В этом модуле мы подключили его к VDDIO, поэтому адрес должен быть 0x77.

Интерфейс I2C в датчике BME280

Модуль оснащен простым двухпроводным интерфейсом I2C, который можно легко соединить с любыми выводами I2C микроконтроллера. Адрес I2C по умолчанию модуля BME280 — 0x76, его можно легко изменить на 0x77.

На рынке доступны два разных BME280, адрес I2C которых можно изменить. Для модуля ниже, если вы удалите соединение с SDO на GND , адрес изменится на 0x77 .

Датчик BME280 с 6 контактами

На рынке доступен другой модуль, который имеет только 4 контакта. Чтобы изменить его адрес I2C, найдите перемычку для пайки рядом с чипом.

Датчик BME280 с 4 контактами

По умолчанию средняя медная площадка соединена с левой площадкой. Поэтому вам нужно поцарапать соединение между средней и левой медной площадкой, чтобы разъединить их. Затем вы можете добавить каплю припоя между средней и правой медной площадкой, чтобы соединить их. Это позволяет вам установить адрес I2C 0x77.

Изменение адреса I2C в датчике BME280 с 4 контактами

Схема проекта

Схема метеостанции на основе датчика BME280 и платы Arduino представлена на следующем рисунке.

Схема метеостанции на основе датчика BME280 и платы Arduino

Датчик барометрического давления BME280 в представленной схеме подключается к плате Arduino для создания простой метеостанции. Подключите выводы SDA и SCL датчика BME280 к выводам Arduino I2C, т.е. выводам A5 и A4.

Подключите контакты 1, 5, 16 ЖК-дисплея к GND и контактам 2, 15 как 5 В VCC. Подключите контакты ЖК-дисплея 4, 6, 11, 12, 13, 14 к контактам Arduino 12, 11, 5, 4, 3, 2. Используйте потенциометр 10 кОм на контакте 3 ЖК-дисплея для регулировки его контрастности.

Исходный код программы

Исходный код программы для сопряжения датчика BME280 с Arduino и ЖК-дисплеем приведен ниже. Вы можете скопировать этот код и загрузить его на плату Arduino.

Но перед этим вам нужно установить две библиотеки, то есть BME280 Library и Adafruit Unified Sensor Library. Для этого вы можете просто зайти в менеджер библиотек и установить эти две библиотеки:

Установка Adafruit Unified Sensor Library в менеджере библиотек Arduino IDE

Установка BME280 Library в менеджере библиотек Arduino IDE

Объяснение работы кода

Наш скетч начинается с подключения 4 библиотек: Wire.h, Adafruit_Sensor.h, Adafruit_BME280.h и LiquidCrystal.h.

Далее мы определяем переменную SEALEVELPRESSURE_HPA для расчета высоты и создания объекта библиотеки Adafruit_BME280. Байт degree[8] используется для печати символа градуса на ЖК-дисплее 20×4.

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

Функция readTemperature() возвращает температуру с датчика.

Функция readPressure() возвращает барометрическое давление с датчика.

Функция readAltitude(SEALEVELPRESSURE_HPA) вычисляет высоту.

Функция readHumidity() возвращает относительную влажность с датчика.

Видео, демонстрирующее работу проекта

Существует усовершенствованная версия датчика BME280 под названием датчик BME680, которая также может измерять индекс качества воздуха (IAQ) и может использоваться для измерения качества воздуха.

А если вы ищете альтернативу BME280, то вы можете использовать датчик MS5611, который также может измерять температуру, давление и высоту.

(Проголосуй первым!)
Загрузка...
2 876 просмотров

Комментарии

Простая метеостанция на датчике BME280 и Arduino — 8 комментариев

  1. Плешивых Валентин Александрович говорит :

    Здравствуйте. Собрал простую метеостанцию, загрузил скетч, на дисплее ничего нет, а на мониторе выдает: Could not find a valid BME280 sensor, check wiring! Хотя со скетчем из примеров, без дисплея, датчик на мониторе показывает нормальную температуру и давление. В чем дело не могу понять.

    • Добрый вечер.
      Судя по описанию, проблема явно не в датчике (он работает со стандартным скетчем). Вот основные причины, почему скетч из статьи не видит датчик, хотя стандартный пример работает:
      Самые вероятные причины
      1. Разный I2C адрес датчика — самая частая причина.
      В стандартном скетче из библиотеки Adafruit BME280 адрес датчика обычно определяется автоматически или указан 0x77.
      В скетче с сайта может быть жестко прописан адрес 0x76 (или наоборот).
      Решение: Найдите в скетче с сайта строку типа:
      Adafruit_BME280 bme; // или
      Adafruit_BME280 bme(0x76);
      Замените на Adafruit_BME280 bme(0x77); (или на 0x76, если было 0x77). Узнать реальный адрес можно, запустив скетч i2c_scanner.

      2. Конфликт библиотек.
      Стандартный пример мог использовать одну версию библиотеки Adafruit BME280, а скетч из статьи требует другую или дополнительную библиотеку (например, старую BME280 от Adafruit vs новую от Bosch).
      Решение: Удалите обе библиотеки (Adafruit BME280 Library и Adafruit Unified Sensor) и установите их заново через менеджер библиотек (последние версии). Затем перезапустите Arduino IDE.

      3. Несовместимость с дисплеем по выводам I2C.
      Хотя схема на сайте показывает подключение BME280 к A4/A5 (аппаратный I2C), а дисплей к цифровым пинам (2,3,4,5,11,12) — конфликта быть не должно. Но если дисплей случайно подключен к тем же A4/A5 — будет конфликт.
      Проверьте: Убедитесь, что у дисплея не используются пины A4 и A5 (обычно у LCD 16x02 или 20x04 на I2C модуле используются другие пины, но у вас, судя по схеме, обычный параллельный LCD — тогда проблем нет).

      4. Ошибка/опечатка в скетче из статьи (неправильный тип датчика).
      Иногда в коде путают BME280 с BMP280 (у BMP280 нет влажности, но код может работать). Но в вашем случае ошибка инициализации говорит, что датчик не отвечает по I2C.
      Решение: Временно уберите из скетча весь код, связанный с дисплеем, оставьте только инициализацию BME280 и вывод в Serial. Если датчик заработает — значит проблема в логике работы с дисплеем (например, задержка перед инициализацией датчика).

      Пошаговый план действий
      1. Узнайте реальный I2C адрес вашего BME280:
      Загрузите стандартный скетч Wire -> i2c_scanner (его нужно скачать отдельно или найти в примерах).
      Посмотрите в монитор порта: какой адрес выдается (скорее всего 0x76 или 0x77).

      2. В скетче из статьи явно укажите этот адрес:
      // Найдите строку объявления датчика и замените на:
      Adafruit_BME280 bme(0x76); // или 0x77

      3. Добавьте проверку инициализации с задержкой:
      void setup() {
      Serial.begin(9600);
      delay(100); // дайте датчику время на запуск
      if (!bme.begin(0x76)) { // используйте ваш адрес
      Serial.println("Could not find a valid BME280 sensor, check wiring!");
      while (1);
      }
      }

      4. Упростите скетч — временно удалите весь код LCD и проверьте вывод в Serial. Если данные появятся — проблема в части LCD (возможно, неправильные пины или питание).

      Что точно не стоит делать
      Менять соединения датчика — они и так работают (раз стандартный пример видит датчик).
      Покупать новый датчик — с ним всё в порядке.
      Попробуйте сначала изменить I2C адрес в коде — это решает проблему в 90% случаев. Если не поможет — напишите, какой адрес показал сканер и точную строку инициализации из скетча в статье.

      • Плешивых Валентин Александрович говорит :

        Спасибо, разобрался. Поменял библиотеку BME280 и всё что с ней связано на библиотеку ВМР280. Всё стало показывать кроме влажности. Только не привычно, что давление кажет в паскалях, лучше бы в мм рт ст.

        • Мы рады что у вас получилось. Формулу можно в скетч добавить для пересчета давления в мм рт ст. Это сравнительно несложно

          • Плешивых Валентин Александрович говорит :

            здравствуйте. для вас не сложно, а для меня проблема. если можно то сделайте пожалуйста.

            • Добрый день. В коде из статьи давление считывается функцией bme.readPressure(), которая возвращает значение в Паскалях. Вам нужно разделить его на 133.322.

              Вот готовый фрагмент, который добавляется в основной цикл loop() после чтения давления:
              // Чтение давления в Паскалях (исходный код)
              float pressurePa = bme.readPressure();

              // Пересчёт в мм рт. ст.
              float pressureMmHg = pressurePa / 133.322;

              // Вывод на ЖК-дисплей (пример для строки 1, столбец 0)
              lcd.setCursor(0, 1);
              lcd.print("Pressure: ");
              lcd.print(pressureMmHg, 1); // 1 знак после запятой
              lcd.print(" mmHg "); // пробелы для затирания остатков

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *