一.系统概述
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;
}
}