当前位置: 首页 > news >正文

ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库

数据流向

- ESP32 采集温湿度数据后,通过 HTTP POST 请求将数据发送到服务器上的 PHP 文件

- PHP 文件save_data_improved.php接收数据并将其插入到 MySQL 数据库(esp32_data)的 sensor_data表中

- 可以通过 phpMyAdmin 查看和管理数据库中的 sensor_data 表数据

文件准备

PHP与MySQL交互
在这里插入图片描述

ino(esp32程序文件)
在这里插入图片描述

ESP32将DHT11温湿度传感器采集的数据上传到XAMPP的MySQL数据库

先打开XAMPP

请添加图片描述

服务器端配置

1. 使用phpMyAdmin(查看MySQL)

phpMyAdmin是一个流行的Web界面工具,用于管理MySQL数据库。它通常随XAMPP一起安装。

  • 打开浏览器,输入 http://localhost/phpmyadminhttp://127.0.0.1/phpmyadmin

  • 输入你的MySQL用户名和密码(默认情况下,XAMPP的MySQL用户名是root,没有密码)。

  • 登录后,你可以看到所有的数据库和表,并进行各种操作。

    在XAMPP中,网站的根目录通常是 htdocs 文件夹。在你的例子中,你已经在 htdocs 目录下创建了一个名为 esp32_data 的文件夹,并在其中创建了一个 save_data_improved.php 文件。

    这是一个很好的做法,因为它可以帮助你组织和管理你的项目文件。当你在浏览器的地址栏中输入 http://localhost/esp32_data/save_data_improved.php 时,Apache 服务器会加载并执行这个 PHP 文件

  1. 创建MySQL数据库

    在 XAMPP 环境下,MySQL 的数据库文件默认存储在 D:\XAMPP\mysql\data 目录下。当你创建一个名为 esp32_data 的数据库时,MySQL 会在该目录下自动创建一个同名的文件夹(即 esp32_data),用于存放该数据库的所有表文件。

    • 在MySQL中创建一个数据库,例如esp32_data

    • 创建一个表用于存储温湿度数据:

           CREATE TABLE sensor_data (id INT AUTO_INCREMENT PRIMARY KEY,temperature FLOAT,humidity FLOAT,timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP);
      

在这里插入图片描述

D:\XAMPP\mysql\data 目录下看到 esp32_data 文件夹

在这里插入图片描述

2. 自定义PHP脚本

你也可以编写自己的PHP脚本来连接MySQL数据库,并在浏览器中显示数据。(save_data_improved.php)

步骤:
  1. 创建PHP文件

    • 在XAMPP的htdocs文件夹中创建一个新的PHP文件。

在这里插入图片描述

  1. 编写PHP代码

    <?php
    // 数据库配置
    $servername = "localhost";
    $username = "root";
    $password = "";
    $dbname = "esp32_data";// 设置JSON响应头
    header('Content-Type: application/json');// 创建数据库连接
    $conn = new mysqli($servername, $username, $password, $dbname);// 检查连接
    if ($conn->connect_error) {// 记录错误日志(实际应用中)// error_log("数据库连接失败: " . $conn->connect_error);die(json_encode(array('status' => 'error', 'message' => '数据库连接失败: ' . $conn->connect_error)));
    }// 检查是否接收到POST数据
    if ($_SERVER['REQUEST_METHOD'] === 'POST') {// 检查温度和湿度参数是否存在if (isset($_POST['temperature']) && isset($_POST['humidity'])) {// 验证是否为有效数字if (is_numeric($_POST['temperature']) && is_numeric($_POST['humidity'])) {$temperature = floatval($_POST['temperature']);$humidity = floatval($_POST['humidity']);// 验证数据范围if ($temperature >= -50 && $temperature <= 150 && $humidity >= 0 && $humidity <= 100) {// 准备参数化查询$stmt = $conn->prepare("INSERT INTO sensor_data (temperature, humidity, timestamp) VALUES (?, ?, CURRENT_TIMESTAMP)");if (!$stmt) {echo json_encode(array('status' => 'error', 'message' => '预处理语句失败: ' . $conn->error));$conn->close();exit;}// 绑定参数$stmt->bind_param("dd", $temperature, $humidity); // 'dd'表示两个double类型参数// 执行查询if ($stmt->execute() === TRUE) {echo json_encode(array('status' => 'success', 'message' => '新记录插入成功', 'data' => array('temperature' => $temperature, 'humidity' => $humidity)));} else {echo json_encode(array('status' => 'error', 'message' => '插入记录失败: ' . $stmt->error));}$stmt->close();} else {echo json_encode(array('status' => 'error', 'message' => '数据超出合理范围: 温度应在-50到150之间,湿度应在0到100之间'));}} else {echo json_encode(array('status' => 'error', 'message' => '温度和湿度必须是数字'));}} else {echo json_encode(array('status' => 'error', 'message' => '缺少必要的POST参数: temperature或humidity'));}
    } else {echo json_encode(array('status' => 'error', 'message' => '请使用POST方法发送数据'));
    }// 关闭连接
    $conn->close();
  2. 保存并测试

    • 保存文件后,打开浏览器,输入 http://localhost/esp32_data/save_data_improved.php (这个是php调试内容打印)

