当前位置:首页 > 工业控制 > 电路设计项目集锦
[导读]即使植物主人希望主动预防,所需信息也通常分散在多个独立的应用程序、网络搜索、图片库、日历和手动土壤检查中。没有清晰的植物健康状况图景,植物养护很快就会变成负担。

挑战:缺乏数据时如何照料室内植物

人们很容易忘记照顾室内植物,更难理解该如何让它们茁壮成长。

照料植物常常意味着在问题出现后才采取行动:

•叶片发黄

•茎秆垂落

•土壤干燥

•错过浇水日

即使植物主人希望主动预防,所需信息也通常分散在多个独立的应用程序、网络搜索、图片库、日历和手动土壤检查中。没有清晰的植物健康状况图景,植物养护很快就会变成负担。

解决方案:专为您的花园打造的现代Java 26伴侣

杜克花园是一款基于Java 26开发的现代化植物护理助手(包含网站和定制嵌入式设备),将您所有关于室内植物的信息整合到一个统一的仪表盘中。

该Web应用采用Java 26构建,可帮助植物主人:

• 组织植物档案

• 利用AI从照片中识别植物种类及可能的病害

• 接收个性化的人工智能辅助指导

•持续记录植物养护情况。

•使用设备自动检测并记录浇水状态。

无需依赖零散的提醒、搜索和猜测,每株植物在家中都有专属的养护位置、环境信息和操作记录。

Duke’s Garden 概览

创建并维护独立的植物档案

获取植物详细信息及AI生成的养护建议

通过历史记录(后台自动更新)追踪植物自购买以来的成长历程(包括浇水时间、是否患病等)

向AI植物助手提问关于选定植物的问题

使用AI驱动的“病害医生”诊断植物可见问题

通过AI智能养护日历,查看下次浇水或施肥的时间

连接基于树莓派的Duke’s Garden设备,自动将植物浇水信息同步至仪表板

为什么选择Java 26?

DukesGarden在Web应用和树莓派嵌入式设备上均采用并验证了Java 26。Java 26 提供了现代、强类型化的最佳框架,用于构建一个全面的互联花园解决方案。用户可获得交互性强的网页界面、高安全性的后端系统、持久化的植物数据、基于 Spring AI 的植物养护助手,以及位于植物花盆旁的物理设备。

Java 26 语言被用于实现后端的 Spring Boot 应用程序和前端的 Vaadin 界面。

此外,这是我首次在嵌入式设备(树莓派)上运行 Java 26 的最新版本。整个过程得益于出色的文档支持,实现了极为顺畅的开发体验。

Java 用于开发树莓派设备的嵌入式软件,其中使用 Pi4J 库通过 GPIO 读取土壤湿度信息。

随后,Java 26 标准库中的 HTTP 客户端向网站后端的 Spring Boot REST 控制器发送 HTTP 请求,以提供收集到的浇水事件数据。

通过在云端连接的应用程序与树莓派嵌入式工作流中运行跨平台的 Java 26,Duke’s Garden 实现了高度整合且实用的功能。Java 26 JVM 在虚拟机有限的内存占用和树莓派较慢的处理能力下表现优异。

建筑

生态系统由四个部分组成:

1. 花园设备是一个连接到电阻式土壤湿度探头和LM393比较器模块的树莓派。该比较器向树莓派提供一个阈值化的数字湿/干信号。

2. DukesGarden 应用是一个基于 Java 26 Spring Boot 和 Vaadin Flow 开发的应用程序,它为网站提供了植物养护仪表盘、病害医生、植物助手以及所有其他功能。

3. MySQL 用于存储植物、花园设备的分配信息以及 PlantEvent 历史记录。Cloudinary 将植物照片存储在数据库之外。

4. 仪表盘是园艺师管理植物、植物养护以及连接的花园设备的地方。

基于图像分类AI的植物识别设计

1. 园丁用手机拍下自己植物的照片。

2. 他们打开了公爵花园的网站

3. 在“我的植物”视图中创建新植物

