🤞🤞大家好,这里是5132单片机毕设设计项目分享,今天给大家分享的是智慧农场控制系统。
设计的详细功能见网盘中的文章《17、基于STM32的智慧农场控制系统设计》:
链接:https://pan.baidu.com/s/1uWSZX2zbZwy9sYwwnvyktQ?pwd=5132
提取码:5132
目录
1、系统功能
本设计的题目是智慧农场,元器件采用了STM32F103C8T6作为主控,
1)传感器:DHT11来检测农村的温湿度,土壤湿度传感器来检测土壤湿度,光敏传感器用来检测光照强度,hc05蓝牙模块实现远程控制.
2)输出设备:水泵(灌溉),LED(补光),舵机(模拟施肥),风扇,蜂鸣器报警模块
3)OLED显示屏用来显示传感器数据和控制模式。
本系统的控制模式设计了3种:自动模式、手动模式,远程控制,可以随意调节模式,实现智能控制。
1、自动模式:当空气的温度大于设定阈值,打开风扇,土壤湿度小于设定阈值,打开水本灌溉,当空气的湿度大于设定阈值,蜂鸣器报警,当光照强度设定阈值,打开LED,
2、手动模式:利用按键手动控制水泵、排风扇、LED和舵机的开关,同时手机蓝牙APP也可以远程控制,并且可以调节传感器阈值。
3、演示视频和实物
基于STM32的智慧农场控制系统
4、系统设计框图
5、软件设计流程图
6、原理图
7、主程序
#include "sys.h" //有定制的,可以联系VX:lwfw123456789
#include "delay.h"
#include "led.h"
#include "dht11.h"
#include "Serial.h"
#include "Servo.h"
/***********************************************************************************************
同学好!我们是5132单片机设计,定制单片机设计,实物和说明书均可定制,欢迎大家咨询。VX:lwfw123456789
其他项目演示视频和说明请大家移步哔哩哔哩、CSDN和公众号等。
哔哩哔哩:5132单片机设计
CSDN: 5132单片机设计
公众号: 5132单片机设计
抖音 : 5132单片机设计
小红书: 5132单片机设计
咸鱼: 5132单片机设计
************************************************************************************************/
typedef struct
{
u8 Temp;
u8 Humi;
u8 TuRangShiDu;
u8 Guang;
} Sensor;
Sensor Sensor1;
uint32_t bufe[5]; //存储传感器采集的数据
uint16_t AD0, AD2; //存储4路ADC值
uint8_t RxData; //蓝牙接收到的数据
uint32_t WenYu = 30; //光照强度阈值上限
uint32_t ShiYu = 70; //光照强度阈值下限
uint32_t TuShiYu = 40; //光照强度阈值下限
uint32_t GuangYu = 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 == 1)
{
FengShan_ON();
}
if (state2 == 0)
{
FengShan_OFF();
}
if (KeyNum == 3) //按键
{
delay_ms(20);
if (KeyNum == 3)
{
state2_1++;
if (state2_1 > 1)
{
state2_1 = 0;
}
}
}
if (state2_1 == 1)
{
ShuiBen_ON();
}
if (state2_1 == 0)
{
ShuiBen_OFF();
}
if (KeyNum == 4) //按键
{
delay_ms(20);
if (KeyNum == 4)
{
state2_2++;
if (state2_2 > 1)
{
state2_2 = 0;
}
}
}
if (state2_2 == 1)
{
Servo_SetAngle(90);
}
if (state2_2 == 0)
{
Servo_SetAngle(9);
}
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 (Sensor1.TuRangShiDu < TuShiYu)
{
ShuiBen_ON();
}
else
{
ShuiBen_OFF();
}
if (Sensor1.Temp > WenYu)
{
FengShan_ON();
}
else
{
FengShan_OFF();
}
if (Sensor1.Humi > ShiYu)
{
Buzzer_Turn();
}
else
{
Buzzer_OFF();
}
if (Sensor1.Guang < GuangYu)
{
LED_ON();
}
else
{
LED_OFF();
}
if (KeyNum == 2) //自动模式下PB0按键控制阈值切换
{
delay_ms(20);
if (KeyNum == 2)
{
state3++;
if (state3 > 3)
{
state3 = 0;
}
}
}
if (state3 == 2)
{
if (KeyNum == 3)WenYu++; //光照强度上限加
if (KeyNum == 4)WenYu--; //光照强度上限减
}
if (state3 == 3)
{
if (KeyNum == 3)ShiYu++;
if (KeyNum == 4)ShiYu--;
}
if (state3 == 0)
{
if (KeyNum == 3)TuShiYu++;
if (KeyNum == 4)TuShiYu--;
}
if (state3 == 1)
{
if (KeyNum == 3)GuangYu++;
if (KeyNum == 4)GuangYu--;
}
}
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();
Servo_Init(); //舵机初始化,并设置舵机初始角度
OLED_ShowChinese(2, 1, 63);
OLED_ShowChinese(2, 2, 65);
OLED_ShowString(2, 5, ":");
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(2, 5, 53);
OLED_ShowChinese(2, 6, 54);
OLED_ShowString(2, 13, ":");
OLED_ShowString(1, 1, "XX:XX:XX");
while (1)
{
MyRTC_ReadTime(); //读取时间(每一个页面都有时间显示)
OLED_ShowNum(1, 1, MyRTC_Time[3], 2); //时
OLED_ShowNum(1, 4, MyRTC_Time[4], 2); //分
OLED_ShowNum(1, 7, MyRTC_Time[5], 2); //秒
OLED_ShowNum(4, 2, TuShiYu, 2);
OLED_ShowNum(4, 6, GuangYu, 2);
OLED_ShowNum(4, 10, WenYu, 2);
OLED_ShowNum(4, 14, ShiYu, 2);
if (t % 10 == 0)
{
DHT11_Read_Data(&Sensor1.Temp, &Sensor1.Humi); //读取温湿度并显示在OLED上
OLED_ShowNum(3, 6, Sensor1.Temp, 2);
OLED_ShowNum(3, 14, Sensor1.Humi, 2);
AD2 = AD_GetValue(ADC_Channel_2); //土壤传感器 PA4
if (AD2 > 4000)AD2 = 4000;
Sensor1.TuRangShiDu = (u8)(100 - (AD2 / 40));
OLED_ShowNum(2, 6, Sensor1.TuRangShiDu, 2);
OLED_ShowString(2, 8, "%");
AD0 = AD_GetValue(ADC_Channel_0); //土壤传感器 PA4
if (AD0 > 4000)AD0 = 4000;
Sensor1.Guang = (u8)(100 - (AD0 / 40));
OLED_ShowNum(2, 14, Sensor1.Guang, 2);
OLED_ShowString(2, 16, "%");
}
t++;
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();
}
}
}
8、总结
本设计以 STM32F103C8T6 为主控,用 DHT11、土壤湿度、光敏传感器检测农场温湿度、土壤湿度和光照强度,通过蓝牙 HC05 远程控制。输出设备包括水泵、LED、舵机、风扇等,OLED 屏显示数据与模式,还设蜂鸣器报警。