鱼缸生态数据采集与影像监控系统完整方案

这是针对上一篇的智能系统的设计方案,在列出的设备之外,还有微单和专业摄像机的采集部分,这些过度设计是为了满足上一篇提到的场景。


本方案基于树莓派4B+Arduino Nano V3.1架构,整合水质参数实时监测与水下影像采集功能,通过NFS协议直接存储至TrueNAS,实现完整的鱼缸生态数据采集与监控系统。该方案采用低功耗设计,确保7×24小时稳定运行,同时具备完善的异常检测与告警机制,为观赏鱼缸或小型水族箱提供全方位健康监测。

一、系统架构与硬件选型

1. 系统拓扑结构

2. 硬件组件清单

组件型号数量价格(元)关键特性
主控制器树莓派4B(4GB)14501.5GHz四核CPU,4GB内存,千兆以太网,四USB端口
传感器采集器Arduino Nano V3.110(已有)8路10-bit ADC,USB-CDC通信,低功耗
pH传感器DFRobot SEN039511200-14pH量程,0.01-3.0V模拟输出,含温度补偿
氨氮传感器DFRobot SEN039611500-10ppm量程,0.5-3.0V模拟输出
温度传感器DS18B2015数字温度传感器,-10℃~85℃,精度±0.5℃
水下摄像头Arducam IMX47714001296万像素,支持1080p@30fps,带防水外壳
显示屏10.1″ HDMI IPS屏15001280×800分辨率,支持横竖屏切换
供电设备5V/3A电源适配器1100树莓派主电源,需通过USB-C接口供电
USB HUB带独立电源的USB HUB1150为外接摄像头和传感器提供额外电力
杜邦线40根(不同颜色)110传感器连接,电源连接
防水外壳Sub海洋级透明罩1150保护摄像头,兼容1080p分辨率
LED可控温LED灯带1200基于环境光线自动调节亮度,辅助拍摄
散热片树莓派CPU散热片130降低系统温度,避免过热降频
备用SD卡32GB Class 10150系统镜像备份,快速恢复
总计  2085完整生态监测系统
数据来源:    

3. 硬件连接细节

3.1 Arduino Nano与传感器连接

连接注意事项

  • pH传感器和氨氮传感器均使用3.3V供电可降低功耗
  • DS18B20温度传感器通过单总线连接至D4引脚
  • 所有传感器共地连接,确保数据采集一致性
  • 确保供电稳定,避免因电压波动导致数据异常

3.2 树莓派与Arduino Nano连接

  • Arduino Nano通过USB-C线连接树莓派4B的USB-A或USB-C接口
  • 树莓派会自动识别为或端口
  • 确保树莓派的USB供电稳定,建议使用5V/3A电源适配器

3.3 树莓派与摄像头连接

  • 摄像头通过CSI接口连接至树莓派4B的CSI接口
  • 摄像头需额外连接防水外壳与电源
  • 配置启用摄像头支持

3.4 显示屏与树莓派连接

  • 树莓派4B通过Micro HDMI线连接至10.1″ HDMI IPS屏
  • 配置设置屏幕分辨率与方向
  • 显示屏可选择独立供电或通过USB接口取电

二、软件环境配置

1. 树莓派系统配置

基础系统更新

串口通信配置

摄像头配置

2. 树莓派服务安装

数据采集服务

NFS客户端服务

Grafana监控服务

视频流服务

3. TrueNAS存储配置

存储池创建

  • 在TrueNAS Web界面中创建RAID-Z1存储池,至少3块硬盘
  • 推荐使用3块4TB硬盘,可用容量为6TB,可容忍1块硬盘故障
  • 在存储池中创建数据集,设置和

NFS共享配置

  • 在TrueNAS的”共享→NFS”中创建新NFS共享
  • 共享路径设置为
  • 访问权限添加树莓派IP,设置为
  • 启用选项以允许树莓派访问
  • 不要勾选以确保权限正确

挂载配置文件

验证挂载

三、数据采集与处理流程

1. 传感器数据采集

Arduino Nano代码

树莓派数据接收服务

2. 影像数据采集与处理

树莓派视频流服务配置

视频流Python脚本

轻量级行为分析模型部署

四、数据可视化与监控

1. Grafana仪表盘配置

安装Prometheus与Telegraf

配置Telegraf读取CSV数据

配置Grafana数据源

  1. 登录Grafana(默认用户名/密码:admin/admin)
  2. 导航至”Configuration → Data Sources”
  3. 点击”Add data source”,选择”Prometheus”
  4. 配置URL为
  5. 点击”Save & Test”验证连接

创建传感器数据监控面板

  1. 导航至”Dashboards → Create Dashboard”
  2. 点击”+”添加新面板
  3. 选择数据源为Prometheus
  4. 使用查询语句:,,
  5. 选择时间序列图表类型
  6. 设置阈值告警:pH<6.5或pH>8.5、NH4>10ppm、温度<20℃或温度>28℃
  7. 保存仪表盘并设置自动刷新

2. 视频流与图像展示

配置mjpg-streamer服务

配置Chromium KiOSk模式

在Grafana中展示图像

  1. 创建新面板
  2. 选择”Image”面板类型
  3. 配置URL为
  4. 设置刷新间隔为10分钟
  5. 调整面板尺寸以适应显示屏

五、异常检测与告警机制

1. 传感器阈值告警

Python告警服务

配置systemd服务

2. 鱼类行为异常检测

行为分析Python脚本

3. 系统可靠性增强

NFS故障自动回退

配置systemd服务监控

系统看门狗配置

六、系统部署与优化

1. 系统部署流程

步骤1: 硬件准备与连接

  • 准备树莓派4B并烧录Raspberry Pi OS
  • 连接Arduino Nano至树莓派USB端口
  • 连接pH传感器至Arduino Nano的A0引脚
  • 连接氨氮传感器至Arduino Nano的A1引脚
  • 连接DS18B20温度传感器至树莓派的GPIO4引脚
  • 连接水下摄像头至树莓派CSI接口
  • 连接显示屏至树莓派Micro HDMI接口
  • 连接LED灯带至树莓派GPIO引脚

步骤2: 基础系统配置

  • 更新系统:
  • 配置SSH: → 启用SSH
  • 配置WiFi: → 网络选项 → WiFi
  • 配置摄像头: → 接口选项 → Camera
  • 配置串口:禁用控制台,确保使用

步骤3: 安装核心服务

  • 安装传感器数据接收服务
  • 安装视频流服务
  • 安装NFS客户端
  • 安装Grafana与Prometheus
  • 安装告警服务
  • 安装行为分析模型

步骤4: 配置数据采集

  • 上传Arduino代码并烧录
  • 启动传感器数据接收服务
  • 配置数据采集频率与存储路径
  • 配置传感器校准参数

步骤5: 配置影像采集

  • 配置摄像头参数与分辨率
  • 启动视频流服务
  • 配置图像保存路径与频率
  • 配置视频编码参数

步骤6: 配置存储与监控

  • 在TrueNAS上创建存储池与NFS共享
  • 配置树莓派挂载NFS
  • 配置Grafana仪表盘
  • 配置传感器阈值告警
  • 配置行为分析任务

步骤7: 优化系统性能

  • 配置轻量级桌面环境
  • 设置内存缓存区域
  • 优化Python脚本性能
  • 配置系统看门狗服务
  • 设置定期校准任务

2. 系统优化与调优

电源管理优化

  • 使用5V/3A电源适配器确保树莓派稳定供电
  • 为高功耗外设(如摄像头)使用带独立电源的USB HUB
  • 降低摄像头分辨率至640×480,帧率至15fps
  • 使用低功耗模式运行LED灯带,仅在需要时开启

性能优化

  • 配置使用挂载选项减少I/O操作
  • 为Grafana和Chromium浏览器分配合理内存
  • 使用设置无限制
  • 禁用不必要的服务与后台进程

数据采集优化

  • 传感器数据采集频率设置为30秒一次,避免传感器极化
  • 使用3.3V参考电压提高ADC读取精度
  • 配置传感器定期校准任务,每月一次
  • 使用硬件看门狗防止系统卡死

视频流优化

  • 使用较低的JPEG质量(60%)减少CPU使用
  • 调整视频编码参数,降低码率
  • 限制视频流客户端数量,避免过载
  • 使用轻量级图像处理库,减少内存占用

七、系统维护与数据管理

1. 定期维护计划