4. 将新植物的头像从占位符上传到他们点击的照片中

5. 按下识别植物按钮

6. PlantDetailView 将临时图像文件传递给后端 Java 应用程序中的 PlantNetService 封装器。

7. PlantNetService 向外部第三方 Pl@ntNet 识别 API 发送一个多部分请求,API 回应最佳物种候选及其置信度值。

8. 杜克花园的后端实现会选取置信度最高的物种并显示出来。如果园丁发现名称有误,可以自行修改物种名称。

9. 所选结果将更新植物资料,并记录在历史中,而植物照片则仍可通过 Cloudinary 保留。

植物管理与历史设计

1. 园丁打开“我的植物”,然后选择“添加植物”。

2. Vaadin Flow 显示一个植物信息表单,包含昵称、物种、养护详情、备注以及可选的照片。

3. PlantDetailView 将植物资料保存到 MySQL 数据库中。植物图片通过第三方 Cloudinary 图片数据库单独处理,使媒体文件不与关系型记录关联。

注意:Cloudinary 是一个基于云的第三方媒体管理服务,可安全地存储、优化并提供上传的图片,通过安全的 URL 进行访问。它将植物图片文件保留在 MySQL 数据库之外,同时允许应用程序在需要时引用和显示这些图片。更多详情请参见:https://cloudinary.com/

4. (示例操作)在“护理”选项卡中,园丁可以记录“标记浇水”或“标记施肥”。

5. DukesGarden 更新相关护理日期,并将植物事件写入 MySQL。该事件与植物关联,包含操作类型、日期、标题和详细信息。

6. “历史”标签页按逆时序显示这些记录,为园艺师提供一条时间线,便于追踪浇水、施肥、换盆、病害诊断等事件。

GenAI植物助手设计

1. 园丁选择一种植物,并在AI植物助手上提出一个问题,例如:“我应该多久换一次盆?”

2. Vaadin Flow UI 将问题发送到后端服务器。

3. 服务器会根据园艺师的问题和上下文,生成一个针对特定植物的提示:

•植物名称

•物种

•浇水间隔

•养护日历日期

•笔记

MySQL中的植物历史时间线

4. Spring AI 通过第三方 OpenAI 聊天服务提供商的 API 调用发送针对植物的提示。

注意:聊天记忆会保留与会话 ID 相关联的对话内容,因此后续问题仍能保持上下文。

5. 园艺师会根据所选植物的保存记录和养护历史提供个性化建议,而非泛泛而谈、脱离具体情境的答案。

基于生成式AI与图像分类AI的疾病诊断医生设计

1. 园丁选择一种植物,并在“病害医生”中上传一到五张照片。

2. DiseaseDoctorView 将照片发送到服务器进行分析。

3. 图像分类:在服务器上,PlantNetService 将照片作为多部分的病害识别请求提交给第三方 Pl@ntNet API。该服务返回排序后的候选结果:病害名称和置信度信息,并将这些信息传递给 DiseaseContentService。

4. Gen-AI:DiseaseContentService 使用检测到的疾病名称,向第三方 OpenAI 聊天 API(Spring AI)请求诊断报告,该报告包含:

•可读描述

•症状

•治疗指南

疾病视觉相似实例的图片

5. DukesGarden 会将所选植物的疾病记录及治疗建议保存在历史中,以便园艺师能够将其与其他养护活动一同查看。

基于生成式AI的养护日历设计

1. 园丁从Vaadin Flow UI中打开护理日历。

2. CareCalendarView 从 MySQL 加载所有已保存的植物。

3. 对于每种植物,DukesGarden 会根据上次浇水时间加上浇水间隔来计算下次浇水日期,以及上次施肥时间加上30天来计算下次施肥日期。

注意:如果某种植物尚未设置浇水间隔,Spring AI 动态物种内容服务将提供该间隔,并将其保存在植物配置文件中,以便后续日历计算使用。

生成式AI:Spring AI 通过第三方 OpenAI 模型 API 进行浇水间隔的计算。上下文信息来自 Perenual API,该 API 提供了包括浇水频率在内的多种植物物种的详细养护数据。

