在服务器端记录猫猫进食信息,需要建立数据库表。脚本为:
DROP TABLE IF EXISTS `tCat`; CREATE TABLE `tCat` ( `food_water` varchar(10) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NOT NULL COMMENT '过来进食(1)、离开(2)', `start_time` timestamp NOT NULL COMMENT '来就食(离开)时间', `decrements` float(10, 2) NULL DEFAULT NULL COMMENT '当前猫粮量', `unit` varchar(255) CHARACTER SET gb2312 COLLATE gb2312_chinese_ci NULL DEFAULT NULL COMMENT '单位:克', `end_time` timestamp NULL DEFAULT NULL COMMENT '离开时间', PRIMARY KEY (`food_water`, `start_time` DESC) USING BTREE ) ENGINE = InnoDB CHARACTER SET = gb2312 COLLATE = gb2312_chinese_ci ROW_FORMAT = Dynamic;
建立表之后,使用html、php建立测试工具以及后面要用到的追加记录的网页。
一、测试在网页中访问数据库表
代码:
<?php
$servername = "localhost"; // 数据库服务器地址(本地为localhost)
$username = "pi"; // 数据库用户名
$password = "1"; // 数据库密码
$dbname = "db_log"; // 要连接的数据库名
// 创建连接(面向对象风格)
echo "Create Connect...". "<br>";
$conn = new mysqli($servername, $username, $password, $dbname);
// 检查连接是否成??
if ($conn->connect_error) {
die("Connect NG : " . $conn->connect_error. "<br>"); // 连接失败则终止脚本并输出错误
}
echo "Connect OK!". "<br>";
try {
//SQL查询语句
$sql = "SELECT food_water, start_time, decrements, unit, end_time FROM tCat ORDER BY start_time, food_water "; // SQL查询语句
echo("SQL : ".$sql . "<br>");
$result = $conn->query($sql); // 执行查询,返回结果集
if ($result->num_rows > 0) { // 检查是否有结果
echo "记录数=" . $result->num_rows . "<br>"; // 无结果时的提示信息
// 遍历结果集
while ( $row = $result->fetch_assoc() ) {
//echo "Type: " . $row["logType"] . " - Info: " . $row["logInfo"] . " - Date: " . $row["startDT"] . "<br>";
echo "food_water: " . $row["food_water"] . " - start_time: " . $row["start_time"] . " - decrements : " . $row["decrements"] . " - unit : " . $row["unit"] . " - end_time : " . $row["end_time"] . "<br>";
}
} else {
echo "(tCat)Records = 0<br>";
}
} catch (Exception $e) {
// 异常处理逻辑
echo "Exception : " . $e->getMessage(). "<br>";
}
$conn->close();
echo "Close Connect.". "<br>";
?>执行效果:

手动追加一条记录:
INSERT INTO `db_log`.`tCat` (`food_water`, `start_time`, `decrements`, `unit`, `end_time`) VALUES ('1', '2025-12-01 12:00:00', 65.00, 'g', NULL);再次查询:

测试数据库的连接是没有问题的。
二、测试在网页中通过提交form表单的形式追加数据
1、html代码(addrow.html):
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>追加记录</title>
<style>
.div1 {
width: 100%;
background-color: lightblue;
}
</style>
</head>
<body>
<form action="addrow.php" method="POST">
<div>
<label for="food_water">进食/离开</label>
<input type="text" id="food_water" name="food_water" >
<br>
<label for="decrements">猫粮重量(克)</label>
<input type="text" id="decrements" name="decrements" >
<br>
</div>
<div class="div1" id="responseMessage"><p id="tip"></p></div>
<button type="submit">提交</button>
</form>
</body>
</html>页面样式:

