基于STM32的智能抽水灌溉系统设计(蓝牙版)
✌️✌️大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是基于《基于STM32的智能抽水灌溉系统设计》。
目录
1、系统功能
2.1、硬件清单
2.2、功能介绍
2.3、控制模式
2、演示视频和实物
3、系统设计框图
4、软件设计流程图
5、原理图
6、主程序
7、总结
1、系统功能
2.1、硬件清单
STM32F103C8T6 最小核心控制板 + 继电器 + 风扇模块 + 0.96 寸 OLED 显示屏 + 蜂鸣器 + 土壤湿度传感器 + DHT11 温湿度传感器 + 蓝牙模块 + 4 个按键
2.2、功能介绍
(1)STM32F103C8T6 最小核心控制板:作为系统核心,负责协调和控制各硬件模块运行,处理传感器数据并执行相应控制逻辑。
(2)继电器:控制水泵的启停,当系统触发水泵开启条件时,通过继电器接通水泵电路。
(3)风扇模块:在自动模式下,当环境温度大于设定阈值时自动启动,用于散热或调节环境温度;手动模式下可通过按键直接控制。
(4)0.96 寸 OLED 显示屏:实时显示土壤湿度、环境温度湿度等传感器数据,以及系统当前工作模式(手动 / 自动)和各阈值设置信息。
(5)蜂鸣器:当土壤湿度大于设定阈值时触发报警,提醒用户土壤湿度过高;支持通过蜂鸣器报警开关取消报警。
(6)土壤湿度传感器:检测土壤的湿度值,为系统判断是否需要开启水泵灌溉提供数据依据。
(7)DHT11 温湿度传感器:检测环境的温度和湿度,用于触发风扇启停等相应控制动作。
(8)HC-05蓝牙模块:连接手机,实现手机与系统的数据交互,用户可通过手机查看传感器数据或远程控制。
(9)4 个按键:第 1 个按键:模式切换按键,用于在手动模式和自动模式之间切换。第 2-4 个按键:在自动模式下,用于设置土壤湿度、温度、湿度的阈值;在手动模式下,用于直接控制外设(如水泵、风扇等)。
2.3、控制模式
(1)自动模式:
上电默认模式,系统根据传感器检测值与设定阈值的对比自动执行动作:
当土壤湿度<设定阈值时,打开水泵进行灌溉;
当环境温度>设定阈值时,打开风扇;
当土壤湿度>设定阈值时,触发蜂鸣器报警(可通过报警开关取消)。
支持通过第 2-4 个按键进入阈值设置界面,调整土壤湿度、温度等参数的触发阈值。
(2)手动模式:
通过第 1 个按键切换至手动模式,此时可通过按键直接控制外设启停。
2、演示视频和实物
基于STM32的智能抽水灌溉系统设计
3、系统设计框图
4、软件设计流程图
5、原理图
6、主程序
#include "sys.h" //头文件
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
淘宝:5132单片机设计
哔哩哔哩:5132单片机设计
CSDN: 5132单片机设计
公众号: 5132单片机设计
抖音 : 5132单片机设计
小红书: 5132单片机设计
咸鱼: 5132单片机设计
************************************************************************************************/
#include "delay.h"
#include "led.h"
#include "Key.h"
#include "Buzzer.h"
#include "OLED.h"
#include "AD.h"
#include "MyRTC.h"
#include "dht11.h"
#include "Serial.h"char result[100];
uint32_t bufe[5]; //存储传感器采集的数据
uint16_t AD4; //存储4路ADC值
uint8_t RxData; //蓝牙接收到的数据
uint32_t WenYu = 40; //光照强度阈值上限
uint32_t ShiYu = 40; //光照强度阈值下限
uint32_t TuShiYu = 40; //光照强度阈值下限u8 temp, humi; //存放温湿度
u8 state, state2, state2_1,state2_2,state3; //按键状态标志
u8 t = 0; //传感器读取时间间隔
uint8_t KeyNum; //存储按键值void shoudong()
{if (KeyNum == 2) //按键{delay_ms(20);if (KeyNum == 2){state2++;if (state2 > 1){state2 = 0;}}}if (state2 == 0){FengShan_ON();}if (state2 == 1){FengShan_OFF();}if (KeyNum == 3) //按键{delay_ms(20);if (KeyNum == 3){state2_1++;if (state2_1 > 1){state2_1 = 0;}}}if (state2_1 == 0){ShuiBen_ON();}if (state2_1 == 1){ShuiBen_OFF();}if (KeyNum == 4) //按键{delay_ms(20);if (KeyNum == 4){state2_2++;if (state2_2 > 1){state2_2 = 0;}}}if (state2_2 == 0){Buzzer_Turn();}if (state2_2 == 1){Buzzer_OFF();}if (Serial_GetRxFlag() == 1){RxData = Serial_GetRxData(); //蓝牙接收switch (RxData){case 1:state2++;if (state2 > 1){state2 = 0;}break;case 2:state2_1++;if (state2_1 > 1){state2_1 = 0;}break;case 3:state2_2++;if (state2_2 > 1){state2_2 = 0;}break;default:break;}}
}
void zhidong()
{ if(bufe[2]<TuShiYu){ShuiBen_ON(); }else{ShuiBen_OFF(); }if(bufe[0]>WenYu){FengShan_ON(); }else{FengShan_OFF(); } if(bufe[1]>ShiYu){Buzzer_Turn(); }else{Buzzer_OFF(); } if (KeyNum == 2) //自动模式下PB0按键控制阈值切换{delay_ms(20);if (KeyNum == 2){state3++;if (state3 > 2){state3 = 0;}}}if (state3==1){if (KeyNum == 3)WenYu++; //光照强度上限加if (KeyNum == 4)WenYu--; //光照强度上限减}if (state3==2){if (KeyNum == 3)ShiYu++;if (KeyNum == 4)ShiYu--;}if (state3==0){if (KeyNum == 3)TuShiYu++;if (KeyNum == 4)TuShiYu--;}
}
int main(void)
{NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级delay_init(); //延时函数初始化LED_Init(); //初始化与LED连接的硬件接口DHT11_Init();Buzzer_Init(); //下面为外设初始化OLED_Init();Key_Init();AD_Init();Serial_Init(); //串口1初始化MyRTC_Init();OLED_ShowChinese(2, 1, 63);OLED_ShowChinese(2, 2, 64);OLED_ShowChinese(2, 3, 65);OLED_ShowChinese(2, 4, 66);OLED_ShowString(2, 9, ":"); OLED_ShowChinese(3, 1, 26);OLED_ShowChinese(3, 2, 28);OLED_ShowString(3, 5, ":"); OLED_ShowChinese(3, 5, 27);OLED_ShowChinese(3, 6, 28);OLED_ShowString(3, 13, ":");OLED_ShowChinese(4, 1, 67);OLED_ShowChinese(4, 2, 68);OLED_ShowString(4, 5, ":"); OLED_ShowString(1, 5, "XX:XX:XX"); while (1){MyRTC_ReadTime(); //读取时间(每一个页面都有时间显示)OLED_ShowNum(1, 5, MyRTC_Time[3], 2); //时OLED_ShowNum(1, 8, MyRTC_Time[4], 2); //分OLED_ShowNum(1, 11, MyRTC_Time[5], 2); //秒DHT11_Read_Data(&temp,&humi); //读取温湿度并显示在OLED上bufe[0]=temp; bufe[1]=humi;OLED_ShowNum(3, 6, bufe[0], 2);OLED_ShowNum(3, 14, bufe[1], 2);OLED_ShowNum(4, 6, TuShiYu, 2);OLED_ShowNum(4, 10, WenYu, 2);OLED_ShowNum(4, 14, ShiYu, 2);if (t % 10 == 0){ bufe[2] = TS_GetData(ADC_Channel_4); //土壤传感器 PA4
// if (AD4 > 4000)AD4 = 4000;
// bufe[2] = (u8)(100 - (AD4 / 40));OLED_ShowNum(2, 10, bufe[2], 3);OLED_ShowString(2, 13, "%"); }t++;Serial_SendString(result); sprintf(result, " Wen=%d, Shi=%d,\n TuRangShiDu=%d", bufe[0], bufe[1], bufe[2]);KeyNum = Key_GetNum();if (KeyNum == 1){delay_ms(20);if (KeyNum == 1){state++;if (state > 1){state = 0;}}}if (state == 0) //自动模式{OLED_ShowChinese(1, 7, 51);OLED_ShowChinese(1, 8, 52);zhidong();}if (state == 1) //手动模式{OLED_ShowChinese(1, 7, 18);OLED_ShowChinese(1, 8, 52);shoudong();} }
}
7、总结
本文介绍了一个基于STM32F103C8T6的智能抽水灌溉系统设计。系统硬件包括核心控制板、继电器、传感器(土壤湿度、DHT11温湿度)、OLED显示屏、蜂鸣器和蓝牙模块等。系统支持两种工作模式:自动模式下根据传感器数据自动控制水泵和风扇;手动模式下可通过按键或蓝牙远程控制外设。软件设计采用模块化编程,实现数据采集、阈值设置、设备控制等功能。该项目实现了智能化农业灌溉,具有实时监测、自动控制和远程管理等特点,为现代农业灌溉提供了实用解决方案。