每日维护

  • 检查系统日志,和
  • 监控NFS挂载状态,
  • 检查传感器数据,确保无异常值
  • 清理临时文件,

每周维护

  • 用RO水冲洗传感器探头
  • 检查摄像头防水外壳是否完好
  • 验证LED灯带功能正常
  • 检查存储空间使用情况,
  • 执行系统更新,

每月维护

  • 校准pH和氨氮传感器
  • 检查存储池健康状态
  • 执行一次完整的系统备份
  • 清理过期快照,保留最近7天的每日快照
  • 检查硬件连接,确保无松动或腐蚀

季度维护

  • 执行一次完整的存储池自检
  • 检查所有硬件组件的性能状态
  • 验证备份恢复流程
  • 更新所有软件至最新稳定版本
  • 执行一次完整的系统健康检查

2. 数据管理策略

传感器数据管理

  • 每日生成一个CSV文件,命名格式为
  • 每周生成一个汇总文件,包含平均值、最大值和最小值
  • 每月执行一次数据压缩,使用工具压缩旧CSV文件
  • 设置自动清理策略,保留最近365天的原始数据
  • 使用ZFS快照功能保护传感器数据,每日一次快照

影像数据管理

  • 视频文件按小时存储,命名格式为
  • 图像文件按分钟存储,每10分钟保存一张,命名格式为
  • 每月执行一次视频转码,将高码率视频转换为低码率版本用于长期存储
  • 设置自动清理策略,保留最近30天的原始视频,365天的低码率视频
  • 使用ZFS压缩功能优化存储空间,对图像文件启用压缩

数据备份与恢复

  • 在TrueNAS上配置每日自动快照,保留最近7天
  • 每周配置一次增量备份,保留最近4周
  • 每月配置一次完整备份,保留最近12个月
  • 配置异地备份,可使用TrueNAS的CloudSync功能将关键数据备份至云存储
  • 设置定期备份验证任务,确保备份可恢复

八、系统故障处理与应急预案

1. 常见故障处理

传感器数据丢失

  • 检查Arduino与树莓派的USB连接是否正常
  • 验证传感器供电是否稳定,电压是否在0.01-3.3V范围内
  • 检查传感器校准参数是否正确
  • 重启传感器数据接收服务:

视频流中断

  • 检查摄像头电源与连接状态
  • 确认NFS挂载是否正常
  • 检查mjpg-streamer服务状态:
  • 重启视频流服务:
  • 检查CPU使用率是否过高,必要时降低分辨率或帧率

NFS连接问题

  • 检查网络连接:
  • 检查NFS服务状态:
  • 尝试重新挂载:
  • 检查TrueNAS的NFS服务是否正常
  • 若持续失败,检查是否已自动切换

系统崩溃

  • 检查看门狗服务是否已触发重启
  • 若未自动重启,手动重启系统
  • 检查SD卡状态,必要时更换
  • 从备份恢复系统,
  • 检查所有外设连接,确保稳定

2. 应急预案

NAS宕机应急预案

  • 配置NFS故障自动回退脚本,将数据临时存储至本地缓存
  • 启用系统看门狗,防止因NAS故障导致系统卡死
  • 设置定期备份至外部存储设备
  • 配置警报服务,当NAS宕机超过1小时时发送通知
  • 准备备用存储方案,如将数据临时存储至移动硬盘

传感器失效应急预案

  • 配置多路传感器冗余,当一路失效时自动切换
  • 设置传感器失效阈值,连续10次读取失败则触发告警
  • 准备备用传感器,可在传感器失效时快速更换
  • 设置传感器数据异常检测,当数值剧烈波动时触发检查
  • 配置手动数据采集接口,允许通过手机APP临时读取数据

系统升级与维护

  • 在维护期间,配置自动回退到本地缓存
  • 使用锁定关键系统包,防止意外更新
  • 在升级前创建系统快照:
  • 使用环境进行系统升级,避免直接升级导致系统不稳定
  • 升级后验证所有服务功能正常,再删除快照

九、总结与扩展建议

本方案提供了一个完整的鱼缸生态数据采集与影像监控系统,整合了Arduino Nano的传感器采集能力与树莓派4B的影像处理能力,通过直接挂载TrueNAS实现数据的长期安全存储。系统采用低功耗设计,确保7×24小时稳定运行,同时具备完善的异常检测与告警机制。

方案优势

  • 数据安全:直接写入TrueNAS的ZFS存储池,享受RAID-Z1冗余保护
  • 实时监控:Grafana仪表盘与视频流展示,提供全面的系统状态
  • 异常检测:传感器阈值告警与鱼类行为分析,确保及时发现问题
  • 低功耗设计:合理配置硬件与软件,确保系统长期稳定运行
  • 可扩展架构:模块化设计,便于未来添加更多传感器或功能

未来扩展建议

  1. 添加更多传感器:如溶解氧传感器、盐度传感器等,丰富水质监测数据
  2. 集成AI识别:部署更复杂的鱼类识别模型,区分不同鱼类种类与健康状态
  3. 添加自动控制:根据水质数据自动调节过滤系统、温控设备等
  4. 扩展视频分析:实现鱼类计数、活动模式分析等高级功能
  5. 添加远程访问:通过内网穿透或云服务实现远程监控与管理
  6. 集成环境控制:根据光照条件自动调节LED灯带亮度,模拟自然环境
  7. 添加多鱼缸支持:扩展系统支持多个鱼缸的监测与管理

注意事项

  • 确保所有传感器和摄像头都使用防水设计,避免水损坏
  • 定期校准传感器,确保数据准确性
  • 监控系统温度,避免过热导致性能下降
  • 定期备份系统与配置,确保可恢复性
  • 遵循安全最佳实践,防止系统被未授权访问

通过本方案,用户将获得一个全面、可靠且易于扩展的鱼缸生态监测系统,不仅能够实时监控水质参数,还能捕捉水下影像,为鱼类健康与鱼缸生态平衡提供数据支持,实现对微观生命的深度共情与科学管理。

参考来源

[1]鱼群健康AI影像拍摄方案_分析_监测_养殖户

http://www.sohu.com/a/878592778_100229004

[2]树莓派+MCC 118 实现数据采集|树莓派实验室

[3]TrueNASM-Series-Scalable Storage for Maximum Uptime

[4]鱼缸测试手机性能介绍

[5]边缘计算鱼类识别:如何实现高效精准的智能识别方案?水族_智灵_模型

[6]两个 USB摄像头(OV4689)接入树莓派3B+,并通过 WiFi 实时上传到服务器,在网页上查看实时视频流。使用树莓派3视频采集接口-CSDN博客

[7]云计算-教程:在Linode平台上用TrueNAS搭建大规模存储系统-Akamai中国-SegmentFault 思否

[8]关于图形处理单元(GPU)的全部内容-Microsoft 支持

[9]鱼群健康AI影像拍摄方案|体表|养殖|拍摄方案|观赏鱼|饲料_手机网易网

[10]树莓派行业应用案例|树莓派实验室

[11]TrueNASCommunity Edition|Free Open Source Storage

[12]不只为游戏!实测独显在网络应用的重要性-太平洋电脑网

[13]GStreamer|树莓派实验室

[14]树莓派4B-快懂百科

[15]RAID Organizations for Improved Reliability and Performance: A Not Entirely Unbiased Tutorial (1st revision)

[16]A Wearable RFID-Based Navigation System for the Visually Impaired

[17]PVE下安装TruenasScale_NAS存储_什么值得买

[18]FLEdge: Benchmarking Federated Machine Learning Applications in Edge Computing Systems

[19]Raspberry4b启动摄像头_树莓派4b打开摄像头-CSDN博客

[20]RAIDZ1/Z2/Z3最少需要多少硬盘?故障容忍度分别是多少?编程语言-CSDN问答

[21]Distributed Gesture Controlled Systems for Human-MACHINE Interface

[22]树莓派摄像头硬件选型建议:接口匹配新手教程-CSDN博客

[23]教程:在Linode平台上用TrueNAS搭建大规模存储系统-CSDN博客

[24]RAIDZ1/Z2/Z3最少需要多少硬盘?故障容忍度分别是多少?编程语言-CSDN问答

[25]再谈树莓派供电不足解决方案-今日头条

[26]关于树莓派4B的碎碎念,供电不足和64位RDP的坑-哔哩哔哩

[27]NAS最新消息:免费升到企业级,威联通QuTS Hero系统正式下放-今日头条

[28]树莓派ARM架构下如何解决USB外设供电不足问题?编程语言-CSDN问答

