使用 Grafana 构建您自己的天气仪表盘
简介
在这里,我们将向您介绍如何使用 Grafana 在您的 reTerminal 上制作自己的天气仪表盘,特别感谢 Michaelm Klementsk 的贡献。
InfluxDB 是由 InfluxData 公司开发的一个开源的时间序列数据库 (TSDB)。它使用 Go 编程语言 编写,用于存储和检索在操作监控、应用程序指标、物联网传感器数据以及实时分析等领域的时间序列数据。它还支持处理来自 Graphite 的数据。
Grafana 是一个多平台的开源分析和交互式可视化Web应用程序。当连接到支持的数据源时,它可以为Web提供图表、图形和警报。Grafana 还提供一个具有额外功能的授权企业版,可以作为自托管安装或 Grafana Labs 云服务上的账户使用。它通过一个插件系统进行扩展。终端用户可以使用交互式查询生成器创建复杂的监控仪表盘。Grafana 分为前端和后端,分别使用 TypeScript 和 Go 编写。
我们将使用 ESP32 来收集温度、湿度和气压数据。这些数据将被发送到 InfluxDB 中的时间序列数据库。InfluxDB 可以在 Raspberry Pi 上本地运行,也可以运行在其云服务器上,我们将使用其云服务器。然后,我们将使用一个名为 Grafana 的分析和可视化应用程序来显示存储在数据库中的信息。Grafana 也可以在我们的 Raspberry Pi(或本例中的 reTerminal)上本地运行,或者运行在其云服务器上。我们将把它安装并在我们的 reTerminal 上本地运行。您不需要为 InfluxDB 和 Grafana 使用单独的 Pi,如果您愿意,可以将两者都本地运行在您的 reTerminal 上——我只是希望不必让 reTerminal 一直运行以收集数据。
所需材料
- reTerminal
- 电源
- ESP32
- Grove 传感器(来自 Beginner Kit)
- 面包板
- 面包板跳线
Azure 和 InfluxDB 设置
我们需要先创建一个虚拟机。
- 步骤 1. 打开以下页面并登录到您的 Microsoft Azure 服务。点击
Virtual machines
,然后点击Create
。
- 步骤 2. 在虚拟机中选择 Ubuntu 18.04 系统作为默认系统。点击
Review + create
并进入下一页。
- 步骤 3. 所有配置选择完成后,点击
Create
。
该过程需要一些时间,完成后点击 Go to resource
按钮。
然后会跳转到以下页面。点击 Networking
,选择 Add inbound port rule
并添加 8086
端口,目标为任意。

