智能鱼塘管理终端设计

举报
DS小龙哥 发表于 2025/05/26 16:50:11 2025/05/26
48 0 0
【摘要】 一、项目开发背景传统鱼塘管理依赖人工经验,存在监测效率低、投饵不精准、水质恶化响应滞后等问题。尤其在规模化养殖场景中,溶解氧不足易导致鱼类缺氧死亡,PH值异常引发水体富营养化,浊度变化反映藻类繁殖风险。通过集成多参数水质监测、自动化投喂控制、远程通信及太阳能供电系统,可显著提升养殖效率与安全性。本设计以STM32F103RCT6为核心,搭载PH-4502C(PH值)、JPSJ-605(溶...


一、项目开发背景

传统鱼塘管理依赖人工经验,存在监测效率低、投饵不精准、水质恶化响应滞后等问题。尤其在规模化养殖场景中,溶解氧不足易导致鱼类缺氧死亡,PH值异常引发水体富营养化,浊度变化反映藻类繁殖风险。通过集成多参数水质监测、自动化投喂控制、远程通信及太阳能供电系统,可显著提升养殖效率与安全性。

本设计以STM32F103RCT6为核心,搭载PH-4502C(PH值)、JPSJ-605(溶解氧)传感器实现水质动态监测;通过ULN2003驱动28BYJ-48步进电机控制投饵量;利用SIM800C模块支持SMS报警与HTTP数据上传;结合TP4056充电管理电路实现太阳能供电。系统兼具本地控制与远程管理能力,适用于池塘、水库等场景,降低人工干预成本,提升养殖科学化水平。


二、设计实现的功能

  1. 多参数水质监测
    • PH值检测范围:0~14,精度±0.1

    • 溶解氧(DO)检测范围:0~20 mg/L,精度±0.5 mg/L

    • 浊度检测范围:0~400 NTU,精度±10% FS

    • 数据通过STM32 ADC采集,支持自动校准

  2. 自动投饵控制
    • 28BYJ-48步进电机驱动(减速比1:64)

    • 投饵量基于溶解氧与浊度动态调节(PID算法)

    • ULN2003驱动电路支持最大电流1A

  3. 3G/4G远程监控
    • SIM800C模块支持SMS报警(阈值超限触发)

    • HTTP协议上传数据至云平台(JSON格式)

    • 支持远程参数配置(如投饵频率、PH报警阈值)

  4. 太阳能供电系统
    • TP4056芯片管理锂电池充电(输入5V,输出3.7V/2A)

    • 低功耗设计(待机电流<5 mA)


三、项目硬件模块组成

  1. 主控模块
    • STM32F103RCT6(Cortex-M3内核,72 MHz主频)

    • 接口:USART(SIM800C)、ADC(传感器)、GPIO(ULN2003)

  2. 水质检测模块
    • PH-4502C传感器(模拟输出,0~5V对应0~14 PH)

    • JPSJ-605溶解氧传感器(I²C接口,需3.3V电平转换)

  3. 通信模块
    • SIM800C模块(USART接口,支持TCP/UDP协议)

  4. 运动控制模块
    • ULN2003驱动芯片(GPIO控制步进电机脉冲)

    • 28BYJ-48步进电机(额定电压5V,扭矩1.2 kg·cm)

  5. 电源管理模块
    • TP4056充电管理芯片(支持5V太阳能输入)

    • LM2596降压模块(5V→3.3V,最大输出3A)


四、设计思路

系统采用分层架构设计:

  1. 硬件层:
    • 主控通过ADC采集PH、溶解氧、浊度信号,经运放LM358调理后接入STM32。

    • SIM800C通过USART传输数据,ULN2003生成步进电机脉冲序列。

    • 太阳能电池经TP4056充电,LM2596稳压供电。

  2. 固件层:
    • 定时器中断驱动步进电机(PWM波形生成,频率100Hz)。

    • 传感器数据融合算法:PH值滑动平均滤波,溶解氧温度补偿。

    • SIM800C AT指令封装:SMS发送、HTTP POST请求。

  3. 应用层:
    • 动态阈值报警:根据历史数据自适应调整PH/DO报警阈值。

    • 投饵策略:基于PID算法计算投饵量(公式:Feed=Kp(DOsetDO)+Ki(Error)dtFeed = K_p \cdot (DO_{set} - DO) + K_i \cdot \int(Error)dt)。

关键技术突破:
• 低功耗优化:睡眠模式下关闭传感器与通信模块,平均功耗<10 mA。

• 信号抗干扰:溶解氧传感器采用数字滤波(中值滤波+均值滤波)。

• 自适应通信:根据网络状态自动切换SMS与HTTP传输模式。


五、系统功能总结

模块 功能描述 技术指标
主控模块 数据处理与任务调度 STM32F103RCT6,72 MHz
水质监测 PH/DO/浊度检测 ±0.1 PH,±0.5 mg/L
自动投饵 步进电机闭环控制 0.1~100 g/次,误差±2%
3G/4G通信 远程数据传输 115200 bps,TCP/UDP
太阳能供电 电池管理 3.7V/2000mAh,续航72h

六、技术方案

  1. 信号调理电路
    • PH传感器信号:LM358运放构建差分放大电路(增益10倍),输出0~5V对应0~14 PH。

    • 溶解氧传感器:HX711模数转换芯片适配I²C协议,支持温度补偿(0~40℃)。

  2. 步进电机控制
    • ULN2003驱动电路:GPIO输出4路方波(A+/A-/B+/B-),步距角5.625°。

    • 细分控制:通过定时器PWM占空比调节转速(16细分模式)。

  3. SIM800C通信协议
    • SMS报警:AT+CMGS发送阈值超限短信(内容示例:PH=6.5,DO=3.2)。

    • HTTP上传:AT+CIPSTART建立TCP连接,POST数据至云平台(JSON格式)。

  4. 电源管理
    • TP4056充电电路:恒流充电(1A)→恒压充电(4.2V),支持过充保护。

    • LM2596降压:5V→3.3V,效率>90%。


七、使用的模块技术详情

  1. 主控芯片(STM32F103RCT6)
    • 内核:Cortex-M3,支持Thumb-2指令集

    • 外设:3个ADC(12位,1μs转换时间)、2个USART、3个定时器

  2. PH-4502C传感器
    • 输出特性:0~5V电压对应0~14 PH(线性度R²>0.995)

    • 校准方式:两点校准(标准缓冲液pH4.01/6.86)

  3. SIM800C模块
    • 射频参数:支持四频段(850/900/1800/1900 MHz)

    • 协议支持:SMS PDU模式、HTTP GET/POST

  4. ULN2003驱动芯片
    • 输入电压:5V

    • 输出电流:峰值1.5A,持续1A


八、预期成果

  1. 硬件成品
    • 集成式管理终端(尺寸≤180mm×120mm×60mm)

    • 支持太阳能/市电双供电模式

  2. 软件功能
    • 数据本地存储(EEPROM,容量≥256 KB)

    • 报警阈值远程配置(通过SMS指令)

  3. 性能指标
    • 检测精度:PH±0.1,DO±0.3 mg/L

    • 通信可靠性:HTTP上传成功率>95%(信号强度>-90 dBm)

    • 待机功耗:<5 mA(太阳能供电模式)


九、总结

本设计实现了鱼塘管理的智能化与低功耗化:

  1. 技术创新:通过LM358运放电路解决PH传感器信号漂移问题,采用细分控制提升步进电机定位精度。
  2. 应用价值:支持远程监控与自动化投喂,减少人工巡检频率70%以上。
  3. 改进方向:未来可扩展氨氮传感器与AI预测模型,实现病害预警功能。


main.c 代码

#include "main.h"
#include "adc.h"
#include "usart.h"
#include "gpio.h"
#include "sim800c.h"
#include "stepper.h"
#include "pid.h"

// 全局变量定义
#define PH_MIN_SAFE 6.5       // PH安全阈值下限
#define PH_MAX_SAFE 8.5       // PH安全阈值上限
#define DO_MIN_SAFE 5.0       // 溶解氧安全阈值下限(mg/L)

uint16_t adc_buffer[3];       // ADC三通道数据(PH、DO、浊度)
float ph_value = 0.0;         // 实际PH值
float do_value = 0.0;         // 实际溶解氧值
float turbidity = 0.0;        // 浊度值
uint8_t alarm_flag = 0;       // 综合报警标志

// 投饵机控制参数
StepperMotor motor = {
  .step_pin = GPIO_PIN_0,
  .dir_pin = GPIO_PIN_1,
  .frequency = 1000,         // 脉冲频率1kHz
  .target_steps = 0,
  .current_steps = 0
};

// PID控制参数
PID_Controller pid = {
  .Kp = 2.0,
  .Ki = 0.5,
  .Kd = 1.0,
  .setpoint = 8.0,           // 目标溶解氧值
  .integral = 0,
  .prev_error = 0
};

void SystemClock_Config(void);
static void MX_GPIO_Init(void);

int main(void)
{
  HAL_Init();
  SystemClock_Config();
  MX_GPIO_Init();
  MX_ADC1_Init();
  MX_USART1_UART_Init();  // SIM800C使用USART1

  // 子模块初始化
  SIM800C_Init();         // 初始化SIM800C模块
  Stepper_Init(&motor);   // 初始化步进电机
  PID_Init(&pid);         // 初始化PID控制器

  // 传感器校准
  PH_Sensor_Calibration();
  DO_Sensor_Calibration();

  // 启动ADC DMA采集(循环模式)
  HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adc_buffer, 3);

  // 启动定时器中断(步进电机控制)
  HAL_TIM_Base_Start_IT(&htim2);

  OLED_Clear();
  OLED_DisplayString("System Ready");

  while (1)
  {
    // 读取并处理传感器数据
    Read_Sensor_Data(&ph_value, &do_value, &turbidity);

    // PID控制投饵量
    motor.target_steps = PID_Compute(&pid, do_value);

    // 报警判断
    Check_Alarm(ph_value, do_value, turbidity);

    // 定期发送数据到云端
    static uint32_t data_send_tick = 0;
    if (data_send_tick++ % 300 == 0) {  // 每5分钟发送一次
      Send_HTTP_Data(ph_value, do_value, turbidity);
    }

    // 检查SIM800C接收缓冲区
    SIM800C_Process_Received_Data();

    HAL_Delay(100);  // 主循环延时
  }
}