[29]树莓派4B电源问题怎么办?ZOL问答

[30]与Prometheus集成

[31]MultiStream: A Simple and Fast Multiple Cameras Visual Monitor and Directly Streaming

[32]Metrics监控数据导出格式:JSON、CSV与Prometheus格式对比-CSDN博客

[33]构建高效家庭与商业监控系统:mjpg-streamer实战教程-CSDN博客

[34]从命令行运行Prometheus查询

[35]MJPG-Streamer:轻量级视频流传输工具的深度解析-百度开发者中心

[36]手把手教你做一个物联网视频监控项目(二)MJPG-streamer方案实现_摄像头mjpg 模式 保存视频-CSDN博客

[37]树莓派通过tftp加载zImage和nfs挂载文件系统的配置_树莓派支持 tftp-CSDN博客

[38]Real-time Lane detection and Motion Planning in Raspberry Pi and Arduino for an Autonomous Vehicle Prototype

[39]树莓派4B监控CPU占用率、内存使用率、磁盘使用量以及CPU温度_python_旺仔牛奶opo-GitCode-AI社区

[40]在树莓派上部署NFS文件存储服务器-今日头条

[41]Resilient Edge: Can we achieve Network Resilency at the IoT Edge using LPWAN and WiFi?

[42]【LEDE】树莓派上玩LEDE终极指南-64-挂载UVC摄像头-MJPG-…

[43]【ROS学习】ROS主从机通信的利器—NFS文件系统挂载_ros 主机从机-CSDN博客

[44]树莓派串口通信数据丢失如何解决?编程语言-CSDN问答

[45]玩转Python」搭建远程监控系统,从此小偷绕道走!哔哩哔哩

[46]群辉挂载linuxnfs,树莓派挂载群晖NFS分区-CSDN博客

[47]树莓派的mjpeg-streamer实现简单的监控功能_mjpegstreamer-CSDN博客

[48]Telegraf远程文件插件CSV头写入机制优化解析-CSDN博客

[49]树莓派程序systemd 服务开机自启动/暂停/检查_树莓派systemd-CSDN博客

[50]接入Telegraf数据_日志服务(SLS)阿里云帮助中心

[51]基于树莓派摄像头的实时视频流服务器完整指南-CSDN博客

[52]Telegraf介绍和使用_大数据_鲁先生.-云原生

[53]树莓派5-学习笔记5:树莓派+群辉NAS搭建个人监控中心_树莓派搭建黑群晖-CSDN博客

[54]Telegraf指标采集器全指南:从入门到企业级实战 在云原生和物联网时代,指标数据的采集与监控成为系统可观测性的基石。掘金

[55]TrueNAS作为海康摄像头NAS存储的详细配置指南-百度开发者中心

[56]Evaluation of ZFS as an efficient WLCG storage backend

[57]TrueNAS无法舍弃,虚拟机nfs挂载邪修解决方案_truenas虚拟机-CSDN博客

[58]TrueNAS做为海康摄像头NAS储存详细配置_truenasnfs-CSDN博客

[59]A Conversation with Jeff Bonwick and Bill Moore

[60]NFS挂载失败常见原因及解决方法?编程语言-CSDN问答

[61]TrueNASM-Series-Scalable Storage for Maximum Uptime

[62]zfs文件系统详解-freebsd-zfs初体验-(原创不易一键三连)

[63]TrueNAS中文显示乱码如何解决?编程语言-CSDN问答

[64]ZFS_百度百科

http://baike.baidu.com/view/959414.htm

[65]ZFS实际性能比BTRFS/EXT4性能差距不小,看实测你再决定是否迁移!哔哩哔哩_bilibili

[66]TrueNAS_百度百科

[67]Design, Implementation, and Evaluation of an External Pose-Tracking System for Underwater Cameras

[68]Design, Configuration, Implementation, and Performance of a Simple 32 Core Raspberry Pi Cluster

[69]TrueNAS25.10 正式发布:NVMe-oF 支持+OpenZFS 性能飞升!今日头条

[70]UWA360CAM: A 360° 24/7 Real-Ti Streaming Camera System for Underwater Applications

[71]在树莓派上部署NFS文件存储服务器|树莓派实验室

[72]我的TrueNASSCALENAS,ZFS加速这块有点小坑

[73]教你一招,轻松实现TNAS和云盘数据同步!厂商动态-中关村在线

[74]Jetson nano NFS挂载配置_jetson nano 不能挂载-CSDN博客

[75]TrueNAS25.10 正式发布:NVMe-oF 支持+OpenZF._什么值得买

[76]【ROS学习】ROS主从机通信的利器—NFS文件系统挂载_ros 主机从机-CSDN博客

[77]挂载文件系统失败故障排查

[78]Data-centric FinGPT: Democratizing Internet-scale Data for Financial Large Language Models

[79]如何配置开机自动挂载NFS共享

[80]Applications of Deep Neural Networks with Keras

[81]2.7.网络|迁移规划指南|Red Hat Enterprise Linux|7|Red Hat …

[82]Employing AI and ML for Data Analytics on Key Indicators: Enhancing Smart City Urban Services and Dashboard-Driven Leadership and Decision-Making

[83]树莓派上OpenCV部署指南:从安装到图像识别实战-百度开发者中心

[84]python读取csv报错_reas_csv positional argument-CSDN博客

[85]IoT Ground Sensing Systems for Early Wildfire Detection Technologies, Challenges and Opportunities

[86]1.4 实现鱼类识别/检测模型_深度学习案例精粹最新章节-QQ阅读女生网

[87]树莓派USB设备自动挂载-CSDN博客

[88]python邮件告警SMTP服务-CSDN博客

[89]树莓派+OpenCV,打造物品识别与动物识别系统!与非网

[90]树莓派USB存储设备自动挂载-CSDN博客

[91]零基础玩转边缘计算:30分钟搭建你的第一个边缘节点-CSDN博客

[92]基于深度学习的鱼类目标及死亡状态检测方法研究与应用-豆丁网

[93]树莓派挂载移动硬盘-腾讯云开发者社区-腾讯云

[94]配置阈值-Amazon ManagedGrafana

[95]SpaceYLO: A Human-Inspired Model for Real-time, On-board Spacecraft Feature Detection

[96]Grafana告警配置:基于 Prometheus 指标设置阈值,实现短信 / 邮件告警

[97]在树莓派上部署Yolov5模型实现目标检测-开发者社区-阿里云

[98]grafana 配置告警规则-CSDN文库

[99]叙述YOLOv5部署在树莓派的全部过程-CSDN文库

智能鱼缸叙事系统实验方案

以下内容中关于缸内生态搭配和设备仅供参考,后续有更加有针对性的研究方案。


一、系统架构概述

溪流缸编年史”项目是一个融合了计算机视觉、多模态感知、智能体协同与创意写作的综合系统,旨在通过一年时间构建一个从简单到复杂的水族缸智能叙事平台。整个系统的核心理念是**”数据驱动叙事”**,通过高维度生物特征识别、多源环境数据融合和Deep Agents智能体调度,将微观生态缸中的生物行为、环境变化与宏观世界新闻事件相结合,生成具有戏剧性和深度的生态叙事。

系统架构分为四个层次:物理层(鱼缸造景与传感器)、感知层(多模态数据采集与处理)、智能层(Deep Agents智能体协同与决策)、叙事层(故事生成与呈现)。这四个层次紧密耦合,形成一个闭环系统:环境变化触发生物行为,生物行为引发智能体决策,决策结果转化为叙事内容,同时叙事内容又可能通过环境干预影响缸内生态。

二、硬件与软件基础配置

2.1 物理层配置

鱼缸选择:120cm超白缸作为基础容器,其高透光度能提供更好的视觉体验。

造景材料

  • 石头:青龙石、鹅卵石(用于构建”急流区”)
  • 沉木:1-2块(构建”深潭区”避难所)
  • 底砂:溪流砂(厚度5-10cm)
  • 水草:水榕、蜈蚣草、九冠草(提供遮蔽和生态平衡)
  • 生物配置:初期6-8条孔雀鱼、2-3条黑壳虾,后期逐步增加其他物种

基础设备

  • 过滤系统:森森过滤盒(建立硝化系统,基础水质保障)
  • 水泵:尼特利水族时光水泵(静音省电,可调节水流强度)
  • 照明:LED水草灯(带三色切换功能,模拟昼夜变化)
  • 显示设备:窄边框LCD屏幕(嵌入缸壁,显示宏观新闻)
  • 控制中心:树莓派4B(作为边缘计算节点)

