STM32开发实例_基于STM32单片机的智能鱼缸系统(电路图+程序+流程图)24-32-146

一.系统概述

1.数据采集:系统可实时监测环境光照强度,通过光照传感器采集数据,并将数据传输至STM32进行处理。系统能够检测环境温度,采集到的温度数据将显示在界面上,并用于后续控制。该模块用于检测水箱液位,确保水位在设定范围内,以防干涸或溢出。
2.显示:系统将通过显示屏显示实时采集到的光照、温度和液位数据,便于用户即时获取信息。
3.阈值设置:用户可以通过按钮输入界面设定温度、液位和光照强度的阈值。
4.控制温度:当温度低于设定值时,系统将自动控制加热器启动,以提高环境温度。
5.控制液位:当液位低于设定值时,系统将控制水泵启动,补充水源,确保液位达到安全范围。
6.控制开灯:当光照低于设定阈值时,系统将控制LED灯亮起,增加环境光照。
7.时钟模块与定时投喂:系统集成了实时时钟模块,能够实时读取时间。用户可以设定投喂时间,当系统时间达到设定时间时,将自动控制舵机旋转,实现定时投喂。
8.无线通信功能:系统配备了无线通信模块,能够将实时采集到的数据上传至移动应用程序(APP),用户可以通过APP远程查看各项传感器数据,并进行相应的控制和设置。

二.电路设计

电路图采用Altium Designer进行设计:
1.通过STM32F103C8T6单片机作为系统主控,最小系统电路是整个电路的核心;
2.使用独立按键进行阈值设定和,按键的一端接地,一端接单片机的GPIO口;
3.通过ESP8266-01S将检测到数据上传到APP端,通过UART串口与单片机进行通信;
4.通过0.96寸的OLED12864进行数据显示,采用IIC总线的形式与单片机进行通信;
5.通过DS18B20进行温度检测,并通过单总线与单片机完成数据通信;
6.通过DS1302实现时钟定时,并通过SDA、SCK、DAT三个引脚与单片机进行连接;
7.使用铜制水位感应板的电阻式水位传感器,传感器的模拟端与单片机的模拟输入端相接;
8.使用光敏电阻模块进行光强检测,传感器的模拟端与单片机的模拟输入端相接。

三.程序设计

#include "stm32f10x.h"
#include "key.h"
#include "sys.h" 
#include "delay.h"
#include "Beep_Led_Relay.h"
 float  pre,ye;u16 temp;
 /************************************************
版权:小常硬件
公众号:微信搜索“小常硬件“在公众号免费下载相关资料
************************************************/								  
unsigned char wei = 0,shu=0;  
extern u8 time_buf[8];
u16 Servor_CPWM_Set_Buffer[9]={1500,1500,1500,1500,1500,1500,1500,1500,1500};
/****************************************

按键初始化函数

****************************************/
void KEY_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_key_GPIO_Port,ENABLE);//使能时钟

	GPIO_InitStructure.GPIO_Pin  = Key_GPIO_Pin_num|Key_GPIO_Pin_num1|Key_GPIO_Pin_num2|Key_GPIO_Pin_num3|Key_GPIO_Pin_num4;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(Key_GPIO_Port, &GPIO_InitStructure);//初始化GPIO
}

void KEY1_Init(void) //IO初始化
{ 
 	GPIO_InitTypeDef GPIO_InitStructure;
 
 	RCC_APB2PeriphClockCmd(RCC_APB2Periph_key1_GPIO_Port,ENABLE);//使能时钟

	GPIO_InitStructure.GPIO_Pin  = Key1_GPIO_Pin_num|Key1_GPIO_Pin_num1|Key1_GPIO_Pin_num2|Key1_GPIO_Pin_num3;//KEY0-KEY2
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
 	GPIO_Init(Key1_GPIO_Port, &GPIO_InitStructure);//初始化GPIO
}

/********重量去皮控制按键初始化*******
以下按键的初始化只针对重量传感器的去皮按键初始化
不是去皮的按键不需要以下
*************************************/