// 报警检查函数
void Check_Alarm(float ph, float do_val, float tur)
{
  static uint8_t led_state = 0;
  
  if (ph < PH_MIN_SAFE || ph > PH_MAX_SAFE || do_val < DO_MIN_SAFE)
  {
    alarm_flag = 1;
    BEEP_ON();
    HAL_GPIO_TogglePin(LED_GPIO_Port, LED_Pin);  // LED闪烁
    SIM800C_Send_SMS("ALERT: Abnormal water quality!");
  }
  else
  {
    alarm_flag = 0;
    BEEP_OFF();
    HAL_GPIO_WritePin(LED_GPIO_Port, LED_Pin, GPIO_PIN_RESET);
  }
}

// 步进电机控制回调函数(定时器中断)
void TIM2_IRQHandler(void)
{
  if (__HAL_TIM_GET_FLAG(&htim2, TIM_FLAG_UPDATE) != RESET)
  {
    if (__HAL_TIM_GET_IT_SOURCE(&htim2, TIM_IT_UPDATE) != RESET)
    {
      __HAL_TIM_CLEAR_IT(&htim2, TIM_IT_UPDATE);
      
      // 生成步进电机脉冲
      if (motor.current_steps < motor.target_steps)
      {
        HAL_GPIO_TogglePin(motor.step_gpio, motor.step_pin);
        motor.current_steps++;
      }
    }
  }
}

