STM32的智慧农业系统开发(uC/OS-II)

一、项目概述与设计思路

1.1 智慧农业系统需求分析

本智慧农业监测系统基于STM32F4系列微控制器开发,主要实现以下核心功能:

  • 环境参数采集(温湿度、光照强度、烟雾浓度)
  • 执行机构控制(PWM调速风扇、LED补光灯)
  • 异常状态报警(蜂鸣器、OLED显示)
  • 人机交互(按键控制、OLED界面)
  • 通信功能(LoRa无线模块)

系统采用模块化设计思想,将传感器采集、执行机构控制、用户界面等模块进行解耦,通过uC/OS-II实时操作系统实现多任务调度。

1.2 硬件架构设计

系统硬件组成框架:

复制代码
[传感器层]
├─ DHT11温湿度传感器
├─ 光敏电阻(PF7 ADC)
├─ MQ-2烟雾传感器(PA6 ADC + PE6中断)
├─ 按键模块

[控制层]
├─ STM32F407主控
├─ PWM风扇(PC7 TIM3-CH2)
├─ LED补光灯(PC6 TIM3-CH1)

[交互层]
├─ OLED显示屏(I2C:PB8-PB9)
├─ 蜂鸣器模块

[通信层]
└─ LoRa模块(USART1)

1.3 软件架构设计

基于uC/OS-II的多任务系统:

https://img-blog.csdnimg.cn/20210320161536932.png

主要任务划分:

  • 传感器采集任务
  • 环境控制任务
  • 用户界面任务
  • 通信处理任务
  • 报警处理任务

二、硬件接口配置详解

2.1 GPIO功能分配

根据文档1配置关键引脚:

c

Copy

c 复制代码
/* 引脚功能映射表 */
typedef struct {
    GPIO_TypeDef* GPIOx;
    uint16_t GPIO_Pin;
    GPIOMode_TypeDef Mode;
} PinConfig;

const PinConfig pinConfig[] = {
    {GPIOB, GPIO_Pin_8,  GPIO_Mode_AF},  // I2C1_SCL
    {GPIOB, GPIO_Pin_9,  GPIO_Mode_AF},  // I2C1_SDA
    {GPIOE, GPIO_Pin_6,  GPIO_Mode_IN},  // 烟雾中断
    {GPIOA, GPIO_Pin_6,  GPIO_Mode_AN},   // 烟雾ADC
    {GPIOF, GPIO_Pin_7,  GPIO_Mode_AN},   // 光敏ADC
    {GPIOC, GPIO_Pin_6,  GPIO_Mode_AF},  // TIM3_CH1
    {GPIOC, GPIO_Pin_7,  GPIO_Mode_AF}   // TIM3_CH2
};

2.2 外设时钟配置

外设时钟使能顺序:

c

Copy

c 复制代码
void RCC_Configuration(void)
{
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA | RCC_AHB1Periph_GPIOB |
                          RCC_AHB1Periph_GPIOC | RCC_AHB1Periph_GPIOE, ENABLE);
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3, ENABLE);
}

三、关键外设驱动实现

3.1 OLED显示模块

3.1.1 I2C驱动层

采用软件模拟I2C协议(文档7):

c

Copy

c 复制代码
void I2C_Start(void)
{
    SDA_HIGH();
    SCL_HIGH();
    delay_us(5);
    SDA_LOW();
    delay_us(5);
    SCL_LOW();
}

void I2C_WriteByte(uint8_t data)
{
    for(uint8_t i=0;i<8;i++){
        (data & 0x80) ? SDA_HIGH() : SDA_LOW();
        SCL_HIGH();
        delay_us(5);
        SCL_LOW();
        data <<= 1;
    }
}
3.1.2 显示应用层

实现多级菜单系统:

c

Copy

c 复制代码
typedef struct {
    uint8_t currentMenu;
    void (*DisplayFunc)(void);
} MenuSystem;

void OLED_DisplayTask(void *pdata)
{
    MenuSystem menu;
    while(1){
        switch(menu.currentMenu){
            case 0: ShowMainPage(); break;
            case 1: ShowEnvData(); break;
            case 2: ShowSettings(); break;
        }
        OSTimeDlyHMSM(0,0,0,500);
    }
}

3.2 PWM控制模块

TIM3通道配置(文档10):

c

Copy

