基于ESP32的高级气象站,具有BME280和实时天气数据
扫描二维码
随时随地手机看文章
在这个项目中,我们将学习如何创建一个气象站,它将在web服务器中显示来自BME280模块的读数和来自OpenWeatherMap API的实时天气数据。该设备将从BME280传感器获取温度、湿度、气压和高度,并从OpenWeatherMap API获取外部温度、湿度、天气状况以及日出和日落。我们可以在网络浏览器中看到他们在阅读。
BME280温度,湿度和压力传感器
BME280是一款专为移动应用和可穿戴设备开发的集成环境传感器,尺寸和低功耗是关键设计参数。该装置结合了高线性度和高精度传感器,是完全可行的低电流消耗和长期稳定。BME280传感器提供了极快的响应时间,因此支持新兴应用的性能要求,例如上下文感知,以及在宽温度范围内的高精度。
该传感器测量相对湿度范围为0 ~ 100%,精度为±3%,气压范围为300Pa ~ 1100hpa,绝对精度为±1hpa,温度范围为-40℃~ 85℃,精度为±1.0℃。
BME280支持I2C接口和SPI接口。我们使用的模块支持1.7 - 3.3V的电压范围。当以1Hz的刷新率测量所有参数时,BME280的平均电流消耗为3.6µA。传感器支持休眠、正常、强制三种电源模式。
在购买BME280模块时要记住的一件事是,外观相似的模块也带有缺乏湿度测量功能的BMP280传感器,这使得它比BME280便宜得多。识别BME280和BMP280传感器的最佳方法是查看产品代码。BME280传感器将有一个以“U”开头的产品代码,例如UP, UN等。而BMP280将有一个以“K”开头的产品代码,例如KN, KP等。另一个视觉差异是BME280有点方形,而BMP280是矩形。
OpenWeatherMap API
OpenWeatherMap是一个在线服务,通过API提供全球天气数据,包括当前天气数据、预报、临近预报和任何地理位置的历史天气数据。通过他们的API,我们可以访问地球上任何位置的当前天气数据,包括超过20万个城市!他们收集和处理来自不同来源的天气数据,如全球和当地天气模型、卫星、雷达和一个庞大的气象站网络。数据有JSON、XML和HTML三种格式。我们将使用HTTP GET来请求这个项目的JSON数据。
气象站线路图
连接相当简单。按照上面的连接图进行操作。我们增加了一个18650电池和TP4056充电模块,并为备份提供保护。首先将电池的负极连接到TP4056模块的B-引脚,将正极连接到模块的B+引脚。现在将模块的OUT+连接到ESP32 Devkit的VIN引脚,B-连接到GND引脚。TP4056模块还包含DW01保护芯片,可以防止电池过放电和短路。
现在让我们将BME280模块连接到ESP32 Devkit。BME280的VCC引脚接3.3V引脚,GND接GND引脚。该模块同时支持SPI和I2C。我们将使用I2C接口进行通信。为此,将SDA引脚连接到ESP32 Devkit的D22,将SCL引脚连接到D21。
代码说明和Arduino IDE安装库
对于这个项目,我们需要安装几个Arduino库,它可以直接通过库管理器完成。要安装库,请导航到Arduino IDE > Sketch > Include Library > Manage libraries…等待Library Manager下载库索引并更新已安装库列表。然后搜索并安装以下库。
•Adafruit BME280库
•Adafruit统一传感器
•Arduino_JSON图书馆
使用zip文件安装以下库。
•ESPAsyncWebServer
•AsyncTCP
在Arduino IDE中安装ESP32文件系统上传器
我们使用SPIFFS来托管web服务器文件。我们可以像使用普通文件系统一样使用ESP32闪存,就像在SD卡或USB大容量存储中一样,借助SPIFFS将这些文件上传到文件系统中,我们需要一个称为ESP32文件系统上传器的工具。要将此工具安装到Arduino IDE,请遵循以下步骤
•到GitHub发布页面下载ESP32FS-1.0.zip。
•将zip文件解压缩到Arduino IDE目录下的Tools文件夹。解压后的路径看起来像这样“C:\Users\Username\Documents\Arduino\tools\ESP32FS\tool\ ESP32FS .jar”
•重新启动Arduino IDE,您可以通过单击Tools Menu使用此工具。
web服务器文件结构
正如我们已经说过的,我们将使用ESP32文件系统来托管web服务器。文件系统结构如下所示。需要加载到文件系统的所有数据都存储在sketch文件夹中名为data的文件夹中。
HTML文件
html文件是服务器收到请求时加载的主文件。它包含了网页的所有结构编程。
CSS文件
css文件用于定义HTML页面的样式。使用CSS,我们可以控制颜色,字体,文字大小,元素之间的间距,元素如何定位和布局,使用什么背景图像或背景颜色,不同设备和屏幕尺寸的不同显示,等等!
JavaScript文件
javascript文件负责图像操作、JSON解码和内容的动态更改。这有助于我们更新网页上的值。它控制数据更新的事件侦听器。
Arduino草图
这是ESP32气象站的草图。
让我们看一下代码是如何从传感器读取数据,从API获取天气数据,并将其发送到web服务器的。
包括库
WiFi、HTTPClient、AsyncTCP和ESPAsyncWebServer库用于WiFi通信和web服务器的创建和维护。
SPIFFS库用于文件系统管理,Arduino_JSON库用于处理JSON字符串。
最后,Adafruit传感器库和Adafruit BME280库用于处理BME280传感器。
用户可修改参数
在代码中,需要更改一些值才能使其正常工作。将“您的WiFi SSID”和“您的WiFi密码”替换为您的WiFi SSID和密码。另外,根据您的城市代码和温度测量单位更改。
下一个也是最重要的参数是API密钥。这个密钥是唯一的,这是我们从OpenWeatherMap服务器提取数据的认证密钥。获取API密钥的过程非常简单。去OpenWeatherMap网站,创建一个账户。如果你已经有一个帐户,就登录进去。。在该页面上,您可以看到您的默认API密钥。如果您愿意,可以稍后创建密钥。复制API密钥并将其粘贴到代码中。这样就可以从OpenWeatherMap服务器获取数据了。
获取BME280读数
下面的函数用于从BME280获取读数。
在这个函数中,每次读取都从BME280传感器获取,并将其编码为JSON字符串,然后将JSON字符串返回给事件处理程序。当事件被触发时,事件处理程序将把这些数据发送到web页面。
从OpenWeatherMap API获取天气数据
为此,我们创建了另一个函数。它将以JSON格式从API获取天气数据,解码,并将其排列成我们需要的格式。然后,与BME280读取函数类似,该函数将这些编码为JSON字符串,并在触发特定事件时将其发送到服务器。HTTP GET用于从服务器获取数据。
Web设置和事件请求处理
下面的setup函数部分将创建和设置web服务器,并在网页加载时处理事件请求。当收到加载网页的请求时,第一个事件处理程序将发送网页数据。第二个事件处理程序将监听重置请求,并将页面上显示的所有变量设置为零。第三个even处理程序是检查客户端连通性,如果客户端断开连接,服务器将尝试在一秒钟的间隔内重新建立连接。
在循环函数中,还可以看到另外两个事件处理程序。这些处理程序不会监听任何请求。它们将在设定的时间定期发送数据。这将刷新网页上的数据。BME280的数据更新速度比开放天气图数据快。
上传代码和文件
上传代码很简单。就像其他Arduino板一样,将ESP32 Devkit连接到PC上。选择正确的“Board”和“Port”,单击“upload”。就是这样。要上传Web Server文件,请确保所有文件都位于名为data的文件夹中,该文件夹与.ino文件位于同一文件夹中。进入“工具-> ESP32草图数据上传”。IDE将上传文件并重新启动ESP32。上传文件时,请确保未打开串行监视器。如果它被打开,你会得到一个错误。如果是,只需关闭串行监视器并再次上传文件。您可以从以下链接下载草图和web服务器文件。
访问Web服务器
现在,一旦代码被编译并编程到ESP32中,你可以检查串行监视器,一旦ESP32连接到WiFi网络,它就会打印出IP地址。
或者你可以检查你的路由器和分配给ESP32的IP是什么。这取决于你的路由器。一旦你获得了IP,你就可以通过简单地在浏览器中输入这个地址并进入页面来访问网络服务器。这就是结果。
天气状况图标会根据从API接收到的数据而改变。日出和日落时间也从OWM API中提取。
本文编译自iotdesignpro