В этой статье мы узнаем, как сделать мини-метеостанцию с использованием NodeMCU ESP8266 и датчика барометрического давления BME280, которая может предоставлять информацию об атмосферном давлении, температуре и влажности в режиме реального времени. Используя датчик BME280, мы даже можем измерять высоту над уровнем моря.
BME280 довольно прост в использовании, предварительно откалиброван и не требует дополнительных компонентов. Вы можете просто начать измерять относительную влажность, температуру, барометрическое давление и приблизительную высоту в кратчайшие сроки. Поэтому здесь мы просто подключим датчик барометрического давления BME280 к модулю Wifi ESP8266 и отобразим все измеренные параметры, такие как температура, давление, влажность и высота на веб-сервере.
Метеостанция — это устройство, которое собирает данные, связанные с погодой и окружающей средой, используя различные датчики. Существует два типа метеостанций: один из них имеет собственные датчики, а второй тип метеостанций — это станции, где мы извлекаем данные с серверов метеостанций с помощью процессора интернета вещей (IoT). В этом руководстве мы выберем первый вариант, то есть мы разработаем собственную метеостанцию, используя только один датчик BME280.
Также ранее на нашем сайте мы рассматривали другие проекты с применением датчика BME280:
- простая метеостанция на датчике BME280 и Arduino;
- метеостанция на ESP32 и датчике BME280;
- взаимодействие Wi-Fi клиент-сервер между двумя платами NodeMCU ESP8266.
Необходимые компоненты
- NodeMCU ESP8266 (купить на AliExpress).
- Датчик BME280 (купить на AliExpress).
- Макетная плата.
- Соединительные провода.
Реклама: ООО "АЛИБАБА.КОМ (РУ)" ИНН: 7703380158
Датчик давления, температуры и влажности BME280
Датчик влажности, температуры и давления Bosch BME280 — это интегрированный датчик окружающей среды, который очень мал по размеру и потребляет мало энергии. Этот атмосферный датчик BME280 — это простой способ измерения барометрического давления, влажности и показаний температуры, не занимая при этом слишком много места. По сути, все, что вам нужно знать об атмосферных условиях, вы можете узнать из этого крошечного датчика.
Этот модуль использует датчик окружающей среды производства Bosch с датчиком температуры и барометрического давления, который является следующим поколением обновлений популярного датчика BMP085/BMP180/BMP183. Этот датчик отлично подходит для всех видов погодных измерений и может использоваться как с интерфейсом I2C, так и с интерфейсом SPI! Этот прецизионный датчик от Bosch является лучшим недорогим, точным решением для измерения барометрического давления с абсолютной точностью ±1 гПа и температуры с точностью ±1,0 °C. Поскольку давление меняется с высотой, а измерения давления настолько хороши, вы также можете использовать его в качестве высотомера с точностью ±1 метр. Чтобы узнать больше об этом датчике, проверьте спецификацию BME280.
Особенности BME280
- Интерфейс: I2C и SPI.
- Напряжение питания: от 1,71 В до 3,6 В.
- Диапазон температур: от -40 до +85°C.
- Диапазон влажности: от 0% до 100% отн. влажности.
- Диапазон давления: от 300 гПа до 1100 гПа.
- Датчик влажности и датчик давления можно включать/отключать независимо друг от друга.
Приложения
- Контекстная осведомленность, например, обнаружение кожи, обнаружение смены помещения.
- Мониторинг здоровья/благополучия.
- Управление домашней автоматикой.
- Управление отоплением, вентиляцией, кондиционированием воздуха (HVAC).
- Интернет вещей.
- Улучшение GPS и навигация внутри и вне помещений.
- Прогноз погоды.
- Индикация вертикальной скорости (скорость подъема/опускания).
Распиновка 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 .
На рынке доступен другой модуль, который имеет только 4 контакта. Чтобы изменить его адрес I2C, найдите перемычку для пайки рядом с чипом.
По умолчанию средняя медная площадка соединена с левой площадкой. Поэтому вам нужно поцарапать соединение между средней и левой медной площадкой, чтобы разъединить их. Затем вы можете добавить каплю припоя между средней и правой медной площадкой, чтобы соединить их. Это позволяет вам установить адрес I2C 0x77.
Взаимодействие BME280 с NodeMCU ESP8266
Схема подключение датчика BME280 к NodeMCU ESP8266 представлена на следующем рисунке.
Подключите выводы SDA и SCL датчика BME280 к выводам ESP8266 I2C GPIO, т.е. выводам D2 и D1 соответственно.
Исходный код программы
Исходный код программа для сопряжения BME280 с модулем ESP8266 Wifi приведен ниже. Вы можете скопировать этот код и загрузить его на вашу плату ESP8266.
Но перед этим вам нужно установить две библиотеки, то есть BME280 Library и Adafruit Unified Sensor Library. Для этого вы можете просто зайти в менеджер библиотек и установить эти две библиотеки:
А вот и сам код.
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 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
#include <ESP8266WebServer.h> #include <Wire.h> #include <Adafruit_Sensor.h> #include <Adafruit_BME280.h> #define SEALEVELPRESSURE_HPA (1013.25) Adafruit_BME280 bme; float temperature, humidity, pressure, altitude; const char* ssid = "Fimo"; // Enter SSID here const char* password = "Fimo@!23"; //Enter Password here ESP8266WebServer server(80); void setup() { Serial.begin(115200); delay(100); bme.begin(0x76); Serial.println("Connecting to "); Serial.println(ssid); //Connect to your local wi-fi network WiFi.begin(ssid, password); //check wi-fi is connected to wi-fi network while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.print("."); } Serial.println(""); Serial.println("WiFi connected..!"); Serial.print("Got IP: "); Serial.println(WiFi.localIP()); server.on("/", handle_OnConnect); server.onNotFound(handle_NotFound); server.begin(); Serial.println("HTTP server started"); } void loop() { server.handleClient(); } void handle_OnConnect() { temperature = bme.readTemperature(); humidity = bme.readHumidity(); pressure = bme.readPressure() / 100.0F; altitude = bme.readAltitude(SEALEVELPRESSURE_HPA); server.send(200, "text/html", SendHTML(temperature,humidity,pressure,altitude)); } void handle_NotFound(){ server.send(404, "text/plain", "Not found"); } String SendHTML(float temperature,float humidity,float pressure,float altitude){ String ptr = "<!DOCTYPE html>"; ptr +="<html>"; ptr +="<head>"; ptr +="<title>ESP8266 Weather Station</title>"; ptr +="<meta name='viewport' content='width=device-width, initial-scale=1.0'>"; ptr +="<link href='https://fonts.googleapis.com/css?family=Open+Sans:300,400,600' rel='stylesheet'>"; ptr +="<style>"; ptr +="html { font-family: 'Open Sans', sans-serif; display: block; margin: 0px auto; text-align: center;color: #444444;}"; ptr +="body{margin: 0px;} "; ptr +="h1 {margin: 50px auto 30px;} "; ptr +=".side-by-side{display: table-cell;vertical-align: middle;position: relative;}"; ptr +=".text{font-weight: 600;font-size: 19px;width: 200px;}"; ptr +=".reading{font-weight: 300;font-size: 50px;padding-right: 25px;}"; ptr +=".temperature .reading{color: #F29C1F;}"; ptr +=".humidity .reading{color: #3B97D3;}"; ptr +=".pressure .reading{color: #26B99A;}"; ptr +=".altitude .reading{color: #955BA5;}"; ptr +=".superscript{font-size: 17px;font-weight: 600;position: absolute;top: 10px;}"; ptr +=".data{padding: 10px;}"; ptr +=".container{display: table;margin: 0 auto;}"; ptr +=".icon{width:65px}"; ptr +="</style>"; ptr +="</head>"; ptr +="<body>"; ptr +="<h1>ESP8266 Weather Station</h1>"; ptr +="<h3>www.how2electronics.com</h3>"; ptr +="<div class='container'>"; ptr +="<div class='data temperature'>"; ptr +="<div class='side-by-side icon'>"; ptr +="<svg enable-background='new 0 0 19.438 54.003'height=54.003px id=Layer_1 version=1.1 viewBox='0 0 19.438 54.003'width=19.438px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><g><path d='M11.976,8.82v-2h4.084V6.063C16.06,2.715,13.345,0,9.996,0H9.313C5.965,0,3.252,2.715,3.252,6.063v30.982"; ptr +="C1.261,38.825,0,41.403,0,44.286c0,5.367,4.351,9.718,9.719,9.718c5.368,0,9.719-4.351,9.719-9.718"; ptr +="c0-2.943-1.312-5.574-3.378-7.355V18.436h-3.914v-2h3.914v-2.808h-4.084v-2h4.084V8.82H11.976z M15.302,44.833"; ptr +="c0,3.083-2.5,5.583-5.583,5.583s-5.583-2.5-5.583-5.583c0-2.279,1.368-4.236,3.326-5.104V24.257C7.462,23.01,8.472,22,9.719,22"; ptr +="s2.257,1.01,2.257,2.257V39.73C13.934,40.597,15.302,42.554,15.302,44.833z'fill=#F29C21 /></g></svg>"; ptr +="</div>"; ptr +="<div class='side-by-side text'>Temperature</div>"; ptr +="<div class='side-by-side reading'>"; ptr +=(int)temperature; ptr +="<span class='superscript'>°C</span></div>"; ptr +="</div>"; ptr +="<div class='data humidity'>"; ptr +="<div class='side-by-side icon'>"; ptr +="<svg enable-background='new 0 0 29.235 40.64'height=40.64px id=Layer_1 version=1.1 viewBox='0 0 29.235 40.64'width=29.235px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><path d='M14.618,0C14.618,0,0,17.95,0,26.022C0,34.096,6.544,40.64,14.618,40.64s14.617-6.544,14.617-14.617"; ptr +="C29.235,17.95,14.618,0,14.618,0z M13.667,37.135c-5.604,0-10.162-4.56-10.162-10.162c0-0.787,0.638-1.426,1.426-1.426"; ptr +="c0.787,0,1.425,0.639,1.425,1.426c0,4.031,3.28,7.312,7.311,7.312c0.787,0,1.425,0.638,1.425,1.425"; ptr +="C15.093,36.497,14.455,37.135,13.667,37.135z'fill=#3C97D3 /></svg>"; ptr +="</div>"; ptr +="<div class='side-by-side text'>Humidity</div>"; ptr +="<div class='side-by-side reading'>"; ptr +=(int)humidity; ptr +="<span class='superscript'>%</span></div>"; ptr +="</div>"; ptr +="<div class='data pressure'>"; ptr +="<div class='side-by-side icon'>"; ptr +="<svg enable-background='new 0 0 40.542 40.541'height=40.541px id=Layer_1 version=1.1 viewBox='0 0 40.542 40.541'width=40.542px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><g><path d='M34.313,20.271c0-0.552,0.447-1,1-1h5.178c-0.236-4.841-2.163-9.228-5.214-12.593l-3.425,3.424"; ptr +="c-0.195,0.195-0.451,0.293-0.707,0.293s-0.512-0.098-0.707-0.293c-0.391-0.391-0.391-1.023,0-1.414l3.425-3.424"; ptr +="c-3.375-3.059-7.776-4.987-12.634-5.215c0.015,0.067,0.041,0.13,0.041,0.202v4.687c0,0.552-0.447,1-1,1s-1-0.448-1-1V0.25"; ptr +="c0-0.071,0.026-0.134,0.041-0.202C14.39,0.279,9.936,2.256,6.544,5.385l3.576,3.577c0.391,0.391,0.391,1.024,0,1.414"; ptr +="c-0.195,0.195-0.451,0.293-0.707,0.293s-0.512-0.098-0.707-0.293L5.142,6.812c-2.98,3.348-4.858,7.682-5.092,12.459h4.804"; ptr +="c0.552,0,1,0.448,1,1s-0.448,1-1,1H0.05c0.525,10.728,9.362,19.271,20.22,19.271c10.857,0,19.696-8.543,20.22-19.271h-5.178"; ptr +="C34.76,21.271,34.313,20.823,34.313,20.271z M23.084,22.037c-0.559,1.561-2.274,2.372-3.833,1.814"; ptr +="c-1.561-0.557-2.373-2.272-1.815-3.833c0.372-1.041,1.263-1.737,2.277-1.928L25.2,7.202L22.497,19.05"; ptr +="C23.196,19.843,23.464,20.973,23.084,22.037z'fill=#26B999 /></g></svg>"; ptr +="</div>"; ptr +="<div class='side-by-side text'>Pressure</div>"; ptr +="<div class='side-by-side reading'>"; ptr +=(int)pressure; ptr +="<span class='superscript'>hPa</span></div>"; ptr +="</div>"; ptr +="<div class='data altitude'>"; ptr +="<div class='side-by-side icon'>"; ptr +="<svg enable-background='new 0 0 58.422 40.639'height=40.639px id=Layer_1 version=1.1 viewBox='0 0 58.422 40.639'width=58.422px x=0px xml:space=preserve xmlns=http://www.w3.org/2000/svg xmlns:xlink=http://www.w3.org/1999/xlink y=0px><g><path d='M58.203,37.754l0.007-0.004L42.09,9.935l-0.001,0.001c-0.356-0.543-0.969-0.902-1.667-0.902"; ptr +="c-0.655,0-1.231,0.32-1.595,0.808l-0.011-0.007l-0.039,0.067c-0.021,0.03-0.035,0.063-0.054,0.094L22.78,37.692l0.008,0.004"; ptr +="c-0.149,0.28-0.242,0.594-0.242,0.934c0,1.102,0.894,1.995,1.994,1.995v0.015h31.888c1.101,0,1.994-0.893,1.994-1.994"; ptr +="C58.422,38.323,58.339,38.024,58.203,37.754z'fill=#955BA5 /><path d='M19.704,38.674l-0.013-0.004l13.544-23.522L25.13,1.156l-0.002,0.001C24.671,0.459,23.885,0,22.985,0"; ptr +="c-0.84,0-1.582,0.41-2.051,1.038l-0.016-0.01L20.87,1.114c-0.025,0.039-0.046,0.082-0.068,0.124L0.299,36.851l0.013,0.004"; ptr +="C0.117,37.215,0,37.62,0,38.059c0,1.412,1.147,2.565,2.565,2.565v0.015h16.989c-0.091-0.256-0.149-0.526-0.149-0.813"; ptr +="C19.405,39.407,19.518,39.019,19.704,38.674z'fill=#955BA5 /></g></svg>"; ptr +="</div>"; ptr +="<div class='side-by-side text'>Altitude</div>"; ptr +="<div class='side-by-side reading'>"; ptr +=(int)altitude; ptr +="<span class='superscript'>m</span></div>"; ptr +="</div>"; ptr +="</div>"; ptr +="</body>"; ptr +="</html>"; return ptr; } |