Pet Pot智能“宠物”花盆

隆重推出Pet Pot智能“宠物”花盆 - 不是普通的花盆!
您是否想要一株能够与您交流的植物?嗯,这正是 Pet Pot 的意义所在! Pet Pot 不仅仅是一个普通的花盆;这是一款具有独特个性的智能花盆。
Pet Pot 使用高科技传感器来了解其环境中发生的情况。它关注温度、湿度、土壤湿度、空气质量、紫外线指数和光照强度等数据。你猜怎么着?它通过表情符号表达自己的感受!
想象一下:如果您忘记给植物浇水并且土壤干燥,Pet Pot 可能会显示愤怒或悲伤的表情符号动画。如果房间太热,它会显示一个热表情符号。当灯熄灭时,它会显示出困倦的表情符号。还有很多其他表情符号可供发现,每个表情符号都告诉您有关植物健康状况的不同信息。
但这还不是全部! Pet Pot 不仅显示表情符号,还显示表情符号。它还为您提供有关周围环境的温度、湿度、土壤湿度、空气质量、紫外线指数和光强度的实时信息。这就像在你的花盆里有一个个人气象站。
令人兴奋的部分是:我们又向前迈进了一步。我们创建了一个系统,将所有这些实时数据存储在与 Pet Pot 相同的设备上的 MySQL 数据库中。我们甚至设置了 NodeRed 服务器来创建用户友好的仪表板。这意味着您可以使用手机或笔记本电脑等日常设备访问和分析所有数据。
有了 Pet Pot,您不仅可以拥有健康快乐的植物,还可以为您的家增添有趣的互动元素。这是植物护理的未来,它会让您的生活更加绿色、更加精彩。准备好体验 Pet Pot 的魔力吧!
步骤1 硬件清单
电子产品:
我使用的工具:
步骤2 CAD设计和三d打印


- 
首先,我使用名为Fusion 360的程序来创建 Pet Pot 的设计。我确保仔细查看了我将要使用的电子元件的所有官方数据表和文档。之后,我 3D 打印了 Pet Pot 所需的所有部件。 
- 
您可以查看MyPet Pot Design,如果您想对其进行任何更改,您可以使用 Fusion 360 软件进行更改。 
- 
您还可以在这里找到 STL 文件,即3D打印文件,以便于访问:Pet Pot STL、代码和其他文件 
步骤3 安装支架
- 
现在我们已经准备好 3D 打印零件,下一步是将它们连接在一起。 
- 
拿起 3D 打印的安装支架,将其与 Unihiker 板对齐到所需的位置。使用三个螺钉将支架牢固地固定到板上。  
- 
将每个螺钉穿过支架的孔并插入板上相应的孔中。 
- 
小心拧紧螺钉以确保连接牢固,但注意不要拧得太紧而损坏部件。 








步骤4 添加透明显示屏盖
在此步骤中,我们将通过添加黑色透明玻璃作为主体显示屏的保护罩,为 Pet Pot赋予时尚的外观。我们将使用胶水将其固定到位。
- 
取出黑色透明玻璃,确保其干净,没有任何污迹或碎片。在 Pet Pot 主体显示区域的边缘涂上一层薄而均匀的胶水。注意不要使用过多的胶水,以免溢出。 
- 
轻轻地将黑色透明玻璃放在粘合区域上,确保其与显示屏完美对齐。轻轻按下玻璃以将其固定到位。  
- 
确保它均匀地粘在主体上。按照制造商的说明让胶水干燥。这可能需要一些时间,所以请耐心等待。 
- 
一旦胶水完全干燥,您的宠物盆上的显示屏就会有一个时尚的保护面罩。它不仅增添了时尚的外观,还可以保护显示屏免受污垢和损坏。 



步骤5 土壤湿度传感器防水
在此步骤中,我们将使用热胶连接 3D 打印盖子,确保土壤湿度传感器免受水的影响。



https://files.mdnice.com/user/56048/198b533c-9bb8-49d0-9cd9-a6c3d5ffdef8.png



 
  
 
步骤6 将传感器连接到电路板


现在,让我们将传感器连接到行空板。由于制造商的用户友好型设计,可以使用提供的连接器轻松连接空气质量和环境传感器。按照图进行正确连接。
空气质量和环境传感器(I2C 连接):
使用为这些传感器提供的连接器。按照图示连接它们。
土壤湿度传感器(自定义连接):
如果您使用供货中提供的土壤湿度传感器,则使用提供的连接器即可轻松完成。 
我进行了调整,因为我没有特定的传感器型号,请按照电路图进行修改后的连接。








