AI生成代码

This commit is contained in:
2025-09-07 15:46:10 +08:00
parent ae2a9e9364
commit b80a04bfc1
11 changed files with 947 additions and 60 deletions

199
README.md
View File

@@ -32,67 +32,162 @@
5. 临时保存栏内设备故障信息,直到上报成功后清除
6. 根据批量指令控制对应设备工作
# 猪舍控制器
猪舍控制器是一个用于监控和控制猪舍环境的系统。它可以通过LoRa与上位机通信并通过RS485总线控制传感器和执行器设备。
## 协议栈和技术选型
本系统采用以下物联网标准协议栈:
### 物理层
- **LoRa**:低功耗广域网物理层技术,提供远距离无线传输能力
### 数据链路层和网络层
- **LoRaWAN**基于LoRa物理层的广域网协议提供设备认证、加密和网络管理
### 传输层
- **CoAP**受限应用协议轻量级的RESTful协议适用于资源受限设备
### 应用层
- **LwM2M**:轻量级机器到机器协议,提供设备管理、固件更新等功能
### 数据格式
- **SenML**:传感器标记语言,标准化的传感器数据表示格式
这种协议栈选择具有以下优势:
1. **低功耗**:适合电池供电或节能要求高的场景
2. **远距离传输**LoRa技术可实现数公里覆盖
3. **标准化**:采用业界标准协议,便于系统集成和扩展
4. **安全性**LoRaWAN和CoAP均提供安全机制
5. **互操作性**:基于标准协议,便于与不同厂商设备集成
## 系统架构
### 通信协议
- 上位机和猪舍主控间通过LoRa协议互联
- 主控与设备/传感器通过Modbus RTU协议通信
### 硬件组成
- 主控制器树莓派PICO RP2040
- 通信接口RS485总线、LoRa无线模块
- 传感器:硫化氢、氨气、二氧化碳、光照、温度、湿度、风速、气压等
- 执行设备:风机、水帘、喷淋系统、除臭水帘、刮粪机、电磁阀等
### 硬件拓扑图
```mermaid
graph LR
A[猪场主控] -->|LoRa| B[猪舍主控]
B -->|Modbus RTU| C[RS485总线1]
B -->|Modbus RTU| D[RS485总线2]
C -->|Modbus RTU| E1[硫化氢传感器]
C -->|Modbus RTU| E2[氨气传感器]
C -->|Modbus RTU| E3[二氧化碳传感器]
C -->|Modbus RTU| E4[光照传感器]
C -->|Modbus RTU| E5[温度传感器]
C -->|Modbus RTU| E6[湿度传感器]
C -->|Modbus RTU| E7[风速传感器]
C -->|Modbus RTU| E8[气压传感器]
D -->|Modbus RTU| F[继电器]
F -->|通/断电| G1[风机]
F -->|通/断电| G2[水帘]
F -->|通/断电| G3[栏内喷淋]
F -->|通/断电| G4[除臭水帘]
F -->|通/断电| G5[刮粪机]
F -->|通/断电| H[电磁五通阀]
H -->|通/断气| I[气动三通阀]
```
猪舍控制器
├── 通信层 (LoRa)
├── 控制层 (核心逻辑)
├── 设备层 (传感器和执行器)
└── 存储层 (数据存储)
```
## 使用说明
## 抽象接口设计
### 硬件准备
1. 树莓派 PICO RP2040 开发板
2. RS485 转 UART 模块
3. LoRa 模块 (如 SX1276/SX1278)
4. 传感器和设备(如上述硬件拓扑图所示)
为了提高系统的可扩展性和可维护性,我们定义了以下抽象接口:
### 安装步骤
1. 按照硬件拓扑图连接所有设备和传感器
2. 将程序上传到树莓派 PICO
3. 配置系统参数和设备信息
4. 启动系统
### 通信接口 (BaseComm)
定义了通信模块的基本操作,包括连接、断开连接、发送和接收数据等方法。
### 启动系统
```bash
# 使用 mpremote 运行主程序
mpremote connect [设备路径] run main.py
```
或者直接将 main.py 设置为启动脚本,让 PICO 上电后自动运行
### 设备接口 (BaseDevice)
定义了设备的基本操作,包括连接、断开连接、读取数据、写入数据和获取状态等方法。
## 开发相关
### 存储接口 (BaseStorage)
定义了存储模块的基本操作,包括保存、加载、删除数据等方法。
详细的开发指南、项目结构、配置说明和技术规范请参考 [DEVELOPMENT.md](DEVELOPMENT.md) 文件。
### 命令处理器接口 (BaseHandler)
定义了命令处理的基本操作,包括处理命令、注册和注销命令处理函数等方法。
## 设计理念
按照功能区分将传感器和执行器分别连接到不同的RS485总线上可以带来以下优势
1. **减少总线负载**:传感器通常需要频繁读取数据,而执行器可能需要较大的电流,分离可以避免相互干扰。
2. **提高响应速度**:控制命令可以直接发送到执行器总线,无需等待传感器数据采集完成。
3. **增强系统稳定性**:一条总线故障不会影响另一条总线上的设备。
4. **便于维护**:可以根据需要单独重启或维护某一总线。
## 配置说明
系统配置文件为 `config.json`,如果不存在,系统会根据默认配置创建。配置项包括:
### LoRa通信配置
- `lora.address`: 本机LoRa地址
- `lora.frequency`: 工作频率(MHz)
- `lora.bandwidth`: 带宽(kHz)
- `lora.spreading_factor`: 扩频因子
- `lora.coding_rate`: 编码率
- `lora.encryption_key`: 加密密钥
### 上位机配置
- `master.lora_address`: 上位机LoRa地址
- `master.protocol`: 与上位机通信协议
### 总线配置
- `bus.sensor.port`: 传感器总线串口
- `bus.sensor.baudrate`: 传感器总线波特率
- `bus.actuator.port`: 执行器总线串口
- `bus.actuator.baudrate`: 执行器总线波特率
### 日志配置
- `log.level`: 日志级别 (DEBUG, INFO, WARNING, ERROR)
- `log.file_path`: 日志文件路径
- `log.max_size`: 日志文件最大大小
- `log.backup_count`: 保留的日志文件数量
- `log.report_errors`: 是否上报错误信息
- `log.terminate_on_report_failure`: 错误上报失败时是否终止程序
### 系统参数
- `system.heartbeat_interval`: 心跳包发送间隔(秒)
- `system.data_collection_interval`: 数据采集间隔(秒)
- `system.command_timeout`: 命令超时时间(秒)
- `system.retry_count`: 命令重试次数
- `system.error_handling`: 错误处理策略
### 设备配置
- `devices`: 设备列表(包括传感器和执行器)
每个设备包含以下属性:
- `id`: 设备唯一标识
- `type`: 设备类型
- `address`: 设备地址
- `bus`: 所在总线(sensor/actuator)
- `location`: 设备位置(可选)
- `unit`: 单位(仅传感器需要,如温度单位、湿度单位等)
参考示例配置文件 `config.json.example` 创建您的配置文件。
## 枚举类型定义
为了提高代码的可读性和维护性,系统定义了以下枚举类型:
1. `LogLevel`: 日志等级枚举 (DEBUG, INFO, WARNING, ERROR, CRITICAL)
2. `DeviceType`: 设备类型枚举 (包括温度、湿度等传感器类型和喂料口、阀门等执行器类型)
3. `BusType`: 总线类型枚举 (SENSOR, ACTUATOR)
4. `ErrorHandlingStrategy`: 错误处理策略枚举 (RETRY, SKIP, ALERT)
## 日志和错误处理机制
考虑到树莓派等嵌入式设备的存储空间限制,系统采用以下策略:
1. **限制日志文件大小**默认将日志文件大小限制为1MB仅保留一个备份文件
2. **错误上报机制**当发生错误时系统会尝试通过LoRa将错误信息上报给上位机
3. **上报成功处理**:错误信息上报成功后,系统会删除本地日志中的该条目
4. **上报失败处理**:如果错误信息上报失败,说明与上位机之间的通信不稳定,系统将根据配置决定是否终止程序运行
这种机制既节省了本地存储空间,又能确保关键错误信息能够及时传递给上位机。
## 开发顺序建议
当然,从对其他模块依赖最小的模块开始开发是一个明智的策略,以便逐步构建项目的基础。以下是建议的开发顺序:
1. **配置模块config.py**:首先实现配置模块,以定义应用程序所需的基本配置。这将为其他模块提供必要的设置。
2. **实用程序模块utils/**:开发实用程序函数,这些函数可以在整个项目中被重复使用。这样可以为其他模块提供基本的辅助功能。
3. **数据存储模块storage/**:实现数据存储逻辑,包括存储传感器数据、设备状态和配置信息。这一模块可以在独立于其他模块的情况下开发。
4. **设备交互模块devices/**:实现与设备交互的模块,包括传感器和执行器。这将为之后的通信和核心逻辑提供基础。
5. **通信模块comms/**:开发通信模块,以处理与上位机和设备的通信协议。此模块可能需要依赖设备交互模块。
6. **核心逻辑模块core/**:实现核心逻辑,包括处理命令、控制设备和管理传感器数据。这一模块将利用之前开发的模块。
7. **测试模块tests/**:在开发过程中,逐步添加测试用例以验证每个模块的功能。
8. **主程序main.py**:最后实现主程序,作为应用程序的入口点,将所有模块整合在一起。
这种顺序将帮助你逐步构建项目,并确保每个模块在开发过程中得到充分的测试和验证。
## 许可证