//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//0,没有任何按键按下
//1,KEY0按下
//2,KEY1按下
//3,KEY3按下 
//注意此函数有响应优先级,KEY0>KEY1>KEY2!!
u8 KEY_Scan(u8 mode)
{	 
	static u8 key_up=1;//按键按松开标志   static 为了执行该子函数的时候该变量不会每次都会被初始化
	if(mode)key_up=1;  //支持连按		  
	if(key_up&&(KEY0==0||KEY1==0||KEY2==0))
	{
		delay_ms(10);//去抖动 
		key_up=0;
		if(KEY0==0)return KEY0_PRES;
		else if(KEY1==0)return KEY1_PRES;
		else if(KEY2==0)return KEY2_PRES;
	}else if(KEY0==1&&KEY1==1&&KEY2==1)key_up=1; 	    
 	return 0;// 无按键按下
}


/*************设定一个参数******/
void Limit_Value_Set_1(u16 *B_Ma)
{
	u8 Key_Flag=0;
	static u8 Parameter_Select=0;
	Key_Flag=KEY_Scan(1);            //支持连续按
	if(Key_Flag==KEY0_PRES)          //完成需要设定的参数选择
	{
		Parameter_Select++;
		if(Parameter_Select==2)
		{
			Parameter_Select=0;
		}
	}
	if((Parameter_Select==1)&&(Key_Flag==KEY1_PRES))  //选定参数后++
	{
		  *B_Ma +=1;
	}
	if((Parameter_Select==1)&&(Key_Flag==KEY2_PRES))  //选定参数后--
	{
		  *B_Ma -=1;
	}
}
/***********设定两个参数************/
void Limit_Value_Set_2(u16 *T_Ma,u16 *H_Ma)
{
	u8 Key_Flag=0;
	static u8 Parameter_Select=0;
	Key_Flag=KEY_Scan(1);            //支持连续按
	if(Key_Flag==KEY0_PRES)          //完成需要设定的参数选择
	{
		Parameter_Select++;
		if(Parameter_Select==3)
		{
			Parameter_Select=0;
		}
	}
	if((Parameter_Select==1)&&(Key_Flag==KEY1_PRES))  //选定参数后++
	{
		  *T_Ma +=1;
	}
	if((Parameter_Select==1)&&(Key_Flag==KEY2_PRES))  //选定参数后--
	{
		  *T_Ma -=1;
	}
	if((Parameter_Select==2)&&(Key_Flag==KEY1_PRES))  //选定参数后++
	{
		  *H_Ma +=1;
	}
	if((Parameter_Select==2)&&(Key_Flag==KEY2_PRES))  //选定参数后--
	{
		  *H_Ma -=1;
	}
}

/**************************************
判断按键是否按下 完成控制标志位的设定
需要几个按键控制  可以根据设定需要对形参数量进行修改
*****************************************/
void Key_Control_Handle(_Bool *Key_0_Press_Fla,_Bool *Key_1_Press_Fla,u8 *Key_0_Num)
{
	u8 Key_Flag=0;
	static  u8 Key_0_Num_Count=0;
	Key_Flag=KEY_Scan(0);//不支持连续按
	
	if(Key_Flag==KEY0_PRES)
	{
		*Key_0_Press_Fla=1;
		Key_0_Num_Count++;
		*Key_0_Num=Key_0_Num_Count;
		if(Key_0_Num_Count==3)
		{
			Key_0_Num_Count=0;
		  *Key_0_Num=*Key_0_Num;
		}
	}
	if(Key_Flag==KEY1_PRES)
	{
		*Key_1_Press_Fla=1;
	}
}

/**************************************
一个按键进行控制
*****************************************/
void One_Key_Control_Handle(_Bool *Key_0_Press_Fla)
{
	u8 Key_Flag=0;
	Key_Flag=KEY_Scan(0);//不支持连续按
	
	if(Key_Flag==KEY0_PRES)
	{
		*Key_0_Press_Fla=1;
	}

}

四.资料内容

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小常硬件

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值