一开始萌生这个想法,其实是源自我办公桌上的那颗“小胖子”——一块 ESP32 开发板。它陪我度过了不少调试夜,也让我对物联网有了真正的感知。恰逢 KaiwuDB 举办征文活动,我便想着,何不将我日常积攒下来的一些硬件和数据库实战经验结合起来,做一个既能落地,又能完整体现“AIoT + 时序数据库”的项目出来?

于是,这个智能环境监测系统便诞生了。

一切从一块 ESP32 开始

我手里有一块常见的 ESP32-C3,内建 Wi-Fi + BLE,对于小规模的 IoT 应用来说简直是理想选项。而用于监测的传感器,我选的是 DHT22 —— 价格便宜、读取简单,足够应对温湿度的采集需求。当然后续你完全可以扩展成 BME280、SHT31 甚至是多参数的空气质量传感器,这就是系统的可扩展性所在。

而在云端,我选择了 KWDB 2.2.0 作为数据核心。为什么不是 InfluxDB 或 TimescaleDB?因为我对比之后发现,KWDB 在写入吞吐上更胜一筹,尤其适合高频环境监测数据的采集与分析,而且 SQL 查询能力让我轻松做各种聚合、统计与实时告警,何乐而不为。

项目整体架构长什么样?

构建这个系统的时候,我先画了一个草图,后来逐步抽象成了一张完整的结构图,它大概是这样的:

【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战_java

这套结构很清晰地划分了三层:数据采集(ESP32)→ 数据中转(中间件)→ 数据存储&展示(KWDB + 可视化)。也方便我后续对每个部分进行独立优化。

硬件部分:ESP32 与 DHT22 的握手初体验

ESP32 开发板上的 GPIO 多得让人眼花,我最后选了 GPIO 4 接 DHT22 的数据线。整个电路连接其实很简单,用杜邦线就能快速搭好原型。

【KWDB 创作者计划】基于 ESP32 + KWDB 的智能环境监测系统实战_运维_02

我使用的是 Arduino 开发环境,直接引入 DHT.h 库就能读取数据。下面是我的设备端代码部分:

#include "DHT.h"
#include <WiFi.h>
#include <HTTPClient.h>

#define DHTPIN 4
#define DHTTYPE DHT22

const char* ssid = "your_wifi_ssid";
const char* password = "your_wifi_password";
const char* serverUrl = "http://your_server_ip:5000/upload";

DHT dht(DHTPIN, DHTTYPE);

void setup() {
  Serial.begin(115200);
  WiFi.begin(ssid, password);
  dht.begin();

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("WiFi connected");
}

void loop() {
  float temperature = dht.readTemperature();
  float humidity = dht.readHumidity();

  if (isnan(temperature) || isnan(humidity)) {
    Serial.println("Failed to read from DHT sensor!");
    return;
  }

  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin(serverUrl);
    http.addHeader("Content-Type", "application/json");

    String payload = "{\"temperature\": " + String(temperature, 2) +
                     ", \"humidity\": " + String(humidity, 2) + "}";

    int httpResponseCode = http.POST(payload);
    Serial.println("Sent: " + payload);
    Serial.println("Response code: " + String(httpResponseCode));

    http.end();
  }

  delay(60000); // 每分钟上传一次
}
  • 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.

ESP32 直接通过 HTTP 向我的服务器 POST 数据,避免中间复杂协议的折腾,非常适合快速实验与调试。

中间件:Python Flask 架起数据桥梁

我服务器端用的是 Flask 框架,一个 Python 界里的轻量级王者。它负责接收 ESP32 发送来的数据、解析 JSON,然后将其写入 KWDB 中。

当然,要连接 KWDB,我们可以使用 HTTP API,也可以用 KaiwuDB 提供的 Python SDK。如果你喜欢走“原生”风,我推荐用 RESTful 的方式进行写入,速度也不差。

这部分代码如下:

from flask import Flask, request, jsonify
import requests
import time

app = Flask(__name__)

@app.route('/upload', methods=['POST'])
def upload():
    data = request.get_json()
    temperature = data.get('temperature')
    humidity = data.get('humidity')

    payload = {
        "db": "environment",
        "table": "sensor_data",
        "data": [
            {
                "ts": int(time.time() * 1000),  # 毫秒时间戳
                "temperature": temperature,
                "humidity": humidity
            }
        ]
    }

    # 假设你部署在本地
    resp = requests.post("http://localhost:8080/api/put", json=payload)
    return jsonify({"status": "ok", "kwdb_resp": resp.text})

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.