c 复制代码
void PWM_Init(void)
{
    TIM_TimeBaseInitTypeDef TIM_BaseStruct;
    TIM_OCInitTypeDef TIM_OCStruct;

    // 时基配置:1kHz PWM频率
    TIM_BaseStruct.TIM_Prescaler = 84-1; 
    TIM_BaseStruct.TIM_Period = 1000-1;
    TIM_TimeBaseInit(TIM3, &TIM_BaseStruct);

    // 输出比较配置
    TIM_OCStruct.TIM_OCMode = TIM_OCMode_PWM1;
    TIM_OCStruct.TIM_OutputState = TIM_OutputState_Enable;
    TIM_OCStruct.TIM_Pulse = 0; // 初始占空比0%
    
    TIM_OC1Init(TIM3, &TIM_OCStruct); // PC6
    TIM_OC2Init(TIM3, &TIM_OCStruct); // PC7
    
    TIM_Cmd(TIM3, ENABLE);
}

3.3 烟雾传感器驱动

双重检测机制实现(ADC+中断):

c

Copy

c 复制代码
void Smoke_Init(void)
{
    // ADC配置
    ADC_CommonInitTypeDef ADC_CommonInitStruct;
    ADC_CommonInitStruct.ADC_Mode = ADC_Mode_Independent;
    ADC_CommonInitStruct.ADC_Prescaler = ADC_Prescaler_Div2;
    ADC_CommonInit(&ADC_CommonInitStruct);

    // 中断配置
    EXTI_InitTypeDef EXTI_InitStruct;
    EXTI_InitStruct.EXTI_Line = EXTI_Line6;
    EXTI_InitStruct.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStruct.EXTI_Trigger = EXTI_Trigger_Rising_Falling;
    EXTI_Init(&EXTI_InitStruct);
}

四、实时操作系统整合

4.1 uC/OS-II任务创建

系统任务初始化流程(文档2):

c

Copy

c 复制代码
void main(void)
{
    OSInit();
    
    // 创建系统任务
    OSTaskCreate(AppTask_Init, (void*)0, &init_stk[TASK_STK_SIZE-1], TASK_PRIO_INIT);
    OSTaskCreate(AppTask_Sensor, (void*)0, &sensor_stk[TASK_STK_SIZE-1], TASK_PRIO_SENSOR);
    OSTaskCreate(AppTask_Control, (void*)0, &control_stk[TASK_STK_SIZE-1], TASK_PRIO_CTRL);
    
    OSStart();
}

4.2 任务间通信设计

使用事件标志组实现传感器数据同步:

c

Copy

c 复制代码
OS_FLAG_GRP *SensorFlagGrp;

void Sensor_Task(void *pdata)
{
    while(1){
        // 采集所有传感器数据
        ReadDHT11();
        ReadLightSensor();
        ReadSmokeSensor();
        
        // 设置数据就绪标志
        OSFlagPost(SensorFlagGrp, DATA_READY_FLAG, OS_FLAG_SET, &err);
        
        OSTimeDlyHMSM(0,0,2,0); // 2秒采集周期
    }
}

void Control_Task(void *pdata)
{
    while(1){
        // 等待数据就绪
        OSFlagPend(SensorFlagGrp, DATA_READY_FLAG, OS_FLAG_WAIT_SET_ALL, 0, &err);
        
        // 执行控制逻辑
        EnvControlLogic();
    }
}

五、系统控制逻辑实现

5.1 环境自适应控制算法

实现模糊PID控制:

c

Copy

c 复制代码
typedef struct {
    float Kp, Ki, Kd;
    float integral_max;
    float last_error;
    float integral;
} FuzzyPID;

float FuzzyPID_Calculate(FuzzyPID *pid, float setpoint, float actual)
{
    float error = setpoint - actual;
    pid->integral += error;
    
    // 积分限幅
    if(pid->integral > pid->integral_max) pid->integral = pid->integral_max;
    if(pid->integral < -pid->integral_max) pid->integral = -pid->integral_max;
    
    float derivative = error - pid->last_error;
    float output = pid->Kp*error + pid->Ki*pid->integral + pid->Kd*derivative;
    
    pid->last_error = error;
    return output;
}

5.2 异常处理机制

烟雾浓度三级报警策略:

c

Copy

