当前位置: 首页 > 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.dtcms.com/a/325360.html

相关文章:

  • 【JavaEE】(12) 创建一个 Sring Boot 项目
  • 如何在直播APP中集成美颜SDK?美白滤镜功能开发全流程解析
  • Python笔记之`getattr`和`hasattr`用法详解
  • Vibe Coding 自然语言驱动 AI 编程方式
  • 5G NR NTN 在 PHY 层和 MAC 层实现 OAI
  • 第9节 大模型分布式推理核心挑战与解决方案
  • 代码管理工具——Git基本使用方法
  • 架构设计(15):AI时代的架构设计
  • 系统编程——信号通信
  • MySQL-日志
  • 第10节 大模型分布式推理典型场景实战与架构设计
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的多目标跟踪与行为分析优化(393)
  • 低代码开发实战案例,如何通过表单配置实现数据输入、数据存储和数据展示?
  • Docker-08.Docker基础-本地目录挂载
  • Camera open failed
  • Flutter SharedPreferences存储数据基本使用
  • Apollo平台下相机和激光雷达手眼联合标定
  • 面试题-----RabbitMQ
  • RabbitMQ 消息转换器详解
  • OV5640 相机开发流程
  • 闸机控制系统从设计到实现全解析:第 5 篇:RabbitMQ 消息队列与闸机通信设计
  • C语言:贪吃蛇游戏
  • MiniCPM-V 4.0开源,号称是手机上的GPT-4V
  • 41.【.NET8 实战--孢子记账--从单体到微服务--转向微服务】--扩展功能--集成网关--网关集成Swagger
  • 量子计算:叩响金融定价革命的大门——期权定价的范式转移
  • 用Python实现Excel转PDF并去除Spire.XLS水印
  • glide缓存策略和缓存命中
  • 基于 JavaWeb+MySQL设计实现博客管理系统
  • [激光原理与应用-230]:物理学主要分支、研究对象、衍生技术及职业方向解析
  • 智慧零售的本质重构与技术创新:基于定制开发开源AI智能名片S2B2C商城小程序的实践路径