- 步骤 4. 复制以下命令以安装 Docker 并启用它。
sudo apt udpate
sudo apt install docker docker-compose -y
sudo systemctl enable --now docker && sudo systemctl start docker
sudo systemctl status docker
- 步骤 5. 使用以下命令拉取 InfluxDB 镜像。
sudo docker pull influxdb:2.1.1
- 步骤 6. 使用以下命令在后台运行 InfluxDB。
sudo docker run -d --name influxdb -p 8086:8086 influxdb:2.1.1
- 步骤 7. 打开浏览器并输入
http://yourip:8086
(您的 IP)。点击 "Get Started" 开始使用。
- 步骤 8. 记录您的
Organization Name
和Bucket Name
,然后点击 "Continue"。
- 步骤 9. 点击
Data > API Tokens
。
至此,Azure 和 InfluxDB 已设置完成,接下来我们将转到 ESP32 的设置。
ESP32 设置
为了收集天气数据,我们将使用 ESP32,连接一个 DHT11 传感器到引脚 4,以及一个 BMP280 压力传感器到 I2C 接口(引脚 21 和 22)。这里的示例使用了 beginner kit 中的两个 Grove 传感器模块,因为它们已经内置了所有必要的电子元件(如额外的电阻等)。
- 步骤 1. 打开 Arduino IDE 并安装库。这里提供两种安装方式。
- 使用库管理器
1. 打开 Arduino IDE,点击 "Sketch" 菜单,然后选择 Include Library > Manage Libraries。
2. 在搜索框中输入 'influxdb'。
3. 安装 'InfluxDBClient for Arduino' 库。
- 手动安装
1. cd <arduino-sketch-location>/library。
2. git clone https://github.com/tobiasschuerg/InfluxDB-Client-for-Arduino
3. 重启 Arduino IDE。
- 步骤 2. 将以下代码复制到草图中。
#include <Wire.h> // 导入所需库
#include "DHT.h"
#include "Seeed_BMP280.h"
#include <WiFiMulti.h>
WiFiMulti wifiMulti;
#define DEVICE "ESP32"
#include <InfluxDbClient.h>
#include <InfluxDbCloud.h>
#define WIFI_SSID "xxxxxxxx" // 网络名称
#define WIFI_PASSWORD "xxxxxxxxxx" // 网络密码
#define INFLUXDB_URL "http://xxxxxxxx:8086" // InfluxDB v2 服务器 URL,例如 https://eu-central-1-1.aws.cloud2.influxdata.com (使用: InfluxDB UI -> Load Data -> Client Libraries)
#define INFLUXDB_TOKEN "xxxxxxxxx" // InfluxDB v2 服务器或云 API 令牌 (使用: InfluxDB UI -> Data -> API Tokens -> <选择令牌>)
#define INFLUXDB_ORG "xxxxxxx" // InfluxDB v2 组织 ID (使用: InfluxDB UI -> User -> About -> Common Ids)
#define INFLUXDB_BUCKET "xxxxxxx" // InfluxDB v2 存储桶名称 (使用: InfluxDB UI -> Data -> Buckets)
#define TZ_INFO "JST-9" // InfluxDB v2 时区
DHT dht(4,DHT11); // DHT 和 BMP 传感器参数
BMP280 bmp280;
int temp = 0; // 用于存储传感器读数的变量
int humid = 0;
int pressure = 0;
//InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN, InfluxDbCloud2CACert); // 使用预配置的 InfluxCloud 证书的 InfluxDB 客户端实例
InfluxDBClient client(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
Point sensor("weather"); // 数据点
void setup()
{
Serial.begin(115200); // 启动串行通信
dht.begin(); // 连接到 DHT 传感器
if(!bmp280.init()) // 连接到压力传感器
Serial.println("bmp280 init error!");
WiFi.mode(WIFI_STA); // 设置 WiFi 连接
wifiMulti.addAP(WIFI_SSID, WIFI_PASSWORD);
Serial.print("Connecting to wifi"); // 连接到 WiFi
while (wifiMulti.run() != WL_CONNECTED)
{
Serial.print(".");
delay(100);
}
Serial.println();
sensor.addTag("device", DEVICE); // 添加标签 - 根据需要重复
sensor.addTag("SSID", WIFI_SSID);
timeSync(TZ_INFO, "pool.ntp.org", "time.nis.gov"); // 准确的时间对于证书验证和批量写入是必要的
if (client.validateConnection()) // 检查服务器连接
{
Serial.print("Connected to InfluxDB: ");
Serial.println(client.getServerUrl());
}
else
{
Serial.print("InfluxDB connection failed: ");
Serial.println(client.getLastErrorMessage());
}
}
void loop() // 循环函数
{
temp = dht.readTemperature(); // 记录温度
humid = dht.readHumidity(); // 记录湿度
pressure = bmp280.getPressure()/100; // 记录压力
sensor.clearFields(); // 清除字段以重复使用数据点。标签将保持不变
sensor.addField("temperature", temp); // 将测量值存储到数据点
sensor.addField("humidity", humid); // 将测量值存储到数据点
sensor.addField("pressure", pressure); // 将测量值存储到数据点
if (wifiMulti.run() != WL_CONNECTED) // 检查 WiFi 连接并在需要时重新连接
Serial.println("Wifi connection lost");
if (!client.writePoint(sensor)) // 写入数据点
{
Serial.print("InfluxDB write failed: ");
Serial.println(client.getLastErrorMessage());
}
Serial.print("Temp: "); // 在串行监视器上显示读数
Serial.println(temp);
Serial.print("Humidity: ");
Serial.println(humid);
Serial.print("Pressure: ");
Serial.println(pressure);
delay(1000); // 等待 60 秒
}
注意: 代码尚未完成。如果您设置了 API 令牌和存储桶,那么从 InfluxDB 仪表板访问的 Arduino 接口页面生成的代码将已经包含正确的设置信息,因此您只需将其复制到您的代码中即可。
- 步骤 3. 上传代码并检查结果。
过一段时间后,我们可以看到信息现在已经存储在我们的 InfluxDB 数据库中,这表明我们的 ESP32 工作正常。现在我们可以继续在 reTerminal 上安装 Grafana 并设置它以显示数据库中的信息。
在 reTerminal 上安装和设置 Grafana
接下来,我们将按照其网站上关于在 Debian 或 Ubuntu 上安装的终端说明来安装 Grafana。然后我们只需启动 Grafana 并设置为开机自动启动。
- 步骤 1. 通过在浏览器中打开一个新标签页,指向 localhost 的 3000 端口来访问 Grafana 的 Web 界面。您可以在 reTerminal 上打开浏览器并输入
http://localhost:3000
然后我们需要配置它以从 InfluxDB 中读取数据,方法是输入服务器和身份验证信息。这些信息可以通过您的 InfluxDB Web 界面找到,并且与您的 ESP32 发布数据的目标信息非常相似。
- 步骤 2. 点击
Setting
按钮并选择Data sources
。
- 步骤 3. 在过滤器中输入
InfluxDB
并选择InfluxDB
。
现在我们已经在 reTerminal 上安装并设置了 Grafana。
配置 Grafana 使用 Flux
在 InfluxDB 数据源中选择 Flux 作为查询语言后,我们将配置 InfluxDB 连接:
-
步骤 1. 设置 Connection 并点击 Save & Test。相关信息如下:
-
URL: 您的 InfluxDB URL。
http://yourip:8086/
-
Organization: 您的 InfluxDB 组织名称 或 ID。
-
Token: 您的 InfluxDB API 令牌。
-
Default Bucket: Flux 查询中使用的默认 存储桶。
-
Min time interval: Grafana 的最小时间间隔。
-
Grafana 应该能够连接到 InfluxDB 2.0 数据源并返回测试结果。
- 步骤 2. 在此处添加面板。
- 步骤 3. 返回
InfluxDB
,按照以下说明创建脚本。
- 步骤 4. 复制脚本并将其粘贴到 reTerminal 中。
- 步骤 5. 在 reTerminal 上检查结果,信息应如下所示。