c 复制代码
void Smoke_Handler(void)
{
    float smoke_level = GetSmokeLevel();
    
    if(smoke_level > WARNING_THRESHOLD){
        OSFlagPost(AlarmFlagGrp, SMOKE_ALARM_FLAG, OS_FLAG_SET, &err);
        SetFanSpeed(MAX_SPEED);
    }
    else if(smoke_level > NOTICE_THRESHOLD){
        Beep_Alert(INTERMITTENT_BEEP);
        AdjustFanSpeed(smoke_level);
    }
    else{
        OSFlagPost(AlarmFlagGrp, SMOKE_ALARM_FLAG, OS_FLAG_CLR, &err);
    }
}

六、开发经验与调试技巧

6.1 常见问题解决

问题1:PWM输出不稳定

  • 检查TIM分频系数设置
  • 验证GPIO重映射是否正确
  • 使用示波器观察波形

问题2:OLED显示花屏

  • 检查I2C时序是否满足器件要求
  • 确认显示缓冲区正确清零
  • 验证电源稳定性

6.2 性能优化建议

  1. ADC采样优化:

c

Copy

c 复制代码
#define SAMPLE_NUM 32
uint16_t ADC_AverageFilter(ADC_TypeDef* ADCx)
{
    uint32_t sum = 0;
    for(uint8_t i=0; i<SAMPLE_NUM; i++){
        sum += ADC_GetConversionValue(ADCx);
    }
    return sum / SAMPLE_NUM;
}
  1. 任务优先级分配原则:
  • 传感器采集任务 > 控制任务 > 界面任务
  • 中断服务任务保持最高优先级

七、项目扩展方向

7.1 功能扩展建议

  1. 增加土壤湿度监测
  2. 集成WiFi/4G远程监控
  3. 添加太阳能供电模块
  4. 实现Android端APP控制

7.2 物联网集成方案

构建MQTT通信框架:

c

Copy

c 复制代码
void MQTT_Publish(const char *topic, float data)
{
    char payload[50];
    sprintf(payload, "{\"value\":%.1f}", data);
    
    Lora_SendData(topic);
    Lora_SendData(payload);
}

void Lora_Callback(char *msg)
{
    // 解析云平台指令
    if(strstr(msg, "FAN_CTRL")){
        uint8_t speed = atoi(msg+9);
        SetFanSpeed(speed);
    }
}

八、总结与学习资源

8.1 项目总结

本系统完整实现了智慧农业的环境监测与控制功能,关键技术点包括:

  • 多传感器数据融合
  • 实时操作系统应用
  • 闭环控制算法实现
  • 低功耗设计思想

8.2 推荐学习资料

  1. 《STM32F4xx中文参考手册》
  2. uC/OS-II官方文档
  3. 《嵌入式实时操作系统原理与应用》
相关推荐
辛迪聊物业数字化27 分钟前
智慧社区小程序落地避坑指南:3类物业方案选型+成本测算,线上服务零翻车
大数据·嵌入式硬件·百度·系统架构
电子科技圈1 小时前
Arm电机控制开发工具哪家强?
arm开发·单片机·嵌入式硬件·设计模式·软件构建
JasmineX-11 小时前
下位机直接控制57步进电机匀速转动
stm32·单片机·嵌入式硬件
聆思科技AI芯片2 小时前
【AI硬件开发上手教程】怎么使用AI编程实现小聆AI语音控制舵机
人工智能·嵌入式硬件·开源·ai编程·智能硬件
abc light2 小时前
ARM 裸机开发(6)——时钟树与定时器
arm开发·单片机·fpga开发
吠品12 小时前
智谱开源 ZCode 之后,真正的考试才开始
单片机·嵌入式硬件·1024程序员节
Chery114013 小时前
高速ADC与精密DAC怎么选?DP9230D与DP8532D应用解析
嵌入式硬件·物联网·射频工程
小李不想当小白16 小时前
SPI通信外设与W25Q64 (硬件SPI)(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·嵌入式
LCG米16 小时前
STM32驱动W5500以太网模块实测:TCP吞吐瓶颈定位、TX指针回绕陷阱与断线重连保活落地
stm32·单片机·嵌入式硬件·tcp/ip
尼喃18 小时前
662K/65Z5三脚稳压芯片规格书—PW6566B33/B30引脚功能
嵌入式硬件