传感器配置

  • 温度传感器:DS18B20(水温监测)
  • 流速传感器:PITOT管式(水流强度监测)
  • 光照传感器:TSL2561(光照强度监测)
  • pH值传感器:Atlas Scientific pH(水质酸碱度)
  • 氧气传感器:Atlas Scientific DO(溶解氧监测)

总预算控制:通过选择性价比高的设备,初期配置总成本控制在500-800元之间,避免过度投资。

2.2 软件架构

数据采集系统:基于树莓派+Python,集成多传感器数据采集。

Deep Agents智能体系统:基于LangChain框架,采用ReAct范式,通过任务规划工具实现复杂任务分解。

数据存储设计:采用MySQL时序数据库,设计三个关联表。

三、生物特征识别与行为分析

3.1 YOLOv8小目标检测优化

鱼缸生物检测的挑战在于目标小(如青鳉鱼仅3-5cm)、背景复杂(水草、石头等遮挡)、光照变化大等。我们通过以下优化策略提升检测精度:

锚框优化:采用YOLOv8的AutoAnchor功能,通过分析鱼缸生物标注框的宽高比,动态调整锚框参数。

数据增强策略:采用Mosaic、MixUp和Copy-Paste增强,提高小目标检测能力。

特征点提取:为每条鱼提取独特视觉特征,如尾柄斑点、背鳍弯曲度等,实现个体识别。

3.2 OpenCV多目标跟踪与行为分析

多目标跟踪是理解生物行为的关键。我们采用实现多目标跟踪,并结合卡尔曼滤波预测鱼的位置。

行为向量化:将鱼类行为转化为可分析的数值特征。

行为类型计算公式阈值范围
Z字形急游计算连续帧角度变化率角度变化率 > 30°/秒
悬停不动计算位移标准差位移标准差 < 0.5cm
贴底缓游计算y轴位置与水深比值y轴位置 < 水深 × 0.2
领地争夺计算个体间欧氏距离距离 < 2cm 且 方向夹角 < 15°

3.3 社交关系网络构建

生物间的互动是构建复杂叙事的关键。我们通过欧氏距离和运动方向夹角分析,构建生物间的社交关系网络。

随着实验进展,社交网络会逐渐丰富,从简单的个体行为发展到复杂的群体互动和权力结构。初期可能只有”个体行为”,中期出现”小群体互动”,后期则形成完整的”社会阶层”。

四、环境扰动检测与宏观新闻映射

4.1 SIFT特征点匹配与环境变化检测

环境扰动包括自然变化(如藻类爆发)和人为干预(如造景调整)。我们通过SIFT特征点匹配检测环境变化。

环境变化等级划分:根据位移距离与缸体比例划分。

  1. 微调:位移 < 10%缸长,如添加一片新叶子
  2. 小变化:10% ≤ 位移 < 30%,如移动一块小石头
  3. 巨变:位移 ≥ 30%,如重新布局整个造景

4.2 宏观新闻与微观生态的智能映射

宏观新闻映射是系统的核心创新点,将外部世界事件与鱼缸微观生态变化相关联,形成独特的叙事隐喻。

新闻关键词与微观事件映射表

宏观新闻关键词视觉符号微观生态映射故事风格
暴雨/台风云图、雨滴动画水位上升/水流变急灾难片
高温/热浪火焰、温度计爆表水温升高生存惊悚片
地震震波图、裂痕造景震动/石头倒塌灾难动作片
战争/冲突爆炸、坦克领地争夺战争纪录片
和平/丰收麦穗、鸽子食物掉落/藻类减少田园牧歌

新闻API集成:通过RESTful API获取宏观新闻,提取关键词。

环境映射控制:根据新闻关键词动态调整鱼缸环境参数。

五、Deep Agents智能体协同与动态调度

5.1 初始阶段:基础观察与简单叙事

实验初期(0-3个月),系统主要完成基础搭建和简单功能实现。此时Deep Agents系统仅包含两个子智能体:“观察员””叙事员”

初期叙事示例

5.2 中期阶段:任务规划与复杂叙事

实验中期(4-9个月),系统引入任务规划工具更复杂的智能体分工,叙事内容也变得更加丰富。

中期叙事示例

5.3 后期阶段:动态智能体管理与高级叙事

实验后期(10-12个月),系统引入动态智能体管理高级叙事逻辑,实现从简单到复杂的叙事升级。

后期叙事示例

六、长期稳定性测试与评估

6.1 硬件稳定性测试

鱼缸设备耐久性测试是确保系统长期稳定运行的基础。我们设计了一套完整的测试方案,监控设备性能和故障率。

测试指标

  • 设备MTBF(平均无故障时间):目标≥5000小时
  • 传感器数据漂移:每月校准一次,确保误差<5%
  • 水泵功率稳定性:工作电流波动<10%

测试工具:基于树莓派的Prometheus监控系统,记录设备性能指标。

故障预测模型:基于LSTM的设备故障预测,提前预警潜在问题。

6.2 AI系统性能评估

Deep Agents系统性能评估关注推理延迟、任务完成率和内存占用等指标。

监控指标

  • :LLM推理延迟(目标<1秒)
  • :任务完成率(目标>95%)
  • :任务队列长度(目标<5)
  • :内存占用(目标<200MB)

性能优化策略

  • 当推理延迟超过2秒时,自动扩容子智能体
  • 当任务队列长度超过10时,触发任务优先级重新评估
  • 定期清理内存,仅保留最近7天的数据

6.3 叙事质量评估

叙事质量评估采用主客观结合的方法,确保故事既符合事实又有艺术性。

客观指标

  • BERTScore:衡量生成文本与参考叙事的相似度
  • 事件覆盖率:检测到的事件在叙事中的覆盖比例
  • 逻辑连贯性:通过文本相似度计算相邻叙事片段的连贯性

主观指标

  • 用户满意度评分(1-5分)
  • 叙事创意性评分(1-5分)
  • 生态隐喻合理性评分(1-5分)

评估工具:问卷星在线问卷,定期收集用户反馈。

七、实验时间表与阶段性目标

7.1 第一阶段:基础系统搭建(0-3个月)

主要目标:完成鱼缸造景、设备安装和基础数据采集系统。

关键里程碑

  • 第1周:鱼缸搭建完成,设备安装调试
  • 第2周:传感器数据采集系统上线,每小时记录环境参数
  • 第3周:生物特征提取模型训练完成,个体识别准确率>80%
  • 第4周:简单叙事生成功能实现,每日自动生成一条叙事片段

技术挑战与解决方案

  • 挑战:水下环境光线不稳定,影响视觉识别
  • 解决方案:添加红外照明和图像增强算法
  • 挑战:生物个体特征相似,难以区分
  • 解决方案:结合多种特征(颜色、斑点、行为)进行综合识别

7.2 第二阶段:环境扰动与复杂叙事(4-6个月)

主要目标:实现环境扰动检测和复杂叙事生成。

关键里程碑

  • 第5周:环境变化检测系统上线,能够识别造景变动
  • 第6周:宏观新闻映射功能实现,能够根据新闻关键词调整环境参数
  • 第7周:叙事状态机实现,支持不同状态下的叙事风格
  • 第8周:生物社交网络分析功能上线,能够识别生物间互动模式

技术挑战与解决方案

  • 挑战:环境变化与生物行为的因果关系难以确定
  • 解决方案:设计A/B测试,对比环境干预前后的生物行为变化
  • 挑战:宏观新闻与微观事件的关联缺乏科学依据
  • 解决方案:建立基于经验的映射规则库,通过用户反馈不断优化

7.3 第三阶段:动态智能体管理与高级叙事(7-12个月)

主要目标:实现智能体动态管理,提升叙事深度和复杂度。

关键里程碑

  • 第9周:动态智能体管理系统上线,根据系统状态自动调整子智能体数量
  • 第10周:多模态叙事融合功能实现,结合视频、图像和文字
  • 第11周:故障预测模型训练完成,能够提前预警设备故障
  • 第12周:叙事评估系统上线,定期评估叙事质量并优化

技术挑战与解决方案

  • 挑战:智能体间任务移交复杂,容易出错
  • 解决方案:采用PROMISE框架的”状态机+提示词映射”,确保任务移交的可靠性
  • 挑战:长期运行导致数据量过大,影响系统性能
  • 解决方案:引入数据分片和压缩存储策略,优化数据库性能

