这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 开源硬件 » 【RaspberryPi5开发板方案创意赛】猫粮自动供给装置-过程贴

共1条 1/1 1 跳转至

【RaspberryPi5开发板方案创意赛】猫粮自动供给装置-过程贴

专家
2025-12-09 12:27:07     打赏

在服务器端记录猫猫进食信息,需要建立数据库表。脚本为:


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>";  
?>

执行效果:

图片1.png

手动追加一条记录:

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);

再次查询:

图片2.png

测试数据库的连接是没有问题的。

二、测试在网页中通过提交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>

页面样式:

图片3.png

处理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>";
}
?>

测试追加一条记录:

图片4.png


提交后:

图片5.png

此时数据库的记录:

图片6.png

至此,访问指定网页,通过提交表单数据的方式追加记录操作的测试就完成了。

三、在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开发板了。










关键词: RaspberryPi5     创意赛    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]