第7步 将电子设备安装到主体上
在此步骤中,我们将使用螺钉将所有电子元件固定到 Pet Pot 主体上。
- 
将所有电子元件(带有3D打印安装支架的Unihiker板以及其他传感器或模块)放置在主体上的指定位置。 
- 
使用适当的螺钉,将每个电子元件固定到主体上。确保将组件上的安装孔与主体上的安装孔对齐。 
- 
小心拧紧螺钉,确保不要拧得太紧而损坏组件。使用小螺丝刀到达内部位置。 
- 
固定所有组件后,检查以确保它们连接牢固且稳定。轻轻摇动组件以确认没有任何松动。 
- 
通过完成此步骤,您将成功地将所有电子设备牢固地安装到 Pet Pot 的主体上。这可确保组件位于正确的位置,并且作为智能花盆项目的一部分正常运行。 










步骤8 种植你的绿色朋友
- 现在,让我们种植一棵真正的植物并将所有东西组装在一起,让您的宠物盆变得栩栩如生。
为您的宠物盆选择合适的植物,然后小心地将其移植到 3D 打印的盆体中。确保植物盆栽有土壤。
- 
将土壤湿度传感器轻轻插入植物根系附近的土壤中。该传感器将帮助监测湿度水平,以确保您的植物获得适量的水。 
- 
将 3D 打印的盆体(现已包含植物和土壤湿度传感器)放入 Pet Pot 主体中。确保其紧密贴合并正确对齐。 
- 
现在,您的植物坐落在 Pet Pot 中,现在让我们使用一些代码和逻辑使其变得智能。 








步骤9 选择您的智能“宠物”花盆


您可以根据您的编程水平和数据需求,为您的 Pet Pot 选择两个 Python 程序:“SimplePetPot”和“AdvancePetPot”。
SimplePetPot(适合初学者):
该程序是为不深入编程的用户设计的。 
它根据传感器读数在 Pet Pot 的显示屏上显示表情符号,让您轻松了解植物的需求。 
此外,它还直接在显示屏上显示实时传感器数据。
AdvancePetPot(适用于高级用户):
该程序包含 SimplePetPot 的所有功能。 
此外,它还提供 MySQL 数据存储功能,允许您随时间记录和分析传感器数据。 
您还可以设置 NodeRed 仪表板以获得用户友好的界面,以便使用手机或笔记本电脑可视化和管理您的数据。
选择最适合您的需求和专业水平的计划。无论选择哪种方式,您都可以按照自己喜好的方式与 Pet Pot 互动并照顾它们。
步骤10 简易智能“宠物”花盆
要开始使用 Mind+ 软件对 SimplePetPot 进行编码,请按照以下详细步骤操作:
- 
访问 Mind+ 下载页面:https://mindplus.cc/download-en.html 
- 
下载适用于您的计算机操作系统(Windows、macOS、Linux)的 Mind+ 软件并按照安装说明进行操作。 
- 
安装后,启动计算机上的 Mind+ 软件。 
- 
确保您在 Mind+ 软件中选择了与您的 Pet Pot 项目所使用的硬件相匹配的适当开发板或微控制器。 
- 
转到 Mind+ 中的“扩展”菜单。 
- 
从可用的扩展中选择“Unihiker”。 
确保您的行空板开发板已使用 90 度 Type-C 电缆连接到计算机。






寻找连接到行空板的选项,通常显示为“@10.1.2.3”。




连接到行空板后,打开存储 SimplePetPot 代码的目录。它应该位于您下载的文件夹中,可能名为“SimplePetPot”。
将下载的 zip 文件中的整个“SimplePetPot”文件夹拖放到 Mind+ 软件中的适当位置。




在 Mind+ 中,找到并打开“SimplePetPot”文件夹中的“PetPot.py”代码文件。在 Mind+ 环境中运行代码。




如果您在运行代码时遇到任何错误或缺少库,您可以从Mind+库管理中下载并安装所需的库。
遵循这些步骤将允许您使用 Mind+ 软件编码和运行 SimplePetPot,为您的 Pet Pot 项目创建一个用户友好的界面。
步骤11 高级智能“宠物”花盆
- 按照上述相同说明设置 Mind+ 软件。
- 将 AdvancePetPot 文件夹拖放到行空板目录中。
- 请按照本教程为行空板设置 SSH。
- 设置 SSH 后,请按照以下步骤操作。
- 将行空板连接到家庭 WiFi:
- 按照行空板教程将行空板连接到您的家庭 WiFi。
 