八、实验数据收集与分析方法

8.1 数据收集策略

多源数据收集是系统的核心,我们设计了一套完整的数据收集策略。

环境数据

  • 采集频率:每小时一次
  • 存储方式:MySQL时序数据库,按日期分区
  • 关键参数:温度、光照、pH值、溶解氧、藻类覆盖率

生物行为数据

  • 采集频率:每30分钟一次
  • 存储方式:MySQL关系型数据库
  • 关键参数:鱼ID、位置、速度、弯曲系数、颜色Hue值、行为类型

叙事数据

  • 采集频率:每日一次
  • 存储方式:MySQL文本型数据库
  • 关键参数:叙事内容、叙事风格、关联事件、用户反馈

用户交互数据

  • 采集方式:问卷星在线问卷,每月一次
  • 关键参数:用户满意度评分、叙事创意性评分、生态隐喻合理性评分

8.2 数据分析方法

数据分析帮助我们理解系统运行状况,发现潜在问题,并指导系统优化。

环境变化分析:通过时间序列分析,识别环境参数的变化模式。

生物行为分析:通过聚类分析,识别鱼类行为模式。

叙事质量分析:通过文本分析,评估叙事质量。

九、实验总结与未来展望

9.1 一年实验成果总结

一年实验将使”溪流缸编年史”系统从简单的环境监测和基础叙事发展为一个复杂的智能生态系统。主要成果包括:

  1. 技术成果
    1. 完成了从简单到复杂的生物特征识别系统
    1. 实现了多源环境数据的融合分析
    1. 构建了基于Deep Agents的智能体协同系统
    1. 开发了从简单描述到复杂隐喻的叙事生成能力
  2. 科学成果
    1. 揭示了微观生态系统的动态变化规律
    1. 探索了宏观事件与微观生态的潜在关联
    1. 验证了AI系统在长期运行中的稳定性
  3. 艺术成果
    1. 生成了一系列生动有趣的生态叙事
    1. 形成了独特的”魔幻现实主义”叙事风格
    1. 为鱼缸生态缸赋予了人文内涵

9.2 系统性能与问题总结

系统性能方面,通过一年实验,我们预期达到以下指标:

  • 环境参数监测准确率:温度>95%,光照>90%,pH值>85%
  • 生物个体识别准确率:>90%
  • 行为模式识别准确率:>85%
  • 叙事生成质量:BERTScore>0.8,用户满意度>4.0/5.0

实验过程中可能遇到的问题

  1. 硬件层面
    1. 传感器数据漂移:通过定期校准和LSTM模型预测解决
    1. 设备故障:通过Prometheus监控和LSTM故障预测模型提前预警
  2. AI层面
    1. 任务规划不合理:通过增加任务规划深度和优化Guard条件解决
    1. 记忆溢出:通过持久化记忆系统和上下文清理策略解决
  3. 叙事层面
    1. 叙事连贯性不足:通过状态机和叙事模板优化解决
    1. 隐喻合理性受质疑:通过用户反馈和规则库优化解决

9.3 未来迭代方向

系统未来迭代将从硬件、算法和叙事三个维度进行。

  1. 硬件层面
    1. 升级为高精度传感器(如pH值传感器精度从±0.1提升到±0.05)
    1. 添加更多环境控制设备(如自动喂食器、CO₂调节器)
    1. 引入更先进的显示设备(如透明OLED屏幕,实现真正的”画中画”效果)
  2. 算法层面
    1. 引入Transformer模型增强长时序行为预测
    1. 结合强化学习优化任务调度策略
    1. 开发更复杂的生物社交网络分析模型
  3. 叙事层面
    1. 扩展”宏观新闻→微观隐喻”规则库
    1. 开发用户交互接口,允许用户干预叙事
    1. 构建跨年度的叙事时间线,形成真正的”编年史”

十、实验操作手册

10.1 日常维护操作

每日维护(0-1个月):

时间操作内容注意事项
8:00检查设备运行状态确保传感器数据正常,水泵无异常噪音
10:00观察生物行为记录异常行为,如鱼群聚集、不进食等
15:00检查水质使用试纸快速检测pH值、氨氮和亚硝酸盐
19:00换水操作换水比例控制在10%,水温差<2℃

进阶维护(2-12个月):

  1. 环境扰动计划
    1. 每月一次:轻微环境扰动(如添加一片新叶子)
    1. 每季度一次:中等环境扰动(如移动一块小石头)
    1. 每半年一次:重大环境扰动(如重新布局造景)
  2. 生物配置调整
    1. 第3个月:增加鱼的数量至10-12条
    1. 第6个月:引入新物种(如锦鲤或热带鱼)
    1. 第9个月:调整生物密度,实现生态平衡

10.2 系统升级路线图

系统将经历三个主要升级阶段

  1. 基础版(0-3个月):
    1. 功能:环境参数监测、生物个体识别、简单叙事生成
    1. 模型:GPT-3.5-turbo
    1. 智能体:观察员、叙事员
  2. 中级版(4-9个月):
    1. 新增功能:环境扰动检测、宏观新闻映射、复杂叙事生成
    1. 模型升级:部分任务使用GPT-4
    1. 智能体扩展:添加生态分析师、映射员
  3. 高级版(10-12个月):
    1. 新增功能:动态智能体管理、多模态叙事融合、故障预测
    1. 模型优化:引入LSTM+GRU混合模型进行长期预测
    1. 智能体协同:实现基于状态机的智能体动态调度

10.3 问题排查指南

常见问题与解决方案

  1. 传感器数据异常
    1. 症状:温度读数突然波动,或pH值显示不合理
    1. 解决方案:检查传感器连接,重新校准传感器,检查数据采集代码
  2. 生物识别失败
    1. 症状:无法正确识别鱼类个体,或误判生物行为
    1. 解决方案:优化标注数据,调整模型参数,增加数据增强策略
  3. 叙事质量下降
    1. 症状:叙事连贯性变差,或生态隐喻不合理
    1. 解决方案:优化Prompt工程,增加参考叙事,调整叙事风格参数
  4. 智能体任务规划不合理
    1. 症状:任务清单过于复杂,或任务执行顺序不合理
    1. 解决方案:优化Guard条件,调整任务规划深度,增加任务优先级策略
  5. 系统性能下降
    1. 症状:推理延迟增加,内存占用过高
    1. 解决方案:清理内存,优化模型推理,必要时升级硬件

十一、结语

溪流缸编年史”项目不仅是一个技术实验,更是一次对微观世界与宏观世界关系的哲学探索。通过一年的实验,我们期望实现三个转变:

  1. 从简单观察到智能叙事:系统将从简单的环境参数记录,发展为能够理解生态变化、预测发展趋势并生成富有创意的生态叙事。
  2. 从孤立系统到开放世界:鱼缸不再是封闭的生态系统,而是通过宏观新闻映射与外界建立联系,形成一个”与世界同频共振的生态节点”。
  3. 从技术实验到艺术创作:系统将超越简单的技术验证,生成具有艺术价值的生态叙事作品,探索AI在创意写作领域的可能性。

最终目标是构建一个能够自主运行、不断进化的”溪流缸编年史”系统,它不仅能记录微观生态的变化,还能通过AI的创造力,赋予这些变化以意义和深度,让鱼缸从简单的观赏容器,转变为一个充满故事和哲理的”微观世界”。

通过这一项目,我们希望探索以下问题:微观世界与宏观世界之间是否存在某种神秘的联系?AI能否真正理解并讲述生命的故事?以及如何通过数据驱动的方法,构建一个既有科学性又有艺术性的智能叙事系统

这些探索不仅对技术发展有重要意义,也可能为人类理解自然、生命和叙事提供新的视角。

参考来源

[1]【收藏必备】DeepAgents深度解读:从0到1构建复杂任务智能体-CSDN博客

[2]新手养小丑鱼:低成本海缸设备清单真的可行吗?1000+用户观点大碰撞_造景装饰_什么值得买

[3]懒人小白必看!保姆级造景指南,3 步打造绝美鱼缸造景_智能鱼缸之家

[4]静音又省电的变频水泵推荐:四款高性价比水族水泵评测_鱼缸_流量_调节

[5]鱼虾混养 vs 龟鱼共生?我们汇总了78位水族爱好者的实战经验_造景装饰_什么值得买

[6]新手养鱼必看!30天零失败鱼缸维护指南,手残党也能养出空气缸!什么值得买

