通信工程毕设 stm32智能鱼缸水质检测系统(源码+硬件+论文)


0 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩 毕业设计 stm32智能鱼缸水质检测系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分

🧿 项目分享:见文末!

在这里插入图片描述

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 最后

包含内容

在这里插入图片描述

详细开发说明文档
在这里插入图片描述

🧿 项目分享:见文末!

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值