这是使用BME280获取温度、湿度和气压数据,并通过ESP32的Wifi连接直接发送到Graphite的记录。
不对graphite和Grafana进行解释。
本次使用的物品
| 商品名 | 购买链接 |
|---|---|
| ESP-32S | AliExpress Amazon 乐天 |
| BME280 | AliExpress Amazon 乐天 |
连接图

BME280和ESP-32S通过I2C连接。
ESP-32S的GPIO21为SDA,GPIO22为SCL。
| ESP-32S | BME280 |
|---|---|
| 3.3V | VIN |
| GND | GND |
| GPIO21 | SDA |
| GPIO22 | SCL |
内容
- 连接Wifi
- 查询ntp服务器以获取时间
- 创建时间中断,每秒发送一次数据
代码
#include <Arduino.h>
#include <WiFi.h>
#include <Wire.h>
#include <Adafruit_BME280.h>
#include <Ticker.h>
#include <WiFiUdp.h>
#include <time.h>
// Wifi
const char SSID[] = "";
const char PASSWORD[] = "";
// NTP服务器
const char NTP_SERVER[] = "ntp.nict.jp";
// Graphite
IPAddress graphite(192,168,0,10);
// Ticker
Ticker ticker;
bool flagTicker = false;
// BME280传感器
Adafruit_BME280 bme;
void setTicker() {
flagTicker = true;
}
// UDP
WiFiUDP udp;
void setup() {
Serial.begin(115200);
while (!Serial);
if (!bme.begin(0x76)) {
Serial.println("BME280传感器错误!");
while (1);
}
// Wifi连接
WiFi.begin(SSID, PASSWORD);
Serial.print("正在连接Wifi");
while (WiFi.status() != WL_CONNECTED) {
Serial.print(".");
delay(100);
}
IPAddress ipaddr, gateway;
ipaddr = WiFi.localIP();
gateway = WiFi.gatewayIP();
Serial.println("Wifi已连接。");
Serial.print("IP地址:");
Serial.println(ipaddr);
Serial.print("网关:");
Serial.println(gateway);
// NTP
configTime(9 * 3600L, 0, NTP_SERVER);
// ms
struct timeval tv;
int ms = 0;
while(1) {
if (gettimeofday(&tv, NULL) != 0) {
Serial.println("获取时间错误.");
}else{
ms = tv.tv_usec / 1000LL;
}
if(ms == 0) {
ticker.attach_ms(1000, setTicker);
Serial.println("设置ticker");
break;
}
}
}
void send() {
time_t now;
time(&now);
udp.beginPacket(graphite, 2003);
udp.println("sec.esp32.temperature " + String(bme.readTemperature()) + " " + now);
udp.println("sec.esp32.humidity " + String(bme.readHumidity()) + " " + now);
udp.println("sec.esp32.pressure " + String(bme.readPressure() / 100) + " " + now);
udp.endPacket();
}
void loop() {
if(flagTicker) {
send();
flagTicker = false;
}
}
使用的库
使用Grafana制作图表

成功使用ESP32获取BME280的传感器数据,通过Wifi将数据存储到Graphite(go-carbon),并在Grafana中
实现图表化。
由于每秒都会添加数据,因此能够获取非常实时的数据。
功耗也控制在0.5W以下,可以便捷地进行家庭内的数据收集。