[7]Deep Agents智能体2.0深度解析:大模型应用架构革命,小白也能看懂的进阶指南-CSDN博客

[8]古法缸一年养成记!踩坑无数,终得一方治愈小天地_造景装饰_什么值得买

[9]新手养鱼开缸清单|低成本也能打造治愈

[10]鱼缸造景-快懂百科

[11]一个鱼缸怎么鱼虾混养,鱼虾混养行不行-鱼百科

[12]【海缸】Σ(°Д°;意想不到的低成本开缸邪修方案!什么值得买

[13]开一个桌面小鱼缸需要准备什么_什么值得买

[14]Efficiently Programming Large Language Models using SGLang

[15]【实操制作】4.17-用树莓派实时监测室内温湿度_树莓派温湿度-CSDN博客

[16]IoT-Based Environmental Control System for Fish Farms with Sensor Integration and Machine Learning Decision Support

[17]HAMMR-: HierArchical MultiModa Output agents for generic VQA

[18]树莓派+MCC 118 实现数据采集|树莓派实验室

[19]Quality of Answers of Generative Large Language Models vs Peer Patients for Interpreting Lab Test Results for Lay Patients: Evaluation Study

[20]从0到1:树莓派温度传感器实战指南—打造你的第一台物联网环境监测设备-CSDN博客

[21]基于机智云平台的智能鱼缸开发|手机|传感器|智能化_网易订阅

[22]10分钟手把手教你借助LangChain构建本地Agent智能体!LangChain+Agent本地部署全流程!小白也能轻松上手实操!哔哩哔哩_bilibili

[23]Efficiently Programming Large Language Models using SGLang

[24]EEA Conference & Exhibition 2021, 30 June – 1 July, Wellington, New Zealand Monitoring and Detection of Low-current HighImpedance Faults in Distribution Networks

[25]Understanding the planning of LLM agents: A survey

[26]智能家居实战:用I2C连接多个传感器的完整案例-CSDN博客

[27]Structured Thoughts Automaton: First Formalized Execution Model for Auto-Regressive Language Models

[28]如何在mysql中开发用户行为统计项目-mysql教程-PHP中文网

[29]Oscillatory rheotaxis of active droplets in microchannels

[30]YOLOv8小目标检测实战:从原理到部署的全流程指南

[31]MySQL如何进行数据库设计-MySQL数据库-亿速云

[32]基于OpenCV的运动物体检测:从理论到实践

https://cloud.baidu.com/article/3688282

[33]【YOLOV8】小目标困难场景优化_yolo小目标-CSDN博客

[34]生物信息学专业MySQL数据库课程教学方法探讨-免费论文网

[35]C# OpenCVSharp光流跟踪:如何精准捕捉运动物体的轨迹?使用c#开发物品运动轨迹-CSDN博客

[36]YOLOv8多尺度训练优化:随机缩放增强动态调尺寸,小目标AP直接涨3.9%!CSDN博客

[37]YOLOv8 AutoAnchor自动锚框计算功能使用说明-CSDN博客

[38]OpenCV实现多目标追踪(2)Frommoon-博客园

[39]Behavioral transition of a fish school in a crowded environment

[40]YOLOv8锚框机制深度解析:目标定位的先进技术-CSDN文库

[41]基于嵌入式树莓派和OpenCV的运动检测与跟踪系统.docx-原创力文档

[42]基于YOLOv8的鱼类行为识别系统:从数据集构建到UI界面实现_鱼虾视频行为分析 模型-CSDN博客

[43]YOLOv8自动锚框计算功能AutoAnchor详解-CSDN博客

[44]树莓派智能小车:使用OpenCV实现目标跟踪_树莓派小车追踪-CSDN…

[45]深度学习数据集大合集—鱼类数据集-哔哩哔哩

[46]深入解读YOLOv8Detection Model的参数设置-CSDN博客

[47]使用OpenCV实现多目标跟踪从理论到代码实践的完整指南-CSDN博客

[48]鱼缸中的鱼行为解读与健康问题分析

[49]鱼类行为学分析和总结.docx-原创力文档

[50]Attire-Based Anomaly Detection in Restricted Areas Using YOLOv8 for Enhanced CCTV Security

[51]基于PIV技术草金鱼幼鱼转弯运动动力学特性

[52]Ada-YOLO: Dynamic Fusion of YOLOV8 and Adaptive Heads for Precise Image Detection and Diagnosis

[53]机器人-毫秒级决策,秒级游动:基于MPC的仿生鱼智能控制仿真-个人文章-SegmentFault 思否

[54]YOLOv8锚框机制深度解析:目标定位的先进技术-CSDN文库

[55]狭窄通道内自推进鱼体游动的数值模拟研究

https://lxsj.cstam.org.cn/article/doi/10.6052/1000-0879-24-329

[56]目标检测:锚框的大小为什么宽乘以根号r_锚框的宽高比怎么计算-CSDN博客

[57]OpenCV实现SIFT特征检测与匹配实战-CSDN博客

[58]SAGA: A DSL for Story Management

[59]Red Sea-The Ultimate Reef Keeping Experience

Homepage CHN

[60]使用OpenCV进行SIFT特征检测-燕鹏-博客园

[61]Story Realization: Expanding Plot Events into Sentences

[62]HiChatBox鱼缸换水提醒联动水泵-CSDN博客

[63]Opencv总结6—sift算法-CSDN博客

[64]状态机工作流-.NET Framework |Microsoft Learn

[65]小智音箱鱼缸氧气泵联动通过时间调度-CSDN博客

[66]鱼缸造景检测_检测机构丨中析研究所「分析检测中心」_第三方检测报告

[67]低成本开源!乐鑫科技ESP32-S3开发板+RGB光雾联动,鱼缸炫酷得不像话-电子发烧友网

[68]基于python+opencv的SIFT算法分析_opencvpythonsift特征点匹配 平移量-CSDN博客

[69]Language-Driven Engineering

[70]RESTful简介-无线接入控制器(AC和FIT AP)V200R023C10 配置指南-华为

[71]使用OpenCV进行SIFT特征检测-燕鹏-博客园

[72]A Literature Survey Of Cognitive Complexity Metrics For Statechart Diagrams

[73]轻松掌控,一键远程:揭秘物联网设备RESTfulAPI控制之道-云原生实践

[74]State-Based Behavior Modeling in Software and Systems Engineering

[75]基于MQTT协议和RESTful API的智能家居水质监测系统_mqtt监测系统-CSDN博客

[76]C#智能设备RESTfulAPI深度开发:从物联网设备到云端控制实战_c# restful api-CSDN博客

[77]鱼缸水质参数全面解析:从物理到生物,助你打造稳定的水族环境

[78]Zero-Shot Calibration of Fishye Cameras

[79]自己动手建鱼缸,参数设置看这篇

[80]An automated vision system for measurement of zebrafish length using low-cost orthogonal web cameras

[81]鱼缸过滤全攻略:3个参数+7种过滤方式,新手也能养出空气缸什么值得买

[82]A Comprehensive Overview of Fish-Eye Camera Distortion Correction methods

[83]鱼缸设备选择指南:造浪、水泵与缸体尺寸

[84]一文看懂:怎样把像素换算为厘米?

[85]LDSA: Learning Dynamic Subtask Assignment in Cooperative Multi-Agent Reinforcement Learning

[86]Navigating Complexity: Orchestrated Problem Solving with Multi-Agent LLMs

[87]Selective decision making and collective behavior of fish by the motion of visual attention

[88]Hierarchical Reinforcement Learning with Deep Nested Agents

[89]PROMISE: A Framework for Model-Driven Stateful Prompt Orchestration

[90]Closed-loop interactions between a shoal of zebrafish and a group of robotic fish in a circular corridor

[91]Multi-Agent Collaboration: Harnessing the Power of Intelligent LLM Agents

https://arxiv.org/abs/2306.03314

[92]SWAG: Storytelling With Action Guidance

[93]全球首创双AI!DeepSeek通义千问赋能当贝智能鱼缸-当贝投影-当贝社区

[94]全球首创双AI!DeepSeek通义千问赋能当贝智能鱼缸_ZNDS资讯

http://n.znds.com/article/news/67805.html

[95]Towards Using Promises for Multi-Agent Cooperation in Goal Reasoning

[96]基于STM32的智能鱼缸设计(版本2)(监测水位、水温,控制加热棒和补水泵)(有自动模式和手动模式/阈值可以调节)

[97]当贝智能鱼缸搭载DeepSeek通义千问,行业首个双AI赋能_系统_生态_Ultra

[98]PM-FSM: Policies Modulating Finite State Machine for Robust Quadruped Locomotion

[99]【STM32项目】智能鱼缸(版本2)基于stm32的智能鱼缸设计ppt-CSDN博客

[100]当贝智能鱼缸全面接入DeepSeek!树立智能水族设备新标杆|智能化|deepseek_网易订阅

[101]PROMISE: A Framework for Model-Driven Stateful Prompt Orchestration

[102]YOLO鱼类识别:如何利用宠智灵实现高效精准的水族智能管理?模型_鱼缸_行为

[103]当贝智能鱼缸与DeepSeek完美融合:创新科技改变家居生活_天极网

[104]DeepSeekAPI接口全解析:技术实现、应用场景与最佳实践-百度开发者中心

[105]Prometheus监控服务-百度智能云

[106]DeepSeek API调用全解析:从HTTP请求到智能交互的完整指南

[107]容器监控神器Prometheus大揭秘!

[108]DeepSeek对话模块API解析:从入门到实践指南

[109]prometheusv3.5.0 发布详解:长周期支持版本带来的全新特性与性能优化|直方图|元数据_网易订阅

[110]Prometheus 监控服务-百度智能云

[111]【Prometheus监控运维必备】二、Prometheus数据模型与查询语言_prometheus查询语言-CSDN博客

[112]Multi-Agent Deep Reinforcement Learning For Persistent Monitoring With Sensing, Communication, and Localization Constraints

[113]Of Human Criteria and Automatic Metrics: A Benchmark of the Evaluation of Story Generation

[114]Feeding frequency mediates aggression and cannibalism in larval seatout, Cynosic nebulous

[115]AI-DriverPatient Monitoring with Multi-Agent Deep Reinforced Learning

[116]Automatic Story Generation: Challenges and Attempts

[117]Quantification of collective behaviour via causality analysis

[118]从LangChain到Deep Agents:构建稳定智能体的完整技术指南-CSDN博客

[119]STORYWARS: A Dataset and Instruction Tuning Baselines for Collaborative Story Understanding and Generation

[120]Effects of stocking density on survival, food intake and growth of giant gourami (Osphenemus gouramy) larvae reared in a recircult aquaculture system

[121]Prometheus监控指标设计与采集_系统_数据_标签

[122]The effects of interacting with fish in aquariums on human health and well-being: A systematic review

[123]Towards Implementing ML-Based Failure Detectors

[124]人人秀问卷调查网_在线考试_免费制作调查问卷平台-人人秀问卷调查网

[125]Comprehensive Study Of Predictive Maintenance In Industries Using Classification Models And LSTM Model

[126]Promethues 的 Agent 模式:高效转发云原生指标|服务器|谷歌|…

[127]2025年养鱼能力测试题及答案解析.doc-原创力文档

[128]使用LSTM预测设备未来一段时间内的故障风险-CSDN博客

[129]2025年鱼缸游戏测试题及答案.doc-原创力文档

[130]基于LSTM模型的工业过程数据的故障预测.pdf-原创力文档

[131]An Interference-aware Approach for Co-located Container Orchestration with Novel Metric

[132]Code Failure Prediction and Pattern Extractionusing LSTM Networks

[133]Prometheus监控与应用指标采集全解析-CSDN文库

[134]Towards Implementing ML-Based Failure Detectors

[135]Prometheus采集指标延迟如何排查?编程语言-CSDN问答

[136]【工业AI热榜】LSTM+GRU融合实战:设备故障预测准确率99.3%,附开源数据集与完整代码-CSDN博客

[137]STM32的智能鱼缸环境监测系统(开源)哔哩哔哩_bilibili

关于积水地图

其实LBS还有很多可以发挥的点,最近聊到了老兵地图,之前我还搞过绘本馆地图、北京露营地地图等。

最有意义的当属积水地图。

积水地图

那时候真好,虽然微博只有两千多粉,但发点东西,这几家地图提供商都很积极响应,高德最快,上线也最快。

自制热敏打印机连接器始末(9)为什么要在osx上添加cups才能将指令发送到打印机

这个问题我一直很困惑,正如上一篇提到的raw打印,按说raw的意思就是直接将原始指令直接发送到设备上,比如将打印机视作一个usb设备,直接通过usb写入设备不就行了吗?

我一直没有调通这样的方案。理论上是可行的,但对打印机的一些设置可能会更复杂一些,或者是我的打印机不支持这种模式。

目前能做到的就是在oxs/mac上启用cups,添加一个打印机,添加一个匹配的驱动程序,很多国产(中国大陆)的热敏打印机不提供mac的驱动程序,但实际上,这些打印机的控制板厂商就那么几家,看看打印机说明书里面提到的指令类型,比如TSPL就知道该找哪个厂商的驱动,TSPL就找TSC,他家的官网上资料可以说是非常的全了,提供了各个语言的例程。

经过反复测试,在mac上有两种方式添加打印机,一种是开启cups的web页面(在那里添加打印机,选择raw方式,但这个路径我没跑通,打印机不正常工作。),可以在cups这里添加打印机,选择对应厂商的ppa驱动程序(同一个厂商的驱动程序因不同设备而有很多型号,但比较下文件就知道大同小异,主要体现在设备的最大打印宽度、最高打印速度、分辨率这三项上,还有一个是热敏和转印模式)。另一种方式是直接在系统偏好设置-打印机这里添加打印机,选择相应的ppa文件也可以。

最后回答题目里自己设置的问题,我也不知道。一种猜测是osx为了安全起见,必须通过cups才能访问打印设备。一种猜测是打印机不具备直接简单接收指令就能打印的能力,可能还需要一些默认配置,这些配置由驱动程序来提供(ppa文件就是一个文本/配置文件,里面的内容都可以看)。

自制热敏打印机连接器始末(8)一些基本概念

其实之前参考过这篇文章

https://www.printnode.com/en/docs/what-is-raw-printing

但是他们提供的api没有命令式的,只能打文件,现在回头来看,打印机确实可以这么连接,直接安装为raw的方式就可以用程序打印了,并不需要找驱动。

当然,为了简化cups的操作,对普通用户来说,提供一个tsc的驱动在传统的打印机界面上安装会更简单一些。

在cups中添加的raw打印机只能在cups中可见,打印机与扫描仪管理中是看不见的,当然,node-printer中可以调用到这个打印机。

梳理一下基本概念:

标签打印机:重点当然在标签,每次打印一小截,标签一般是固定大小,指令如TSPL

票据打印机:重点当然是票据,按需打印长度,然后撕掉。指令如EOP。

面单打印机:快递单那种,应该是跟标签打印机差不多,只不过更大。

其实对于打印机厂商来说,很多都已经兼容多种指令了,当然不包括得力这种OEM还不提供开发文档的。

要做一个跨平台的连接器,需要满足几个条件:

(1)能够构建跨平台的发布,所以范围就锁定在electron、xamarin这样的方案上,js和c#虽然都熟悉,但最近用的多的还是js,所以优先选electron,但是其实对node不够熟悉,所以造成了上一篇关于buffer类型的困惑。

(2)搞清楚打印机在不同的操作系统如何连接,目前还没尝试usb直驱这种,在mac上还是通过cups来连接,windows上都有相应的驱动,可以不单独讨论。

(3)指令集兼容性,目前只尝试了TSPL这一种,后续还需要其他的ZPL之类的测试一下,还需要在各种指令之间转换,方便原来用某个指令集编写的程序直接对接。

(4)接入方式的兼容性,至少应该支持socket和http。

(5)统一的api,尤其是友好的RestFul模式的api,便于开发对接。

自制热敏打印机连接器始末(7)指令如何编码,尤其是汉字的编码

接下来就想为什么汉字是乱码呢?是command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);里面的汉字需要转码吗?

