|
不要让智能手机的天气应用程序或商业气象站(可以为您提供基于英里的数据的数据)破坏您的户外计划。通过这个物联网项目,您可以成为自己的天气预报员!
该项目使用ESP8266 NODEMCU作为控制设备,可轻松连接到现有的WiFi网络并创建网页服务器。当任何连接的设备访问该网页服务器时,ESP8266将读取BME280的温度、湿度、气压和高度,并将其发送到网页浏览器。
温度、湿度和压力传感器BME280 首先,让我们快速看一下BME280模块。BME280是Bosch公司生产的下一代数字温度、湿度和压力传感器。它是BMP180、BMP085或BMP183之类的传感器的继任者。
BME280模块的工作电压从3.3V到5V,非常适合连接到ESP8266。该模块具有简单的两线I2C接口,用于通信。BME280模块的默认I2C地址为0x76。
BME280传感器与ESP8266 NodeMCU的硬件连接 连接非常简单。首先将VIN引脚连接到ESP8266 NodeMCU上的3.3V输出,然后将GND连接到地。
接下来,将SCL引脚连接到ESP8266上的I2C时钟D1引脚,然后将SDA引脚连接到ESP8266上的I2C数据D2引脚。下图显示了如何连接所有组件。
安装BME280库 与BME280模块进行通信需要一堆工作。幸运的是,Adafruit BME280库被编写为隐藏所有复杂性,以便我们可以发出简单的命令来读取温度、相对湿度和气压数据。
要安装库导航到Arduino IDE > Sketch > Include Library > Manage Libraries… 等待Library Manager下载库索引并更新已安装的库列表。输入BME280筛选搜索结果。查找Adafruit提供的Adafruit BME280库。单击该条目,然后选择Install。
BME280传感器库使用Adafruit传感器支持后端。因此,搜索库管理器以查看Adafruit Unified Sensor并安装。
在ESP8266网页服务器上显示温度、湿度、压力和高度 现在,我们将ESP8266配置为站点(STA)模式,并创建网页服务器以将网页提供给现有网络下的任何连接客户端。
在上传草图之前,您需要进行一个更改以使其适合您。您需要使用网络凭据修改以下两个变量,以便ESP8266可以与现有网络建立连接。 - const char* ssid = "YourNetworkName"; // Enter SSID here
- const char* password = "YourPassword"; //Enter Password here
复制代码完成后,上传该草图至ESP8266。 - #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;
- /*Put your SSID & Password*/
- const char* ssid = "YourNetworkName"; // Enter SSID here
- const char* password = "YourPassword"; //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> <html>\n";
- ptr +="<head><meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">\n";
- ptr +="<title>ESP8266 Weather Station</title>\n";
- ptr +="<style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}\n";
- ptr +="body{margin-top: 50px;} h1 {color: #444444;margin: 50px auto 30px;}\n";
- ptr +="p {font-size: 24px;color: #444444;margin-bottom: 10px;}\n";
- ptr +="</style>\n";
- ptr +="</head>\n";
- ptr +="<body>\n";
- ptr +="<div id="webpage">\n";
- ptr +="<h1>ESP8266 Weather Station</h1>\n";
- ptr +="<p>Temperature: ";
- ptr +=temperature;
- ptr +="°C</p>";
- ptr +="<p>Humidity: ";
- ptr +=humidity;
- ptr +="%</p>";
- ptr +="<p>Pressure: ";
- ptr +=pressure;
- ptr +="hPa</p>";
- ptr +="<p>Altitude: ";
- ptr +=altitude;
- ptr +="m</p>";
- ptr +="</div>\n";
- ptr +="</body>\n";
- ptr +="</html>\n";
- return ptr;
- }
复制代码
访问网页服务器 上传草图后,打开串口显示器。然后按NodeMCU上的复位按钮。 如果一切正常,它将输出从路由器获得的动态IP地址,并显示HTTP server started消息。
接下来,加载一个浏览器,并将其指向串口显示器上显示的IP地址。 ESP8266应提供一个网页,显示BME280的温度、湿度、压力和高度。
|