【开源】基于STM32的新疆地区棉花智能种植系统
项目编号:STM32-T008
项目名称:基于STM32的新疆地区棉花智能种植系统
【摘要】
本项目设计并实现了一种基于STM32F103C8T6单片机的新疆地区棉花智能种植系统,旨在提升农业自动化水平与精准化管理能力。系统集成DHT11温湿度传感器、土壤氮磷钾传感器、风速传感器等多种环境监测模块,能够实时采集土壤湿度、空气温湿度、风速及养分浓度等关键农业参数,并通过OLED显示屏本地显示。系统配备ESP8266-01S模块实现Wi-Fi通信,将监测数据上传至云平台,用户可通过手机APP实时查看各项环境与土壤指标。同时,APP端还支持远程控制水泵进行自动浇灌,以及操控舵机执行精准施肥操作,满足棉花不同生长阶段的需求。人体红外传感器用于检测非法入侵,当检测到异常或风速超阈值时,蜂鸣器发出警报,提高系统安全性。该系统功能完善,适应新疆地区农业生产的实际需求,具备数据可视化、远程操控、自动响应等智能特性,具有较强的应用价值和推广前景。
【所用硬件】
1、STM32F103C8T6最小系统板
STM32F103C8T6最小系统板是基于意法半导体(ST)Cortex-M3内核的微控制器开发板,核心芯片为STM32F103C8T6,主频72MHz,具有64KB Flash和20KB SRAM,满足中等复杂度的嵌入式应用需求。该板集成USB、USART、SPI、I2C等通信接口,支持多种外设扩展。最小系统板包含必要的外围电路,如8MHz晶振、复位电路、电源管理(3.3V稳压),并提供GPIO引脚引出,方便连接传感器、显示屏等模块。其低功耗、高性能特性使其广泛应用于智能硬件、工业控制等领域。在本设计中,它作为主控单元,负责数据采集、处理及外设控制,确保电子秤系统的稳定运行。
2、OLED显示模块
OLED(有机发光二极管)显示屏模块是一种自发光显示器件,无需背光,具有高对比度、宽视角和快速响应的特点。本设计采用的OLED模块通常为0.96英寸或1.3英寸,分辨率为128×64像素,支持I2C或SPI通信协议,可直接与STM32等微控制器连接。其工作电压为3.3V~5V,功耗低,适合便携式设备。
3、蜂鸣器模块
鸣器模块是一种常见的声音报警装置,广泛应用于电子设备中用于提示或报警功能。该模块通常由一个蜂鸣器和驱动电路组成,能发出高频的蜂鸣声。按照驱动方式可分为有源蜂鸣器和无源蜂鸣器两种类型。有源蜂鸣器只需提供直流电压即可发声,控制简单,适用于固定频率提示场景;无源蜂鸣器则需要外部提供特定频率的驱动信号才能工作,适用于需要调节音调或生成特定声音模式的场合。模块通常采用5V或3.3V供电,可通过三极管或专用驱动芯片控制启停,响应速度快,可靠性高,常用于智能设备、安防系统、工业仪表等场景中。
4、ESP8266-01S WIFI模块
ESP8266-01S是一款基于ESP8266芯片的紧凑型无线通信模块,支持802.11 b/g/n协议,工作频率2.4GHz,内置32位Tensilica处理器和片上WiFi堆栈,可独立运行或作为从机与主控MCU(如STM32)协同工作。模块通过UART(AT指令)或SPI接口通信,支持STA(客户端)、AP(热点)和混合模式,便于接入互联网或组建本地无线网络。其Flash容量为1MB,提供GPIO引脚用于基础控制,工作电压3.3V,功耗低且成本低廉。
5、DHT11模块
DHT11模块是一款常用的温湿度传感器模块,内部集成了电容式湿度测量元件和NTC温度测量元件,并配备专用信号处理芯片,可输出经过校准的数字信号。该模块通过单总线方式与单片机通信,具有响应速度快、数据传输简洁的特点。DHT11在0℃至50℃范围内能测量温度,在20%至90%范围内测量湿度,精度适中,功耗较低,价格便宜,适合应用于家居环境监测、气象站和智能控制等场景。
6、舵机模块
SG90舵机是一款常见的小型直流伺服电机,体积小巧、重量轻,广泛应用于各类电子制作和机器人控制中。它采用PWM信号控制转动角度,通常可实现0°到180°的范围,定位精度较高,响应速度快,适合需要角度调节的场景。SG90内部带有减速齿轮和位置反馈电位器,能稳定控制输出角度,同时保持较好的力矩输出。由于价格低廉、使用方便,SG90常被用于Arduino、单片机和各种嵌入式实验项目中。
7、5V水泵
5V水泵是一种以直流5V电压驱动的小型泵体,常用于微型喷泉、饮水机、实验装置及DIY项目中。它体积小巧、能耗低、噪音较小,适合在低功率场景下使用。该水泵通常采用潜水式设计,可将水从低处抽至高处,具备一定的扬程与流量,安装和使用都较为方便。
8、风速检测模块
风速检测模块是一种用于测量空气流速的传感器装置,常见类型包括热敏式和叶轮式,通过检测空气流动对元件的作用来转换为电信号,实现风速大小的实时监测。该模块体积小、功耗低、响应快,广泛应用于环境监测、气象观测、工业控制及智能家居等领域,可与单片机或控制系统连接,实现风速数据采集与处理,具有精度较高和使用便捷的特点。
9、土壤氮磷钾检测模块
土壤氮磷钾检测模块是一种用于测量土壤中氮、磷、钾等主要养分含量的传感装置,通过电化学传感或光学原理将养分浓度转化为可识别的电信号,便于单片机或控制系统读取。该模块具有检测速度快、操作简便、数据直观的特点,常用于农业种植、土壤改良和智能农田管理中,帮助用户掌握土壤养分状况,从而科学施肥,提高作物产量与品质。
10、人体红外模块
人体红外模块是一种利用热释电红外传感器原理工作的检测装置,能够感应人体散发的红外辐射信号,并通过信号处理电路输出高低电平,实现对人体运动或存在的检测。该模块具有感应灵敏、功耗低、使用方便等特点,常用于安防报警、自动照明、智能家居和设备节能控制等场景,可在一定范围和角度内稳定识别人体活动,从而实现自动化控制功能。
【系统框架图】
【软件流程图】
【核心代码展示】
#include "app_task.h"
#include "main.h"
#include "m5310a.h"
#include "delay.h"
#include "usart.h"
#include "timer.h"
#include "esp8266.h"
#include "io.h"
#include "led.h"
#include "oled.h"
#include "sim800l.h"
#include "rtc.h"
#include "Encoder.h"
#include "beep.h"
#include "mpu6050.h"
#include "inv_mpu.h"
#include "adc.h"
#include "key.h"
#include "dth11.h"
#include "ds18b20.h"
#include "PAJ7620.h"
#include "max30102.h"u8 str[100];
OLED oled;
USER user;TaskControlBlock TaskList[MAX_TASKS] = {0};
uint8_t RegisteredTasks = 0; // 已注册任务数
uint32_t SystemTick = 0; // 系统时间基准// 任务注册函数
int8_t Task_Register(uint8_t id, uint32_t interval, void (*task_func)(void *), void *param)
{if (RegisteredTasks >= MAX_TASKS)return -1;TaskList[RegisteredTasks].TaskID = id;TaskList[RegisteredTasks].PollingInterval = interval;TaskList[RegisteredTasks].TimerCounter = 0;TaskList[RegisteredTasks].RunFlag = 0;TaskList[RegisteredTasks].EnableFlag = 1;TaskList[RegisteredTasks].TaskHook = task_func;TaskList[RegisteredTasks].TaskParam = param;TaskList[RegisteredTasks].Delay = 0;RegisteredTasks++;return 0;
}// 任务使能控制
void Task_Enable(uint8_t id, uint8_t enable)
{for (int i = 0; i < RegisteredTasks; i++){if (TaskList[i].TaskID == id){TaskList[i].EnableFlag = enable;break;}}
}/*** @brief LED闪烁任务** @param pt*/
void Led_Task(void *pt)
{LED1 = !LED1;
}/*** @brief OLED显示任务* * @param pt */
void OLED_Task(void *pt)
{if(oled.page == PAGE_1){sprintf(str,"T:%2dC H:%2d%%",DHT11_data[2],DHT11_data[0]);OLED_ShowString(0,0,str,8,1);sprintf(str,"T_H:%2d%% PH:%d",user.th_soil,user.ph);OLED_ShowString(0,16,str,8,1);sprintf(str,"N:%3dmg/l P:%3dmg/l",user.n,user.p);OLED_ShowString(0,32,str,8,1);sprintf(str,"k:%3dmg/l W:%2.1lfm/s",user.k,user.wind_speed);OLED_ShowString(0,48,str,8,1);}OLED_Refresh();
}void ESP8266_Task(void *pt)
{sprintf(str,"#%d#%d#%d#%d#%d#%d#%d#%2.1lf#",DHT11_data[2],DHT11_data[0],user.th_soil,user.ph,user.n,user.p,user.k,user.wind_speed);ESP8266_SendData(str);
}/*** @brief 温湿度检测任务* * @param pt */
void DHT11_Task(void *pt)
{DHT11_READ_DATA();
}/*** @brief 土壤湿度获取任务* * @param pt */
void Soil_Th_Task(void *pt)
{u8 i;const char Soil_TH_CMD[8]={0x01,0x03,0x00,0x00,0x00,0x01,0X84,0X0A};user.soil_sensor = 1;for(i=0;i<8;i++){USART_SendData(USART1, Soil_TH_CMD[i]); // 发送数据while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成}if(user.uart_flag == 1){user.uart_flag=0;Task_Enable(5,0);Task_Enable(6,1);}
}/*** @brief 土壤PH获取任务* * @param pt */
void Soil_PH_Task(void *pt)
{u8 i;const char Soil_PH_CMD[8]={0x01,0x03,0x00,0x03,0x00,0x01,0X74,0X0A};user.soil_sensor = 2;for(i=0;i<8;i++){USART_SendData(USART1, Soil_PH_CMD[i]); // 发送数据while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成}if(user.uart_flag == 1){user.uart_flag=0;Task_Enable(6,0);Task_Enable(7,1);}
}/*** @brief 土壤氮获取任务* * @param pt */
void Soil_N_Task(void *pt)
{u8 i;const char Soil_N_CMD[8]={0x01,0x03,0x00,0x04,0x00,0x01,0XC5,0XCB};user.soil_sensor = 3;for(i=0;i<8;i++){USART_SendData(USART1, Soil_N_CMD[i]); // 发送数据while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成}if(user.uart_flag == 1){user.uart_flag=0;Task_Enable(7,0);Task_Enable(8,1);}
}/*** @brief 土壤磷获取任务* * @param pt */
void Soil_P_Task(void *pt)
{u8 i;const char Soil_P_CMD[8]={0x01,0x03,0x00,0x05,0x00,0x01,0X94,0X0B};user.soil_sensor = 4;for(i=0;i<8;i++){USART_SendData(USART1, Soil_P_CMD[i]); // 发送数据while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成}if(user.uart_flag == 1){user.uart_flag=0;Task_Enable(8,0);Task_Enable(9,1);}
}/*** @brief 土壤钾获取任务* * @param pt */
void Soil_K_Task(void *pt)
{u8 i;const char Soil_K_CMD[8]={0x01,0x03,0x00,0x06,0x00,0x01,0X64,0X0B};user.soil_sensor = 5;for(i=0;i<8;i++){USART_SendData(USART1, Soil_K_CMD[i]); // 发送数据while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET); // 等待发送完成}if(user.uart_flag == 1){user.uart_flag=0;Task_Enable(9,0);Task_Enable(5,1);}
}/*** @brief 风速获取任务* * @param pt */
void Wind_Task(void *pt)
{user.wind_speed = Get_Adc(ADC_Channel_6)*3.3/4095;
}/*** @brief 施肥&浇水任务* * @param pt */
void Motor_Task(void *pt)
{if(user.water_flag == 1 || user.th_soil < user.th_soil_value){MOTOR = 1;}else{MOTOR = 0;}if(user.motor_flag == 1 || user.k < user.k_value || user.n < user.n_value || user.p < user.p_value){Servo_SetAngle_PB1(90);}else{Servo_SetAngle_PB1(0);}
}/*** @brief 报警任务* * @param pt */
void Alarm_Task(void *pt)
{static u8 flag=0;if(HongWai == 1){BEEP = 0;}else if(user.wind_speed > user.wind_speed_value){if(flag == 0){flag = 1;BEEP = 0;}else if(flag == 1){flag = 0;BEEP = 1;}}else{BEEP = 1;}
}void Task_Init(void)
{Task_Register(1, 1000, Led_Task, NULL);Task_Register(2, 200, OLED_Task, NULL);Task_Register(3, 2000, ESP8266_Task, NULL);Task_Register(4, 1000, DHT11_Task, NULL);Task_Register(5, 100, Soil_Th_Task, NULL);Task_Register(6, 100, Soil_PH_Task, NULL);Task_Register(7, 100, Soil_N_Task, NULL);Task_Register(8, 100, Soil_P_Task, NULL);Task_Register(9, 100, Soil_K_Task, NULL);Task_Register(10, 100, Wind_Task, NULL);Task_Register(11, 200, Motor_Task, NULL);Task_Register(12, 500, Alarm_Task, NULL);}void Task_Run(void)
{for (int i = 0; i < RegisteredTasks; i++){if (TaskList[i].RunFlag && TaskList[i].EnableFlag){// 执行任务函数if (TaskList[i].TaskHook != NULL){TaskList[i].TaskHook(TaskList[i].TaskParam);}// 清除运行标志TaskList[i].RunFlag = 0;}}
}void TaskTime(void)
{static u32 tick_time = 0;tick_time++;// 遍历任务列表更新计数器for (int i = 0; i < RegisteredTasks; i++){if (TaskList[i].EnableFlag){TaskList[i].TimerCounter++;// 达到时间间隔时设置运行标志if (TaskList[i].TimerCounter >= TaskList[i].PollingInterval){TaskList[i].RunFlag = 1;TaskList[i].TimerCounter = 0;}}}
}
【原理图】
【硬件实物图】
【实物演示】
基于STM32的新疆地区棉花智能种植系统的设计与实现