对照jpPrinter.addCommand里面把原来的转码去掉了,如果在command.setText(50, 100, “TSS24.BF2”, 1, 1, “一二三”);中把汉字转成unico呢,试了试也不行。

把jpPrinter.addCommand恢复回去,

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
      // command = command + content;
    };

还是会报错,throw new TypeError(‘first argument must be a string or Buffer’);

然后仔细一看,原来data复制不止是string类型,还可以是buffer类型。

那就接着从BluetoothPrinter往这里扒,因为不是蓝牙,不受每次传输的长度限制,所以把分段传输的逻辑去掉。

var data = Array.from(uint8Buf);
  var buffer = new ArrayBuffer(data.length);
  
  var dataView = new DataView(buffer);
  for (var i = 0; i < data.length; ++i) {
    dataView.setUint8(i, data[i]);
  }
  console.log(
    "data type is: " + typeof data + ", is buffer: " + Buffer.isBuffer(data)
  );

但是,还是报同样地错误。

然后发现Buffer.isBuffer(data)是false,为什么类型不对呢?

于是搜到了这里http://nodejs.cn/api/buffer.html#buffer_static_method_buffer_from_arraybuffer_byteoffset_length

是nodejs里面对Buffer有不同于js的类型定义。

于是改成:

var uint8Buf = command.getData();
  var buffer=Buffer.from(uint8Buf);
  console.log(
    "buffer type is: " + typeof buffer + ", is buffer: " + Buffer.isBuffer(buffer)
  );
  var jobid = "";
  printer.printDirect({
    data: buffer, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印成功。

自制热敏打印机连接器始末(6)验证指令可以驱动打印机输出但有乱码

后来我找到了https://github.com/qihang666/BluetoothPrinter这个项目,人家用蓝牙直接连打印机,比如我手头的DL-888AW就有蓝牙,我用usb为什么就不行呢,所以我就着手将这个项目中的代码拿过来。

尽管他里面的打印机指令集叫jprinter,但指令集实际上是TSPL,所以理论上应该可以复用。

拿过来的部分是https://github.com/qihang666/BluetoothPrinter/tree/master/components/gprint,

考虑到https://github.com/tojocky/node-printer/blob/master/examples/print_raw.js这里面提示的是data部分需要string类型,所以,我把tsc.js里面的command改成了字符串类型,把

jpPrinter.addCommand = function(content) {
      // 将指令转成数组装起;
      var code = new encode.TextEncoder("gb18030", {
        NONSTANDARD_allowLegacyEncoding: true,
      }).encode(content);
      for (var i = 0; i < code.length; ++i) {
        command.push(code[i]);
      }
    };

改成了

jpPrinter.addCommand = function(content) {
       command = command + content;
    };

然后打印的时候:

var command = tsc.jpPrinter.createNew();
  console.log(command);
  command.setSize(60, 40);
  command.setGap(2);
  command.setCls();
  command.setText(50, 10, "2", 1, 1, "Hello");
  command.setText(50, 100, "TSS24.BF2", 1, 1, "一二三");
  // command.setQR(50, 50, "L", 5, "A", "977767937@qq.com");
  command.setPagePrint();

  var data=command.getData();
  var jobid = "";
  printer.printDirect({
    data: data, // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

惊喜出现了,打印机工作了,但是汉字是乱码。

自制热敏打印机连接器始末(5)放弃直接驱动usb,尝试找替代的驱动程序

中间走了一段弯路,因为一直无法直接用程序驱动打印机打出东西来,无法验证以前的思路是否可行,所以,想着是否应该给打印机找一找mac版的驱动,然后尝试直接在电脑上打印一个pdf文件,来和程序做下对比。于是,按照打印机的说明书里说的TSPL这个语言,找到了TSC这个厂商,他们家的网站上资源真是全啊https://www.chinatsc.cn/

按照类似的规格找了几个型号的打印机,下载驱动,然后发现其实人家的驱动都在一起。

这个ppd文件就是所谓驱动,用vscode打开,发现就是文本文件,对比一下,发现基本上都是一样的,对于热敏打印机来说,只有几个参数有区别,主要是打印宽度、打印速度、打印方式(热敏/热转印)。

找到了驱动,就可以在系统的打印机管理中添加打印机,然后自选某个驱动文件,比如我试了TA200,Deli_DL_888B_NEW是可以打印文件的。

但是我用node-printer还是无法打印。

  printer.printDirect({
    data:"测试", // or simple String: "some text"
    printer: "Deli_DL_888B_NEW_", // printer name, if missing then will print to default printer
    type: "RAW", // type: RAW, TEXT, PDF, JPEG, COMMAND.. depends on platform
    success: function(jobID) {
      console.log("sent to printer with ID: " + jobID);
      jobid = jobID;
    },
    error: function(err) {
      console.log(err);
    },
  });

打印机有时间连动都不动。

自制热敏打印机连接器始末(4)分清楚热敏打印机的几种常用指令集

都调试起来以后,连接打印机,发现打印机根本没反应,网上找到的相关资料很少,大部分都是在windows或者linux上做的,难道是mac的osx有一些安全限制,导致打印的指令被拦截了。

于是照着这个思路查下去,终于找到了一个新的东西:CUPS。其实这个东西支持linux也支持mac,按照说明添加上打印机之后,确实能在mac的打印机列表中看到了,而且在系统打开一个文件用这个打印机打印,是有动作的,尽管是瞎走纸,没有真正的输出。但至少说明是有希望了。

那么为什么用electron-escpos还是无法打印呢,甚至依然连走纸反应都没有。

无奈又去得力的官网看了看,找到888B这个打印机的说明书,仔细瞅了一眼,竟然发现它说他的编程语言是TSPL,不兼容ESCPOS,擦,过于相信刚找到escpos这个神奇的协议的时候它所说的几乎所有的打印机都支持了。

https://blog.csdn.net/weixin_34355881/article/details/89543300这篇文章介绍了打印机主流的指令类型(ESC命令集+CPCL命令集+TSPL命令集)之间的区别。这就解释了上面我对打印机类型的模糊认识

好了,标签打印机一般用TSPL命令集,票据打印机一般用ESCPOS。而我用的得力888B(NEW)是标签打印机。

那么,就需要将原来的escpos换成tspl来写打印命令。

自制热敏打印机连接器始末(3)

接上一篇,分清楚了两种模块的规范,那么怎么解决两种规范的不同呢,似乎可以通过配置babel来实现,于是我在babel.config.js中尝试了很多办法,都没有收效,归根结底是还没有搞清楚vue和electron之间是如何各自适用这些规范的。

按照某种说法,最新的vue是遵循ES6,而electron或者说node模块是CommonJs,但是,在项目中,npm install进来的模块都放在node_modules中,怎么区分呢,如果不是babel.config.js来负责,那就应该是electron相关的,于是我找到了electronBuilder这个配置。

在vue.config.js(如果没有则在项目根目录新建)中:

module.exports = {
  configureWebpack: {
    devtool: "source-map"
  },
  pluginOptions: {
    electronBuilder: {
      // List native deps here if they don't work
      externals: ["escpos", "escpos-usb"]
      // If you are using Yarn Workspaces, you may have multiple node_modules folders
      // List them all here so that VCP Electron Builder can find them
    }
  }
  // chainWebpack: config => {
  //   config.module
  //     .rule("js")
  //     .test(/\.jsx?$/)
  //     .exclude.clear()
  //     .end()
  //     .include.add(function() {
  //       return ["./node_modules/escpos", "./node_modules/escpos-usb", "src"];
  //     })
  //     .end();
  // }
};

这个发现得益于https://medium.com/@nyorikakar/printing-with-vue-electron-and-node-f52a730e63e7这篇文章,而且我还在后面的评论中发现了https://github.com/song940/node-escpos/issues/297,最终靠这些信息搞清楚了逻辑。

(1)对于用于node的模块,需要在vue.config.js的externals那里列出,这样,vue就不会让babel啥的那些loader去处理了。

(2)负责和node打交道的代码要放在background.js中,这在前面第二个连接中可以看到,而且最关键的是在vue的代码因为是通过BrowserWindow加载的,在其初始化是webPreferences中的nodeIntegration这个属性需要配置为true,const { ipcRenderer } = window.require(“electron”);才能用。而且,这个true如果是放在.env中不能直接给process.env.ELECTRON_NODE_INTEGRATION=true,那样,调到的是字符串,不是布尔值,会出现下面的报错:

Uncaught TypeError: window.require is not a function
    at Module../node_modules/cache-loader/dist/cjs.js?!./node_modules/babel-loader/lib/index.js!./node_modules/cache-loader/dist/cjs.js?!./node_modules/vue-loader/lib/index.js?!./src/App.vue?vue&type=script&lang=js& (App.vue:22)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/App.vue?vue&type=script&lang=js& (App.vue?c53a:1)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/App.vue (App.vue:1)
    at __webpack_require__ (bootstrap:853)
    at fn (bootstrap:150)
    at Module../src/main.js (HelloWorld.vue?adfd:1)