处理form表单的代码(addrow.php):
<?php
// 设置字符编码
header('Content-Type: text/html; charset=utf-8');
// 检查请求方法
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
echo 'POST<br>';
// 安全获取表单数据
$food_water = isset($_POST['food_water']) ? trim($_POST['food_water']) : '1';
$decrements = isset($_POST['decrements']) ? trim($_POST['decrements']) : '0';
if ($food_water == '1') {
echo 'food_water=1<br>';
$food_water = '1';
} else {
echo 'food_water=2<br>';
$food_water = '2';
}
echo 'food_water = '.$food_water.'<br>';
echo 'decrements = '.$decrements.'<br>';
// 数据清理(防止XSS攻击)
$food_water = htmlspecialchars($food_water, ENT_QUOTES, 'UTF-8');
$decrements = htmlspecialchars($decrements, ENT_QUOTES, 'UTF-8');
// 处理数据(保存到数据库等)
$servername = "localhost"; // 数据库服务器地址(本地为localhost)
$dbusername = "pi"; // 数据库用户名(如root)
$password = "1"; // 数据库密码
$dbname = "db_log"; // 要连接的数据库名
// 创建连接(面向对象风格)
$conn = new mysqli($servername, $dbusername, $password, $dbname);
// 检查连接是否成功
if ($conn->connect_error) {
die("连接失败: " . $conn->connect_error); // 连接失败则终止脚本并输出错误
$response['success'] = false;
$response['message'] = '连接失败: ' . $conn->connect_error;
} else {
echo "数据库连接成功!<br>";
try {
date_default_timezone_set('Asia/Shanghai');
$current_time = date('Y-m-d H:i:s');
$sql = "INSERT INTO tCat (food_water, start_time, decrements, unit) VALUES ('$food_water', '$current_time', '$decrements', 'g')";
if (mysqli_query($conn, $sql)) {
echo "新记录插入成功<br>";
} else {
echo "错误: " . $sql . "<br>" . mysqli_error($conn);
}
} catch (Exception $e) {
// 异常处理逻辑
echo "插入记录异常: " . $e->getMessage();
}
$conn->close(); // MySQLi面向对象
}
} else {
echo "无效的请求方法<br>";
}
?>测试追加一条记录:

提交后:

此时数据库的记录:

至此,访问指定网页,通过提交表单数据的方式追加记录操作的测试就完成了。
三、在ESP32开发板上使用Arduino编程,向数据库追加记录
关键代码:
// POST数据给服务器
// food_water = 1 : 来吃饭
// food_water = 2 : 吃完离开
void sendFormDataToServer(uint8_t food_water, float decrements) {
HTTPClient http;
// 开始HTTP连接
http.begin(serverURL);
// 设置HTTP头
http.addHeader("Content-Type", "application/x-www-form-urlencoded");
http.addHeader("User-Agent", "ESP32C3-HTTPClient");
// 准备表单数据
// String postData = "field1=" + String(millis()) +
// "&field2=" + String(random(100)) +
// "&field3=" + String(random(1000)) +
// "&sensor_value=" + String(25.5);
String postData = String("food_water=") + String(food_water) + String("&decrements=") + String(decrements);
// 发送POST请求
int httpResponseCode = http.POST(postData);
if (httpResponseCode > 0) {
Serial.print("HTTP响应代码: ");
Serial.println(httpResponseCode);
String response = http.getString();
Serial.print("服务器响应: ");
Serial.println(response);
} else {
Serial.print("错误代码: ");
Serial.println(httpResponseCode);
Serial.print("错误信息: ");
Serial.println(http.errorToString(httpResponseCode));
}
// 释放资源
http.end();
}经过测试,也通过。
这里说明一下,我本来是打算直接使用树莓派5作为控制装置的核心使用的,并且为此花了一些时间在树莓派5 的Ubuntu系统中安装必要的GPIO工具包。但安装完了以后,忽然又觉得不妥。主要是考虑到树莓派5 的价格不低,如果在使用板载的GPIO口的过程中不小心导致短路之类的问题,怕是会烧坏这块板子,所以最后还是决定使用有WIFI功能的小开发板来实际控制共给装置,而树莓派5完全作为WEB服务器、数据库使用。
在选择WIFI开发板时,最初考虑的是ESP8266,但实际使用中发现,ESP8266能提供的安全GPIO口不够用,于是改用合宙的ESP32C3开发板了。
我要赚赏金