在这里插入图片描述

编写Arduino代码

将DHT11温湿度传感器采集的数据上传到MySQL数据库。以下是具体实现步骤:

一、硬件连接

  1. DHT11传感器连接
    • DHT11的VCC引脚连接到ESP32的3.3V引脚。
    • DHT11的GND引脚连接到ESP32的GND引脚。
    • DHT11的DATA引脚连接到ESP32的数字引脚(例如GPIO4)。

二、安装必要的库

在Arduino IDE中,需要安装以下库:
在这里插入图片描述

  1. DHT sensor library

    • 打开Arduino IDE,点击“工具” > “管理库”,搜索并安装“DHT sensor library”。
  2. WiFi.h

    • ESP32自带的库,无需额外安装。
  3. HTTPClient.h

    • ESP32自带的库,用于发送HTTP请求。

三、编写代码

以下是完整的代码示例,用于读取DHT11温湿度数据并通过HTTP POST请求上传到服务器:

#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>// WiFi配置
const char* ssid = "******";     // 替换为你的WiFi名称
const char* password = "*****";     // 替换为你的WiFi密码
const char* serverUrl = "http://192.168.2.232/esp32_data/save_data_improved.php"; // 本地XAMPP服务器地址 (使用改进版PHP文件)// DHT传感器配置
#define DHTPIN 4          // DHT11传感器连接到GPIO4
#define DHTTYPE DHT11     // 使用DHT11传感器
DHT dht(DHTPIN, DHTTYPE);void setup() {Serial.begin(115200);dht.begin();// 连接WiFiWiFi.begin(ssid, password);unsigned long startTime = millis();int connectionTimeout = 10000; // 10秒超时while (WiFi.status() != WL_CONNECTED) {if (millis() - startTime > connectionTimeout) {Serial.println("WiFi连接超时!");return;}delay(500);Serial.print(".");}Serial.println("WiFi连接成功");Serial.print("IP地址: ");Serial.println(WiFi.localIP());
}void loop() {// 读取传感器数据float humidity = dht.readHumidity();float temperature = dht.readTemperature();// 检查传感器读取是否成功if (isnan(humidity) || isnan(temperature)) {Serial.println("无法读取传感器数据!");delay(2000);return;}// 打印传感器数据Serial.print("湿度: ");Serial.print(humidity);Serial.println("%");Serial.print("温度: ");Serial.print(temperature);Serial.println("°C");// 发送数据到服务器if (WiFi.status() == WL_CONNECTED) {HTTPClient http;int maxRetries = 3;int retryCount = 0;int httpResponseCode = 0;while (retryCount < maxRetries) {Serial.print("尝试连接到服务器: ");Serial.println(serverUrl);if (http.begin(serverUrl)) {Serial.println("HTTP连接初始化成功");// 确保正确设置Content-Type头http.addHeader("Content-Type", "application/x-www-form-urlencoded");Serial.println("Content-Type头已设置");// 构造POST请求的数据// 注意:不要对=和&字符进行编码,它们是URL参数的必要分隔符String postData = "temperature=" + String(temperature) + "&humidity=" + String(humidity);// 只对空格和+号进行编码postData.replace(" ", "%20");postData.replace("+", "%2B");Serial.print("发送的POST数据: ");Serial.println(postData);Serial.print("数据长度: ");Serial.println(postData.length());httpResponseCode = http.POST(postData);Serial.print("发送POST请求后,响应代码: ");Serial.println(httpResponseCode);if (httpResponseCode > 0) {Serial.print("HTTP响应代码: ");Serial.println(httpResponseCode);if (httpResponseCode == HTTP_CODE_OK) {Serial.println("数据发送成功!");// 输出服务器响应内容String response = http.getString();Serial.print("服务器响应: ");Serial.println(response);} else {Serial.print("服务器返回非200响应: ");Serial.println(httpResponseCode);}break; // 成功,退出重试循环} else {Serial.print("请求失败,错误代码: ");Serial.println(http.errorToString(httpResponseCode).c_str());retryCount++;if (retryCount < maxRetries) {Serial.print("正在重试 (" + String(retryCount) + "/" + String(maxRetries) + ")...");delay(2000); // 等待2秒后重试}}http.end();} else {Serial.println("无法连接到服务器");retryCount++;if (retryCount < maxRetries) {Serial.print("正在重试 (" + String(retryCount) + "/" + String(maxRetries) + ")...");delay(2000); // 等待2秒后重试}}}if (retryCount >= maxRetries) {Serial.println("超过最大重试次数,请求失败");}} else {Serial.println("WiFi未连接,无法发送数据");}delay(60000); // 每1分钟发送一次数据
}

