毕设:基于STM32的智能鱼缸水质检测系统(包含源码、硬件设计和论文)
文章目录
0 前言
🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。
为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是
🚩 毕业设计 stm32智能鱼缸水质检测系统(源码+硬件+论文)
🥇学长这里给一个题目综合评分(每项满分5分)
🧿 项目分享:见文末!
1 主要功能
本系统由STM32F103C8T6单片机核心板、TFT1.44寸彩屏液晶显示电路、TDS电导率检测电路、浑浊度检测传感器电路、PH值检测传感器电路、超声波水位检测电路、DS18B20温度采集电路、 (无线蓝牙) 、蜂鸣器报警驱动电路、按键电路及电源组成。
[1]本系统通过单片机实时采集温度(单位度)、水位(单位mm)、浑浊度(0-99) 、 电导率(单位S/m)、PH值等参数,并且每个数据都对应-一个设置阈值。单片机驱动TFT彩屏实时显示所有参数以及蜂鸣器报警状态。
[2]上电初始化,液晶显示相应标题。液晶显示相应数据。可以通过按键设置所有参数的对应的阈值,通过按键K1进入设置及切换设置选型,其中K2、K3可以对设置阈值进行加减处理,设置过程中对应位置有“<”指示。当采集到的数据超过对应的阈值,蜂鸣器报警,同事液晶相应的参数显示成红色,液晶显示报警状态;如果所有参数都处于设置阈值范围内,蜂鸣器不报警,参数对应显示为白色,液晶报警状态显示
[4]本设计中,温度是防水形式的,可以直接放到水中测量温度。浑浊度参数通过AD转换获取数据,通过运算将采集到的数据转换为0-99,比较直观的理解。注意, PH的检测模块需要校准使用,对于已经校准过的PH传感器,- -定不要去随意调节传感器模块上面的电位器,否则测量就不在准确了!
[5]设计中设置的阈值参数保存到单片机Flash中,具有掉电不丢失功能。该设计牵扯到水的操作,没有必要不要用水操作, 能演示即可。直接加水容易造成电路板短路,注意电路板安全。
[6]超声波测距是根据超声波发出和接收时间差,表示声波来回路程需要的时间,声波速度是固定的,从而计算距离。
APP能够连接板载无线模块,查看相应数据;
APP能够操作上述存在的功能操作。
APP能够发送指令/或者接收指令。完成功能的使用,具有强大的实用性功能,方便快捷.
2 硬件设计(原理图)
3 核心软件设计
关键代码
#include "my_include.h"
#define F_SIZE 12 //������ʾ�����С ������ʾҪ��������ģ�ſ���
#define MyLCD_Show(m,n,p) LCD_ShowString(LCD_GetPos_X(F_SIZE,m),LCD_GetPos_Y(16,n),p,F_SIZE,false) //��ʾ����
#define X_PLACE 0//��ʾλ��x����ֵ
//#define MyLCD_ShowSmall(m,n,p) LCD_ShowString(LCD_GetPos_X(12,m),LCD_GetPos_Y(12,n),p,12,false) //��ʾ����
void scanKeyAnddealKey(void);
void My_ESP8266_SendStrStr(USART_TypeDef* USARTx, const char *str);
unsigned char makeSureLinkCount=0; //ȷ�����ӱ���
void displayOfCollectedData(void);//��ʾ�ɼ���������
#define ADDR_FLASH_WRITE (FLASH_BASE_ADDR+STM32_FLASH_SIZE*1024-STM_SECTOR_SIZE*1)
int16 saveData[6] = {35,500,25,65,85};
unsigned char setFlag = 0;//���ñ�־
#define setTemp saveData[0] //��������ֵ��flash��
#define setDis saveData[1] //��������ֵ��flash��
#define setHzVal saveData[2] //��������ֵ��flash��
#define setTdsVal saveData[3] //��������ֵ��flash��
#define setPh saveData[4] //��������ֵ��flash��
//u16 setTemp = 35 ;//���� ��ֵ
//u16 setDis = 500 ;//���� ��ֵ
//u16 setHzVal = 40 ;//���� ��ֵ
//u16 setTdsVal = 65 ;//���� ��ֵ
//u16 setPh = 8 ;//���� ��ֵ
unsigned int i; //���� i
char dis0[200];//Һ����ʾ�ݴ�����
char dis1[23];//Һ����ʾ�ݴ�����
char dis2[23];//Һ����ʾ�ݴ�����
char dis3[23];//Һ����ʾ�ݴ�����
char dis4[23];//Һ����ʾ�ݴ�����
char dis5[23];//Һ����ʾ�ݴ�����
char dis6[23];//Һ����ʾ�ݴ�����
u16 yPlace = 0; //��ʾλ��y����ֵ
float nowTemp = 0;//��ǰ�¶�
u16 nowDis = 0;//��ǰ����
float adcx = 0;//adc�ɼ�
float adcx1 = 0;//adc�ɼ�
float phVal = 10.2; //ph ֵ
u16 nowHzVal = 0;//���Ƕ�
u16 nowTdsVal = 0;//�絼��
u8 errFlag = 0 ;//����״̬
u8 needWriteFlash = 0;//�Ƿ���Ҫд��flash����
u8 startCheckWireLess = 0;//���������������
u8 wirelessFlag = 0;//�������� 0������������ 1wifi
int main(void)
{
USARTx_Init(USART1,9600);//���ڳ�ʼ��Ϊ9600
USARTx_Init(USART2,9600);//���ڳ�ʼ��Ϊ9600
My_KEY_Init();//��ʼ������
My_LED_Init(); //�����ʼ��
My_ADC_Init(ADC1);//��ʼ��adc
My_DS18B20_Init(PA6);//��ʼ��DS18B20
My_UltWave_Init();
My_STMFlash_SectorSaveInit(ADDR_FLASH_WRITE,saveData,sizeof(saveData));//��ʼ��flash����
buzzer =1;//�ϵ綯����
delay_ms(100);
buzzer = 0;//�ر�
LCD_Init(); //tft��ʼ��
LCD_Clear(Color16_BLACK);//��ȫ��
BACK_COLOR=Color16_BLACK;FRONT_COLOR=Color16_RED; //������ʾ��ɫ
MyLCD_Show(2,0,"����ˮ�ʼ��ϵͳ");//��ʾ
FRONT_COLOR=Color16_YELLOW;
MyLCD_Show(0,1,"Init ... ");//��ʾ
i = 5;startCheckWireLess=1;//������� һ��ʱ��ȡ��
while(i-- && wirelessFlag == 0) //��ʱ�ж�����������
{USARTSendString(USART1,"AT\r\n"); delay_ms(100);} //�ڴ����м�ⷵ�� OK��ʾWIFI �����ʾ������������
//�����������ͷ����������ʹ��
startCheckWireLess = 0;//ȡ�����
if(wirelessFlag == 1)
{
i = 50;while(i--){delay_ms(100);} //wifi���� ������ʱ5s������
USARTSendString(USART1,"AT+CIPMUX=1\r\n");//������
delay_ms(50);
USARTSendString(USART1,"AT+CIPSERVER=1,8080\r\n");//�����˿ں�
delay_ms(50); //����������� ������
}
MyLCD_Show(0,1," �ɼ�ֵ ��ֵ ");//��ʾ
// needWriteFlash =40;// ֻҪ��Ϊ0 ���������Զ�����
while(1)
{
scanKeyAnddealKey();//����ɨ�輰����
if(myReadFlag_tick == true ) //��ʱ��ȡʱ�䵽
{
myReadFlag_tick = false; //�����־
adcx1 =(float) My_ADC_GetValue(ADC1,ADC_Channel_5)*3.3/4096*2;//��ȡad�ɼ�*2��Ϊ�з�ѹ����
// nowHzVal = -865.68*adcx1+3291.3;//������Ƕȸ�����������
if(adcx1<=0.4)nowHzVal = 99;//���ݴ���
else if(adcx1>3.0){nowHzVal=0;} //ͨ��ת������ȡ����0.4-3ת��Ϊ0-99 ���в�������ʵ�ʲ��Ի�õ�
else
{nowHzVal =100 - (adcx1-0.3)*100/(3.05-0.3);}//ת��
adcx =(float) My_ADC_GetValue(ADC1,ADC_Channel_4)*3.3/4096*2;//��ȡad�ɼ�*2��Ϊ�з�ѹ����
phVal= adcx;//����phֵ
phVal= adcx *(-5.7482)+16.509;//����phֵ
if((phVal > 14)||(phVal < 0)) phVal = 7.7;
nowDis = My_UltWave_GetDistance(0); //��ȡ��������
if(nowDis>5000)nowDis=9999;//����������Χ����Ϊ�쳣
nowTdsVal = My_TDS_GetTdsVal();
if(needWriteFlash==1)
{
My_STMFlash_SaveUseSector(saveData); //�����ݱ��浽flash ���粻��ʧ
// needWriteFlash =40;// Լ4s�Զ��洢һ������
needWriteFlash =0;//0 ֱ��ֹͣ���� �����´δ���
}
else if(needWriteFlash >0 ){needWriteFlash--;}//��ʱд��������ʱ
displayOfCollectedData();//��ʾ�ɼ���������
}
if(mySendFlag_tick == true )//��ʱ����ʱ�䵽
{
mySendFlag_tick = false;//�����־
nowTemp = My_DS18B20_GetTemp(PA6); //��ȡ�¶�
My_UltWave_StartTest(0); //�������������
My_TDS_SendGetCmd(USART2);//���ͻ�ȡtds����
if(errFlag != 0) //�������쳣
{
buzzer = !buzzer;//����������
}
else buzzer=0; //ֹͣ����
sprintf(dis0,"����ˮ�ʼ��ϵͳ\r\n �ɼ�ֵ ��ֵ\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n%s\r\n\r\n",dis1,dis2,dis3,dis4,dis5,dis6);//��ʾ
if(wirelessFlag == 0)USARTSendString(USART1 ,dis0); //���� ��Ӧ�� ����
else My_ESP8266_SendStrStr(USART1 ,dis0);//��������
}
My_UartMessage_Process();//������������
}
}
void scanKeyAnddealKey(void)
{
My_KeyScan();//����ɨ��
if(KeyIsPress(KEY_1))
{
setFlag++;//���ñ�־
if(setFlag >= 6) setFlag = 0;
}
if(KeyIsPress(KEY_2))//��������
{
if(setFlag == 1)//���öԱ�
{
if(setTemp>1)setTemp-=1;//--
}
else if(setFlag == 2)//���öԱ�
{
if(setDis>1)setDis-=1;//--
}
else if(setFlag == 3)//���öԱ�
{
if(setHzVal>1)setHzVal-=1;//--
}
else if(setFlag == 4)//���öԱ�
{
if(setTdsVal>1)setTdsVal-=1;//--
}
else if(setFlag == 5)//���öԱ�
{
if(setPh>1)setPh-=1;//--
}
needWriteFlash = 2; //�����ݱ��浽flash ���粻��ʧ
}
if(KeyIsPress(KEY_3))
{
if(setFlag == 1)//���öԱ�
{
if(setTemp<99)setTemp+=1;//++
}
else if(setFlag == 2)//���öԱ�
{
if(setDis<5000)setDis+=1;//++
}
else if(setFlag == 3)//���öԱ�
{
if(setHzVal<99)setHzVal+=1;//++
}
else if(setFlag == 4)//���öԱ�
{
if(setTdsVal<9999)setTdsVal+=1;//++
}
else if(setFlag == 5)//���öԱ�
{
if(setPh<140)setPh+=1;//++
}
needWriteFlash = 2; //�����ݱ��浽flash ���粻��ʧ
}
if(KeyIsPress(KEY_4))//�������� ������� ���¼���
{
setFlag =0;//�˳�����
}
}
void displayOfCollectedData(void)
{
static float remupData_01 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_02 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_03 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_04 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_05 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_06 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
static u16 remupData_07 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
yPlace = 2;//��ʾ��λ��
if(remupData_01 != nowTemp+setTemp)//��ȡ���ݷ����˱仯
{
remupData_01 = nowTemp+setTemp;//��¼��������
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
if(nowTemp > setTemp){FRONT_COLOR = Color16_RED;} //������ʾ��ɫ
sprintf(dis1,"�� ��:%4.1f��C %02d",nowTemp,setTemp);//��ӡ
MyLCD_Show(X_PLACE,yPlace++,dis1);//��ʾ
}else{yPlace++;}
if(remupData_02 != nowDis+setDis)//��ȡ���ݷ����˱仯
{
remupData_02 = nowDis+setDis;//��¼��������
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
if(nowDis > setDis){FRONT_COLOR = Color16_RED;} //������ʾ��ɫ
sprintf(dis2,"ˮ λ:%04dmm %04d",nowDis,setDis);//��ӡ
MyLCD_Show(X_PLACE,yPlace++,dis2);//��ʾ
}else{yPlace++;}
if(remupData_03 != nowHzVal+setHzVal)//��ȡ���ݷ����˱仯
{
remupData_03 = nowHzVal+setHzVal;//��¼��������
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
if(nowHzVal > setHzVal){FRONT_COLOR = Color16_RED;} //������ʾ��ɫ
sprintf(dis3,"���Ƕ�: %02d %02d",nowHzVal,setHzVal);//��ӡ
MyLCD_Show(X_PLACE,yPlace++,dis3);//��ʾ
}else{yPlace++;}
if(remupData_04 != nowTdsVal +setTdsVal)//��ȡ���ݷ����˱仯
{
remupData_04 = nowTdsVal+setTdsVal;//��¼��������
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
if(nowTdsVal > setTdsVal){FRONT_COLOR = Color16_RED;} //������ʾ��ɫ
sprintf(dis4,"�絼��:%04dS/m %04d",nowTdsVal,setTdsVal);//��ӡ
MyLCD_Show(X_PLACE,yPlace++,dis4);//��ʾ
}else{yPlace++;}
if(remupData_05 != phVal+setPh)//��ȡ���ݷ����˱仯
{
remupData_05 = phVal+setPh;//��¼��������
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
if(phVal > (float)setPh/10){FRONT_COLOR = Color16_RED;} //������ʾ��ɫ
sprintf(dis5,"PH ֵ:%5.2f %4.1f",phVal,(float)setPh/10);//��ӡ
MyLCD_Show(X_PLACE,yPlace++,dis5);//��ʾ
}else{yPlace++;}
errFlag =0;//�����־����
if(nowTemp > setTemp){errFlag++;} //������ʾ��ɫ
if(nowDis > setDis){errFlag++;} //������ʾ��ɫ
if(nowHzVal > setHzVal){errFlag++;} //������ʾ��ɫ
if(nowTdsVal > setTdsVal){errFlag++;} //������ʾ��ɫ
if(phVal > (float)setPh/10){errFlag++;} //������ʾ��ɫ
if(remupData_06 != errFlag)//��ȡ���ݷ����˱仯
{
remupData_06 = errFlag;//��¼��������
if(errFlag == 0 )
{
FRONT_COLOR = Color16_WHITE; //������ʾ��ɫ
sprintf(dis6,"����״̬:��");//��ʾ
}
else
{
FRONT_COLOR = Color16_RED; //������ʾ��ɫ
sprintf(dis6,"����״̬:��");//��ʾ
}
MyLCD_Show(X_PLACE,yPlace++,dis6);//��ʾ
}else{yPlace++;}
FRONT_COLOR=Color16_RED;//��ʾ��ɫ
for(i = 0; i<6 ;i++ )
{
if(setFlag == i)
{
if(setFlag == 0)MyLCD_Show(19,i+1," ");//������״̬
else MyLCD_Show(19,i+1,"<<");//��ʾ����λ��
}
else MyLCD_Show(19,i+1," ");//��ʾ������״̬
}
}
void OnGetUartMessage(const _uart_msg_obj *uartMsgRec)
{
char *strPtr;
if((strPtr=strstr(uartMsgRec->payload,"%"))!=NULL)//���յ��ַ���
{
if(wirelessFlag == 0)USARTSendString(USART1,"\r\nTest Ok!!\r\n\r\n"); //���� ��Ӧ�� ����
else My_ESP8266_SendStrStr(USART1,"\r\nTest Ok!!\r\n\r\n");//��������
}
if((strPtr=strstr(uartMsgRec->payload,"ST00"))!=NULL)//���յ��ַ��� *MD....#
{
setTemp=ParseInteger(strPtr+4,2);//��ȡ���ò���
}
if((strPtr=strstr(uartMsgRec->payload,"SC"))!=NULL)//���յ��ַ��� *MD....#
{
setDis=ParseInteger(strPtr+2,4);//��ȡ���ò���
}
if((strPtr=strstr(uartMsgRec->payload,"SH00"))!=NULL)//���յ��ַ��� *MD....#
{
setHzVal=ParseInteger(strPtr+4,2);//��ȡ���ò���
}
if((strPtr=strstr(uartMsgRec->payload,"SD0"))!=NULL)//���յ��ַ��� *MD....#
{
setTdsVal=ParseInteger(strPtr+3,3);//��ȡ���ò���
}
if((strPtr=strstr(uartMsgRec->payload,"SP0"))!=NULL)//���յ��ַ��� *MD....#
{
setPh=ParseInteger(strPtr+3,3);//��ȡ���ò���
}
needWriteFlash = 3; //��Ҫ���´洢����
}
void My_ESP8266_SendStrStr(USART_TypeDef* USARTx, const char *str)//�������� ֻ��WIFIʱʹ��
{ //��������ò��� ֻ��Ϊ�˱���
//**All notes can be deleted and modified**//
My_USART_printf(USARTx,"AT+CIPSEND=%d, %d\r\n",0,strlen(str)); //����AT����
delay_ms(10);
USARTSendBytes(USARTx,str,strlen(str));//��������
USARTSendBytes(USARTx,"\r\n",2);//��������
delay_ms(5);
}
void checkWireLessMode(u8 recBuf)//�����������
{
static u8 checkIn = 0;//�鿴��һ�α�־�Ƿ����
if(startCheckWireLess == 1 && wirelessFlag == 0)//�����������
{
if(recBuf == 'O')checkIn = 1;
else if (checkIn == 1 && recBuf == 'K')
{
wirelessFlag = 1; //1��ʾwifi
}
}
}
4 实现效果
5 最后
包含内容
详细开发说明文档
🧿 项目分享:见文末!
**项目分享: ** https://blog.csdn.net/m0_984093
作者:Travers132