5. 计划护理条目被传递给 FullCalendar 的内存条目提供程序,并在月度视图中显示。浇水和施肥使用不同的颜色标识。

6. 当园丁完成养护后,DukesGarden 会更新养护日期并保存相应的历史记录事件。下次访问时,日历将使用这些更新后的日期来计算下一项任务。

智能设备浇水设计

1. 园丁启动了公爵花园设备。该设备会自动连接到服务器端点,并通过其设备ID进行配对。激活后,设备将返回一个API密钥;服务器仅存储该密钥的BCrypt哈希值。

2. 在网站的设备视图中,园丁将配对的设备分配给某株植物。这便是将物理传感器连接到植物配置文件的过程。

3. 电阻探头检测土壤,LM393比较器模块将选定的阈值转换为数字信号。树莓派通过GPIO 17读取该信号。

4. 如果植物被浇水(传感器状态从干变湿),Pi 将向 POST /devices/event 发送一个安全的 JSON 请求。该请求仅包含其 ID 和 apiKey。

5. DeviceController 验证 API 密钥,加载该设备所关联的工厂,并更新工厂的日期。同时,它还会将一次浇水事件添加到 MySQL 数据库中。

6. 园丁可以看到已更新的浇水状态以及指定植物历史中的新事件。植物养护事件(如浇水)现在将由Duke's Garden设备自动添加到Duke's Garden网站。

Oracle云基础设施部署说明

Duke's Garden作为单体Java 26 Web应用程序(前端+后端),部署在Oracle云基础设施(OCI)上的Ubuntu虚拟机(VM)上。MySQL数据库运行在OCI的MySQL HeatWave上。

1. 在 Oracle Cloud 上创建账户。

2. 创建具有互联网连接的虚拟云网络(VCN)

3. 在 VCN 中创建(如果尚未存在)私有子网和公共子网。

注意:公共子网将包含虚拟机,并允许互联网流量从该子网访问网站。私有子网包含数据库,仅允许 VCN 内的资源(包括我们的虚拟机)与 MySQL 数据库进行交互。

4. 创建一个 Ubuntu 网络服务器实例。可以使用像 VM.Standard.E2.1.Micro 这样小型且永久免费的机器。在虚拟机上安装 Java 26。

注意:创建实例时,请确保其使用步骤 2 中创建的 VCN 的公共子网,并为其分配一个公共 IPv4 地址。同时,务必下载虚拟机的私钥,以便之后能够通过 SSH 登录。

5. 在 VCN 公共子网的入站安全规则中,启用来自端口 8080 的入站连接。这将允许后续直接访问运行在虚拟机上的网站。

6. 创建一个与步骤2中创建的VCN私有子网连接的OCI MySQL HeatWave数据库。

注意:请务必记录好您的管理员账户和密码,同时记录该数据库的私有IP地址。

7. 在私有子网中,添加一条如下的入站规则,将端口 3306 设置为接受来自虚拟机的连接。

注意:请确保源地址设置为 YOUR_VM_PRIVATE_IP/32

8. 进入虚拟机

9. 使用以下方式连接到 MySQL 数据库:

在 MySQL 中创建应用程序数据库

使用 CTRL-C 退出 MySQL 提示符

10. 在虚拟机上,将 Java 26 的 GitHub 仓库克隆到 dukes_garden 文件夹中。请确保按照 .env.example 的格式,在 .env 文件中填写 API 密钥和数据库管理员密码。

11. Oracle 免费版虚拟机仅有 1GB 内存,因此请在本地笔记本电脑上克隆 Java 26 的 GitHub 仓库,并运行

12. 将生成的 JAR 文件上传到您的虚拟机

13. 将应用程序作为系统服务运行(以便在启动时自动加载,从崩溃中恢复等)。在虚拟机上:

创建 /etc/systemd/system/dukesgarden.service

然后运行:

14. 将虚拟机防火墙更改为允许端口 8080

本文编译自hackster.io

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