四、代码说明

  1. 初始化 ESP32 开发板
  2. 连接到指定的 WiFi 网络
  3. 读取 DHT11 传感器的温湿度数据
  4. 将采集到的数据通过 HTTP POST 请求发送到本地 XAMPP 服务器
  5. 每 1 分钟发送一次数据
  6. 包含连接重试机制和错误处理

五、注意事项

  1. Wi-Fi设置

    • 确保ESP32连接的Wi-Fi网络与服务器在同一局域网内,或者服务器有公网IP地址。
  2. 服务器地址

    • 如果服务器在本地运行,可以使用"http://192.168.2.232/esp32_data/save_data_improved.php";如果服务器在其他设备上,需替换为对应的IP地址或域名。(因为服务器在电脑本地,esp32和电脑连在同一个局域网,不能使用localhost,要用电脑的IP地址)

在这里插入图片描述

  1. 安全性

    • 在生产环境中,建议使用HTTPS加密通信,避免数据传输被窃听。
  2. 调试

    • 通过串口监视器查看ESP32的输出日志,确保数据读取和发送正常。

在这里插入图片描述


六、总结

通过以上步骤,你可以实现ESP32通过Arduino程序读取DHT11温湿度数据,并将其上传到MySQL数据库。如果遇到问题,可以检查硬件连接、Wi-Fi设置或服务器端代码。

在这里插入图片描述

要删除表中的所有行,可以使用以下SQL语句:

DELETE FROM sensor_data;

这条命令会删除sensor_data表中的所有数据,但不会删除表本身。如果你确实希望执行这个操作,请确保已经备份了重要数据,并且理解此操作的后果。

注意事项

  • 确保你的MySQL服务正在运行。你可以通过XAMPP控制面板启动或停止MySQL服务。
  • 根据你的实际数据库和表结构调整PHP代码中的变量和SQL查询。
  • 为了安全起见,避免在公共网络上使用默认的用户名和密码。最好为你的MySQL用户设置强密码。
    通过以上方法,你可以在浏览器中管理和访问MySQL数据库。
http://www.lryc.cn/news/617693.html

相关文章:

  • loading效果实现原理
  • 【JAVA】使用系统音频设置播放音频
  • 在线代码比对工具
  • Selenium元素定位不到原因以及怎么办?
  • 机器学习 TF-IDF提取关键词,从原理到实践的文本特征提取利器​
  • Effective C++ 条款36: 绝不重新定义继承而来的非虚函数
  • Excel 连接阿里云 RDS MySQL
  • 开闭原则代码示例
  • Pytest项目_day11(fixture、conftest)
  • js数组reduce高阶应用
  • B 树与 B + 树解析与实现
  • 可商用的 AI 图片生成工具推荐(2025 最新整理)
  • Kubernetes部署apisix的理论与最佳实践(一)
  • 专题:2025人形机器人与服务机器人技术及市场报告|附130+份报告PDF汇总下载
  • docker安装Engine stopped
  • 内置redis使用方法
  • Python 高阶函数:filter、map、reduce 详解
  • 【软考架构】主流数据持久化技术框架
  • Spring Boot Excel数据导入数据库实现详解
  • 6s081实验1
  • 机器翻译:一文掌握序列到序列(Seq2Seq)模型(包括手写Seq2Seq模型)
  • 机器学习TF-IDF算法详解
  • GPT-oss:OpenAI再次开源新模型,技术报告解读
  • 视频播放器哪个好用?视频播放器PotPlayer,KMP Player
  • FPGA学习笔记——DS18B20(数字温度传感器)
  • Mysql系列--6、内置函数
  • C++的结构体传参
  • 深度学习与遥感入门(五)|GAT 构图消融 + 分块全图预测:更稳更快的高光谱图分类(PyTorch Geometric 实战)
  • rust编译过程的中间表现形式如何查看,ast,hir,mir
  • Rust 实战五 | 配置 Tauri 应用图标及解决 exe 被识别为威胁的问题