如何用ESP32 Kit与PHP构建智能家居监控系统?

引言:ESP32 Kit与PHP的跨界融合

在物联网(IoT)快速发展的今天,ESP32 Kit凭借其低功耗、双核处理器、内置Wi-Fi和蓝牙功能,成为智能硬件开发的热门选择。然而,硬件设备采集的数据需要后端服务进行处理和存储,PHP作为成熟且广泛使用的服务器端语言,能够高效地实现数据接收、存储和API接口。本文将解决一个具体问题:如何用ESP32 Kit与PHP构建智能家居监控系统?我们将从硬件配置、数据采集、PHP后端设计到前端展示,提供完整的实现方案。

一、ESP32 Kit硬件基础与传感器接入

ESP32 Kit通常包含ESP32-WROOM-32模块、USB转串口芯片、LED指示灯和丰富的GPIO接口。为了构建监控系统,我们需要接入环境传感器,例如DHT11温湿度传感器。接线方式如下:

  • DHT11 VCC → ESP32 3.3V
  • DHT11 GND → ESP32 GND
  • DHT11 DATA → ESP32 GPIO4

在Arduino IDE中编写ESP32代码,需要安装ESP32开发板支持包。示例代码片段:

#include <DHT.h>
#define DHTPIN 4
#define DHTTYPE DHT11
DHT dht(DHTPIN, DHTTYPE);
void setup() {
  Serial.begin(115200);
  dht.begin();
  WiFi.begin("SSID", "PASSWORD");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
  }
}
void loop() {
  float h = dht.readHumidity();
  float t = dht.readTemperature();
  if (isnan(h) || isnan(t)) {
    Serial.println("传感器读取失败");
    return;
  }
  // 发送数据到PHP服务器
  sendToServer(t, h);
  delay(60000); // 每分钟采集一次
}

二、PHP后端API设计与数据接收

PHP后端需要提供一个RESTful API接口,用于接收ESP32发送的JSON格式数据。创建文件api.php

<?php
header('Content-Type: application/json');
$input = json_decode(file_get_contents('php://input'), true);
if (!$input || !isset($input['temperature']) || !isset($input['humidity'])) {
    http_response_code(400);
    echo json_encode(['error' => '无效数据']);
    exit;
}
$temperature = floatval($input['temperature']);
$humidity = floatval($input['humidity']);
$timestamp = date('Y-m-d H:i:s');
// 数据存储逻辑(例如写入MySQL或文件)
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "smart_home";
$conn = new mysqli($servername, $username, $password, $dbname);
if ($conn->connect_error) {
    http_response_code(500);
    echo json_encode(['error' => '数据库连接失败']);
    exit;
}
$sql = "INSERT INTO sensor_data (temperature, humidity, recorded_at) VALUES (?, ?, ?)";
$stmt = $conn->prepare($sql);
$stmt->bind_param("dds", $temperature, $humidity, $timestamp);
if ($stmt->execute()) {
    echo json_encode(['status' => 'success']);
} else {
    http_response_code(500);
    echo json_encode(['error' => '数据插入失败']);
}
$stmt->close();
$conn->close();
?>

数据库表结构:

CREATE TABLE sensor_data (
  id INT AUTO_INCREMENT PRIMARY KEY,
  temperature DECIMAL(5,2) NOT NULL,
  humidity DECIMAL(5,2) NOT NULL,
  recorded_at DATETIME NOT NULL
);

三、ESP32 Kit发送HTTP请求到PHP

在ESP32代码中,我们需要实现sendToServer函数,使用WiFiClientHTTPClient库发送POST请求:

#include <WiFi.h>
#include <HTTPClient.h>
void sendToServer(float temp, float hum) {
  if (WiFi.status() == WL_CONNECTED) {
    HTTPClient http;
    http.begin("http://your-server.com/api.php");
    http.addHeader("Content-Type", "application/json");
    String payload = "{\"temperature\":" + String(temp) + ",\"humidity\":" + String(hum) + "}";
    int httpCode = http.POST(payload);
    if (httpCode > 0) {
      String response = http.getString();
      Serial.println("服务器响应: " + response);
    } else {
      Serial.println("HTTP请求失败");
    }
    http.end();
  } else {
    Serial.println("WiFi未连接");
  }
}

四、数据可视化与前端展示

为了方便用户查看历史数据,我们可以用PHP读取数据库并生成JSON接口,前端使用Chart.js绘制折线图。创建data.php

<?php
$conn = new mysqli("localhost", "root", "", "smart_home");
$result = $conn->query("SELECT temperature, humidity, recorded_at FROM sensor_data ORDER BY recorded_at DESC LIMIT 100");
$data = [];
while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}
echo json_encode($data);
?>

前端HTML页面:

<!DOCTYPE html>
<html>
<head>
    <script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
</head>
<body>
    <canvas id="tempChart"></canvas>
    <script>
        fetch('data.php')
            .then(response => response.json())
            .then(data => {
                const labels = data.map(d => d.recorded_at);
                const temps = data.map(d => d.temperature);
                new Chart(document.getElementById('tempChart'), {
                    type: 'line',
                    data: {
                        labels: labels,
                        datasets: [{ label: '温度 (°C)', data: temps }]
                    }
                });
            });
    </script>
</body>
</html>

五、系统优化与安全性考虑

在实际部署中,需要注意以下几点:

  • 数据验证:PHP端应对接收到的数据进行类型和范围检查,防止恶意注入。
  • 错误处理:ESP32端应实现重试机制,当HTTP请求失败时等待一段时间后重试。
  • 性能优化:使用PDO或MySQLi的预处理语句提高数据库操作效率,并考虑使用Redis缓存高频访问数据。
  • 安全通信:建议使用HTTPS加密传输,避免数据被窃听。
  • 电源管理:ESP32可启用深度睡眠模式,在采集间隙降低功耗。

六、总结与扩展

通过本文的实践,我们成功搭建了一个基于ESP32 Kit与PHP的智能家居监控系统。从硬件接线、传感器数据采集,到PHP后端API接收、数据库存储和前端可视化,每一步都提供了可运行的代码示例。这个架构具有良好的扩展性,可以轻松添加更多传感器(如光照、气压)或控制设备(如继电器开关)。

对于希望深入学习的读者,可以进一步探索:使用MQTT协议替代HTTP实现更高效的通信,或集成微信小程序实现移动端监控。希望本文能为您的物联网项目提供有价值的参考。

上一篇
如何用DHT22和ESP32构建高精度温湿度监测系统?从硬件连接到数据可视化全攻略
下一篇
如何用TTGO ESP32 Camera和Node.js搭建实时监控系统?

评论 (0)

暂无评论,快来抢沙发吧~