基于STM32的智能植物生长监控系统设计

"我们不做一锤子买卖,只做技术成长的长期伙伴!"STM32项目分享:

目录

一、视频展示

二、项目简介

三、原理图设计

四、PCB硬件设计

五、程序设计

六、资料分享


一、视频展示

基于 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);
		
		}
	}
}

六、资料分享

点击即可查看当前资料分享。

相关推荐
悠哉悠哉愿意3 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
Lester_11013 天前
STM32霍尔传感器输入口设置为复用功能输入口时,还能用GPIO函数直接读取IO的状态吗
stm32·单片机·嵌入式硬件·电机控制
LCG元3 天前
低功耗显示方案:STM32L0驱动OLED,动态波形绘制与优化
stm32·嵌入式硬件·信息可视化
三佛科技-187366133973 天前
120W小体积碳化硅电源方案(LP8841SC极简方案12V10A/24V5A输出)
单片机·嵌入式硬件
z20348315203 天前
STM32F103系列单片机定时器介绍(二)
stm32·单片机·嵌入式硬件
古译汉书3 天前
【IoT死磕系列】Day 7:只传8字节怎么控机械臂?学习工业控制 CANopen 的“对象字典”(附企业级源码)
数据结构·stm32·物联网·http
Alaso_shuang3 天前
STM32 核心输入、输出模式
stm32·单片机·嵌入式硬件
脚后跟3 天前
AI助力嵌入式物联网项目全栈开发
嵌入式硬件·物联网·ai编程
2501_918126913 天前
stm32死锁是怎么实现的
stm32·单片机·嵌入式硬件·学习·个人开发
z20348315203 天前
STM32F103系列单片机定时器介绍(一)
stm32·单片机