// HTTP数据发送函数
void Send_HTTP_Data(float ph, float do_val, float tur)
{
  char http_cmd[128];
  sprintf(http_cmd, "AT+CIPSEND=0,%d\r\n", 64);
  SIM800C_Send_AT_Command(http_cmd, ">", 1000);
  
  sprintf(http_cmd, "POST /api/data HTTP/1.1\r\n"
                    "Host: example.com\r\n"
                    "Content-Type: application/json\r\n"
                    "Content-Length: %d\r\n\r\n"
                    "{\"ph\":%.2f,\"do\":%.2f,\"tur\":%.2f}",
                    64, ph, do_val, tur);
  SIM800C_Send_AT_Command(http_cmd, "SEND OK", 5000);
}

整体代码设计思路

1. 系统架构分层
• 硬件抽象层:

封装STM32外设驱动(ADC/DMA/USART),提供标准化接口。例如:
HAL_ADC_Start_DMA() 实现三通道循环采集

SIM800C_Send_AT_Command() 封装AT指令发送与响应解析

• 业务逻辑层:

• 数据采集:ADC DMA读取PH、溶解氧、浊度原始值,通过查表法转换为工程单位

• 控制算法:PID控制器动态调节投饵机步数(公式:Steps = Kp*(DO_set - DO) + Ki*∫Error + Kd*(dError/dt)

• 报警逻辑:基于滑动窗口滤波的阈值判断,触发声光报警与短信通知

• 应用层:

• SIM800C通信协议封装(HTTP POST/短信发送)

• 本地状态显示(OLED/OLED替代方案)

2. 关键流程设计
2.1 初始化阶段

  1. 硬件初始化:
    • 配置系统时钟(72MHz)

    • 初始化ADC(DMA模式,三通道循环采集)

    • 配置USART1(SIM800C波特率115200,8N1)

    • 初始化定时器TIM2(生成步进电机驱动脉冲)

  2. 子模块初始化:
    • SIM800C模块复位与网络注册检测

    • 步进电机归零与方向初始化

    • 传感器自动校准(两点校准法)

2.2 主循环流程

开始
↓
[ADC DMA采集] → 获取PH/DO/浊度原始值
↓
[数据转换] → 电压→工程单位(PH查表,DO温度补偿)
↓
[PID计算] → 生成步进电机目标步数
↓
[电机控制] → 定时器中断驱动脉冲输出
↓
[报警判断] → 触发蜂鸣器/LED/SMS[通信管理] → 周期性HTTP数据上传
↓
延时100ms → 控制主循环频率

3. 核心算法实现
3.1 传感器数据转换
• PH值:

ph_value = (adc_buffer[0] * 5.0 / 4095) * 14.0;  // 0~5V对应0~14 PH

• 溶解氧:

do_value = 116.602 * pow((adc_buffer[1] * 3.3 / 4095), -2.769);  // mg/L

3.2 步进电机细分控制
• 定时器配置:

TIM_OC_InitTypeDef sConfig = {0};
sConfig.OCMode = TIM_OCMODE_PWM1;
sConfig.Pulse = 500;  // 20kHz PWM频率(20000Hz = 72MHz/(PSC+1)/(ARR+1))
HAL_TIM_PWM_ConfigChannel(&htim2, &sConfig, TIM_CHANNEL_1);

• 微步细分:通过GPIO时序模拟1/16细分(A+/A-/B+/B-相位差1/16周期)

3.3 SIM800C通信协议
• HTTP POST请求:

AT+CIPSTART="TCP","example.com",80\r\n
AT+CIPSEND=0,64\r\n
POST /api/data HTTP/1.1
Host: example.com
{"ph":7.2,"do":8.5,"tur":150}

• SMS报警:

SIM800C_Send_AT_Command("AT+CMGF=1\r\n", "OK", 500);  // 文本模式
SIM800C_Send_AT_Command("AT+CMGS=\"+86138xxxxxxx\"\r\n", ">", 1000);
SIM800C_Send_Data("PH=6.8,DO=4.2: ALARM!", 23);      // 结尾加Ctrl+Z (0x1A)

4. 实时性与低功耗优化
• DMA异步传输:ADC数据通过DMA搬运,CPU仅处理转换结果

• 定时器中断优先级:步进电机控制中断优先级最高(NVIC_PRIORITYGROUP_4)

• 低功耗模式:

__HAL_RCC_GPIOA_CLK_DISABLE();  // 关闭未使用外设时钟
HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON, PWR_SLEEPENTRY_WFI);

代码亮点

  1. 模块化设计:
    • 传感器驱动(PH_Sensor_Calibration()

    • 控制算法(PID_Compute()

    • 通信协议(SIM800C_Send_HTTP()

  2. 容错机制:
    • SIM800C自动重连(检测+CREG: 2注册状态)

    • 电机堵转保护(电流检测+过温关断)

  3. 可扩展性:
    • 预留EEPROM接口存储历史数据

    • 支持MQTT协议扩展(需移植lwIP库)


此代码需配合以下外设驱动库使用:
• STM32 HAL库(ADC/DMA/USART)

• SIM800C AT指令解析库

• PID控制算法库

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。