"我们不做一锤子买卖,只做技术成长的长期伙伴!"STM32项目分享:
目录
一、视频展示
二、项目简介
题目:基于 STM32 的智能植物生长监控系统设计
主控:STM32
显示:OLED显示屏
DHT11温湿度传感器
光照传感器
土壤湿度传感器
PH监测
usb小灯
通信:蓝牙
控制模块:灌溉继电器➕卷帘门、继电器
声光报警:LED+蜂鸣器
功能:
1、实时监测当前温湿度,光照,土壤湿度,和PH值并显示在屏幕上,可按键查看阈值。
2、可通过按键设置阈值,包括土壤湿度阈值,光照阈值,最大ph阈值。
3、蓝牙接收当前数据信息,也可控制单片机。
4、可切换为手动模式和自动模式
5、手动模式下可自己打开和关闭灌溉继电器。
7、当光照低于阈值后则关闭卷帘门(夜晚);当光照高于阈值时,打开卷帘门(白天),
当土壤湿度低于阈值或PH高于阈值时,打开灌溉,当高于时关闭。
三、原理图设计

四、PCB硬件设计


五、程序设计
#include "stm32f10x.h" // Device header
#include "delay.h"
#include "lcd.h"
#include "dht11.h"
#include "IOput.h"
#include "usart.h"
#include "timer.h"
#include "adc.h"
#include "pwm.h"
extern u8 res;
u8 light,water,ph,count,open_flag=0;
u8 show_flag,show1_flag,max_wd=30,max_LIGHT=40,dec_TS=10,max_PH=9,mode_flag=0;
int main (void)
{
delay_init();
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
DHT11_Init();
OLED_Init();
delay_ms(1);
OLED_Clear();
output_init();
input_init();
Usart1_Init(9600);
TIM_PWM_Init(71,9999);
Adc_Init();
while(1)
{
count++;
if(res=='a')
{
OLED_Clear();
set_flag=1;
res=0;
}
else if(res=='b')
{
OLED_Clear();
add_flag=1;
res=0;
}
else if(res=='c')
{
OLED_Clear();
dec_flag=1;
res=0;
}
light=100-Get_Adc_Average(0,10)*100/4096;
water=100-Get_Adc_Average(4,10)*100/4096;
ph = (Get_Adc_Average(5, 10) * 3.3 / 4096) * (-5.7541) + 16.654; // 计算pH值
DHT11_Read_Data(&temp,&humi);
key_scan(1,0,0);
if(set_flag==1 && show_flag!=1)
{
show1_flag=0;
set_flag=0;
show_flag++;
if(show_flag>=2)
{
show_flag=0;
}
}
if(show_flag==0)
{
OLED_ShowCH(0,0,"植物生长监控系统");
OLED_ShowCH(0,2,"温度:");
OLED_ShowNum(40,2,temp,2,16);
OLED_ShowCH(0,4,"湿度:");
OLED_ShowNum(40,4,humi,2,16);
OLED_ShowCH(64,2,"光照:");
OLED_ShowNum(104,2,light,2,16);
OLED_ShowCH(64,4,"土湿:");
OLED_ShowNum(104,4,water,2,16);
OLED_ShowCH(0,6,"P H:");
OLED_Showdecimal(40,6,ph,2,2,16);
if(add_flag==1)
{
mode_flag++;
add_flag=0;
if(mode_flag>=2)
mode_flag=0;
}
if(mode_flag==0)
{
OLED_ShowCH(96,6,"手动");
if(dec_flag==1)
{
open_flag++;
dec_flag=0;
if(open_flag>=8)
open_flag=0;
}
if(open_flag==0)
{
TIM_SetCompare2(TIM2,0);
JDQ1=1;
JDQ2=1;
}
else if(open_flag==1)
{
TIM_SetCompare2(TIM2,0);
JDQ1=1;
JDQ2=0;
}
else if(open_flag==2)
{
TIM_SetCompare2(TIM2,0);
JDQ1=0;
JDQ2=1;
}
else if(open_flag==3)
{
TIM_SetCompare2(TIM2,0);
JDQ1=0;
JDQ2=0;
}
else if(open_flag==4)
{
TIM_SetCompare2(TIM2,70);
JDQ1=1;
JDQ2=1;
}
else if(open_flag==5)
{
TIM_SetCompare2(TIM2,70);
JDQ1=1;
JDQ2=0;
}
else if(open_flag==6)
{
TIM_SetCompare2(TIM2,70);
JDQ1=0;
JDQ2=1;
}
else if(open_flag==7)
{
TIM_SetCompare2(TIM2,70);
JDQ1=0;
JDQ2=0;
}
}
else
{
OLED_ShowCH(96,6,"自动");
if(light>=max_LIGHT)
{
JDQ1=0;
TIM_SetCompare2(TIM2,0);
}
else
{
JDQ1=1;
TIM_SetCompare2(TIM2,100-light);
}
if(ph>=max_PH || water<=dec_TS || temp>=max_wd)
{
BEEP=0;
if(ph>=max_PH || water<=dec_TS)
JDQ2=0;
}
else
{
BEEP=1;
JDQ2=1;
}
}
}
if(show_flag==1)
{
OLED_ShowCH(0,0,"最高温度:");
OLED_ShowCH(0,2,"最低土湿:");
OLED_ShowCH(0,4,"最高光照:");
OLED_ShowCH(0,6,"最大P H:");
OLED_ShowNum(72,0,max_wd,2,16);
OLED_ShowNum(72,2,dec_TS,2,16);
OLED_ShowNum(72,4,max_LIGHT,2,16);
OLED_ShowNum(72,6,max_PH,2,16);
if(set_flag==1&&show_flag==1)
{
set_flag=0;
show1_flag++;
if(show1_flag>=4)
{
show_flag=0;
OLED_Clear();
}
}
if(show1_flag==0)
{
OLED_ShowCH(112,0,"←");
if(add_flag==1)
{
add_flag=0;
max_wd++;
}
if(dec_flag==1)
{
dec_flag=0;
max_wd--;
}
if(max_wd>=100 || max_wd<=0){max_wd=0;}
}
if(show1_flag==1)
{
OLED_ShowCH(112,2,"←");
if(add_flag==1)
{
add_flag=0;
dec_TS++;
}
if(dec_flag==1)
{
dec_flag=0;
dec_TS--;
}
if(dec_TS>=100 || dec_TS<=0){dec_TS=0;}
}
if(show1_flag==2)
{
OLED_ShowCH(112,4,"←");
if(add_flag==1)
{
add_flag=0;
max_LIGHT++;
}
if(dec_flag==1)
{
dec_flag=0;
max_LIGHT--;
}
if(max_LIGHT>=100 || max_LIGHT<=0){max_LIGHT=0;}
}
if(show1_flag==3)
{
OLED_ShowCH(112,6,"←");
if(add_flag==1)
{
add_flag=0;
max_PH++;
}
if(dec_flag==1)
{
dec_flag=0;
max_PH--;
}
if(max_PH>=15 || max_PH<=0){max_PH=0;}
}
}
if(count>=100)
{
count=0;
UsartPrintf(USART1,"温度:%d\r\n",temp);
UsartPrintf(USART1,"湿度:%d\r\n",humi);
UsartPrintf(USART1,"土壤湿度:%d\r\n",water);
UsartPrintf(USART1,"PH:%d\r\n",ph);
UsartPrintf(USART1,"光照:%d\r\n",light);
}
}
}
六、资料分享
点击即可查看当前资料分享。