安装 Node-Red:
#使用以下命令安装 Node-Red:
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered)
#使用以下命令启动 Node-Red:
node-red-start
#安装 Node-Red 后,您可以通过打开 Web 浏览器并输入以下 URL 来启动它:
Once Node-Red is installed, you can start it by opening a web browser and entering the following URL:
安装MySQL:
#运行以下命令
apt-get update
#在unihiker上安装MySQL服务器
sudo apt install mariadb-server
#检查并启动MySQL终端
sudo systemctl status mariadb
#创建MySQL用户和密码
username-u password-p
#授予用户远程访问权限
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'your_password' WITH GRANT OPTION;
#授予用户本地访问权限
Grant user local access permissions
FLUSH PRIVILEGES;
EXIT;
#安装 MySQL python 模块
pip install mysql-connector-python
下载并安装MySQL Workbench软件并使用用户名和密码连接到行空板MySQL服务器。
运行以下查询来创建数据库的架构、表、列。






CREATE DATABASE unihiker; -- Create the database
USE unihiker; -- Select the database
CREATE TABLE SensorData (
    ID INT AUTO_INCREMENT PRIMARY KEY,
    DateTime DATETIME NOT NULL,
    Temperature DECIMAL(5, 2),
    Humidity DECIMAL(5, 2),
    SoilMoisture DECIMAL(5, 2),
    AirQuality DECIMAL(5, 2),
    UVIndex DECIMAL(5, 2),
    LightIndex BIGINT -- Modify this line to use BIGINT
);
现在设置 NodeRed 流程:
以我的简单例子作为参考


        [
    {
        "id": "aacc106faf98de60",
        "type": "tab",
        "label": "Flow 1",
        "disabled": false,
        "info": "",
        "env": []
    },
    {
        "id": "d453abaa9eb10f4c",
        "type": "mysql",
        "z": "aacc106faf98de60",
        "mydb": "3abdbb72c33a6b69",
        "name": "LocalDB",
        "x": 460,
        "y": 540,
        "wires": [
            [
                "960879a0ca162189",
                "fb2a7cea7a74674c"
            ]
        ]
    },
    {
        "id": "960879a0ca162189",
        "type": "debug",
        "z": "aacc106faf98de60",
        "name": "debug 1",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 680,
        "y": 520,
        "wires": []
    },
    {
        "id": "c48a950e9a14216f",
        "type": "inject",
        "z": "aacc106faf98de60",
        "name": "",
        "props": [
            {
                "p": "topic",
                "vt": "str"
            }
        ],
        "repeat": "300",
        "crontab": "",
        "once": true,
        "onceDelay": 0.1,
        "topic": "SELECT * FROM SensorData WHERE DATE(DateTime) = CURDATE();",
        "x": 210,
        "y": 540,
        "wires": [
            [
                "d453abaa9eb10f4c"
            ]
        ],
        "info": "{\r\n    \"id\": \"d8ed62266b22607d\",\r\n    \"type\": \"inject\",\r\n    \"z\": \"aacc106faf98de60\",\r\n    \"name\": \"\",\r\n    \"props\": [\r\n        {\r\n            \"p\": \"payload\"\r\n        },\r\n        {\r\n            \"p\": \"topic\",\r\n            \"vt\": \"str\"\r\n        }\r\n    ],\r\n    \"repeat\": \"\",\r\n    \"crontab\": \"\",\r\n    \"once\": \"false\",\r\n    \"onceDelay\": \"0.1\",\r\n    \"topic\": \"SELECT * FROM SensorData WHERE DATE(DateTime) = CURDATE();\",\r\n    \"payload\": \"\",\r\n    \"payloadType\": \"date\",\r\n    \"x\": 180,\r\n    \"y\": 360,\r\n    \"wires\": [\r\n        [\r\n            \"21b9594edb0307ce\"\r\n        ]\r\n    ]\r\n}\r\n"
    },
    {
        "id": "fb2a7cea7a74674c",
        "type": "function",
        "z": "aacc106faf98de60",
        "name": "function 1",
        "func": "var result = msg.payload;\n\n// Prepare data arrays for each parameter\nvar temperatureData = [];\nvar humidityData = [];\nvar soilMoistureData = [];\nvar airQualityData = [];\nvar uvIndexData = [];\nvar lightIndexData = [];\n\nfor (var i = 0; i < result.length; i++) {\n    var row = result[i];\n    var dataPoint = {\n        x: row.DateTime, // Assuming DateTime is the x-axis value\n        y: row.Temperature // Change this to the desired y-axis value\n    };\n    temperatureData.push(dataPoint);\n\n    dataPoint = {\n        x: row.DateTime,\n        y: row.Humidity\n    };\n    humidityData.push(dataPoint);\n\n    dataPoint = {\n        x: row.DateTime,\n        y: row.SoilMoisture\n    };\n    soilMoistureData.push(dataPoint);\n\n    dataPoint = {\n        x: row.DateTime,\n        y: row.AirQuality\n    };\n    airQualityData.push(dataPoint);\n\n    dataPoint = {\n        x: row.DateTime,\n        y: row.UVIndex\n    };\n    uvIndexData.push(dataPoint);\n\n    dataPoint = {\n        x: row.DateTime,\n        y: row.LightIndex\n    };\n    lightIndexData.push(dataPoint);\n}\n\n// Prepare the chart data for each parameter\nmsg.payload = [\n    {\n        series: [\"Temperature\"],\n        data: [temperatureData]\n    },\n    {\n        series: [\"Humidity\"],\n        data: [humidityData]\n    },\n    {\n        series: [\"Soil Moisture\"],\n        data: [soilMoistureData]\n    },\n    {\n        series: [\"Air Quality\"],\n        data: [airQualityData]\n    },\n    {\n        series: [\"UV Index\"],\n        data: [uvIndexData]\n    },\n    {\n        series: [\"Light Index\"],\n        data: [lightIndexData]\n    }\n];\n\nreturn msg;\n",
        "outputs": 1,
        "noerr": 0,
        "initialize": "",
        "finalize": "",
        "libs": [],
        "x": 680,
        "y": 560,
        "wires": [
            [
                "5aad53cea1da48b0",
                "5e7142074dbb81f7"
            ]
        ]
    },
    {
        "id": "5aad53cea1da48b0",
        "type": "ui_chart",
        "z": "aacc106faf98de60",
        "name": "Todays Data",
        "group": "f1f3f08af11de6bf",
        "order": 0,
        "width": 0,
        "height": 0,
        "label": "Pet-Pot",
        "chartType": "line",
        "legend": "true",
        "xformat": "dd HH:mm",
        "interpolate": "cubic",
        "nodata": "No Data",
        "dot": false,
        "ymin": "",
        "ymax": "",
        "removeOlder": 1,
        "removeOlderPoints": "",
        "removeOlderUnit": "86400",
        "cutout": 0,
        "useOneColor": false,
        "useUTC": false,
        "colors": [
            "#1f77b4",
            "#aec7e8",
            "#ff7f0e",
            "#2ca02c",
            "#98df8a",
            "#d62728",
            "#ff9896",
            "#9467bd",
            "#c5b0d5"
        ],
        "outputs": 1,
        "useDifferentColor": false,
        "className": "",
        "x": 870,
        "y": 560,
        "wires": [
            []
        ]
    },
    {
        "id": "5e7142074dbb81f7",
        "type": "debug",
        "z": "aacc106faf98de60",
        "name": "debug 2",
        "active": false,
        "tosidebar": true,
        "console": false,
        "tostatus": false,
        "complete": "false",
        "statusVal": "",
        "statusType": "auto",
        "x": 940,
        "y": 420,
        "wires": []
    },
    {
        "id": "3abdbb72c33a6b69",
        "type": "MySQLdatabase",
        "name": "LocalDB",
        "host": "localhost",
        "port": "3306",
        "db": "unihiker",
        "tz": "IST",
        "charset": "UTF8"
    },
    {
        "id": "f1f3f08af11de6bf",
        "type": "ui_group",
        "name": "Default",
        "tab": "16fae9a9b6ae5482",
        "order": 1,
        "disp": false,
        "width": "18",
        "collapse": false,
        "className": ""
    },
    {
        "id": "16fae9a9b6ae5482",
        "type": "ui_tab",
        "name": "Home",
        "icon": "dashboard",
        "disabled": false,
        "hidden": false
    }
]

 [i]
[i]
在这一步你可能会遇到一些挑战,你必须调试问题,使用互联网,询问人工智能。 
一旦一切都连接起来,您就可以在指尖记录和可视化数据。
步骤12 结论







 [i]
[i]
Pet Pot 不仅仅是一个花盆;这是一个活生生的、会呼吸的生态系统。它证明了人类的聪明才智和在数字时代培育自然世界的愿望。
如果您发现这个项目令人愉快且鼓舞人心,请考虑点赞并在评论中分享您的想法。您的反馈对我来说是很大的动力源泉。如果您自己承担了这个项目,请随时在下面的“我做的”部分中分享您自己的版本。谢谢您,我期待未来与您分享更多精彩的项目![i]#### 原作者:Mukesh Sankhl
[i]#### 发布时间:2023年9月6日
[i]#### 原文链接:https://community.dfrobot.com/makelog-313489.html
[i]