STM32单片机坐姿疲劳提醒系统—源码、硬件和论文详解

文章目录

  • 0 前言
  • 1 主要功能
  • 2 硬件设计(原理图)
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后

  • 0 前言

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

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

    🚩 毕业设计 STM32坐姿疲劳提醒系统(源码+硬件+论文)

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

  • 难度系数:3分
  • 工作量:3分
  • 创新点:4分
  • 🧿 项目分享:见文末!

    1 主要功能

    本系统由STM32F103C8T6单片机核心板、TFT1.44寸彩屏液晶显示电路、超声波测量电路、光敏检测电路、JR6001语音播报电路、USB灯驱动电路、按键电路及电源组成。

  • 【1】TFT1.44寸彩屏液晶实时显示超声波测量距离、设置距离阈值、光照强度及高亮LED的亮灭及亮度状态。光照值通过单片机内部AD模数转换获取,USB台灯控制通过单片机内部PWM进行驱动。JR6001语音电路根据当前的设置状态,对触发情况进行语音播报相应信息。
  • 【2】上电初始化。液晶显示显示对应的标题。此时播报当前的光线情况及灯光状态。按键K1可以设置自动手动状态对应语音提醒“自动控制模式”、“手动控制模式”,通过K4按键可以设置超声波测量距离阈值、疲劳提醒时间间隔、控灯的PWM,对应设置参数有“<<”指示,K2、K3对数据进行加减处理。
  • 【3】当超声波探测的实际距离低于设置的阈值时,语音播报“距离过近 请注意坐姿”。自动模式下,根据光照情况自动调节高亮USB灯亮度,光线越暗灯越亮(0-5)等级;如果光线特别亮,关闭USB灯。USB灯打开时,语音提醒以告诉用户“光线较暗 已开灯”。否则关闭USB灯,语音提醒“光线较强 已关灯”。液晶对光线以及灯状态进行显示。手动模式下通过按键控制灯亮度。
  • 【4】长时间学习工作对身体造成疲劳驾驶,该设计有语音提醒。一个疲劳提醒时间间隔达到(表示工作学习时间过久)时间语音进行提醒“工作学习时间过长 请注意劳逸结合”。
  • 【5】超声波测距是根据超声波发出和接收时间差,表示声波来回路程需要的时间,声波速度是固定的,从而计算距离。
  • 【6】超声波设置阈值保存到单片机Flash中,具有掉电不丢失功能。
  • 2 硬件设计(原理图)

    PCB设计

    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 1 //x������ʾ��ʼλ��
    
    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[3] = {15,20,1};
    #define setNum          saveData[0] //������ֵ
    #define setTime        saveData[1] //����ʱ����
    
    unsigned char setMode  = 0;//���ñ�־
    unsigned char setFlag  = 0;//���ñ�־
    
    unsigned int i; //���� i
    char dis0[50];//Һ����ʾ�ݴ�����
    char dis1[22];//Һ����ʾ�ݴ�����
    
    unsigned char yPlace = 0;//��ʾ��λ��    
        
    u16 pwmLedVal =  0;//��pwm����ֵ
    u16 ligh = 0;//����ֵ
    float nowDis = 0;//��ǰ����
    //u16 setNum = 15;//���þ���
    //u16 setTime = 20;//����ʱ����
    u8 needWriteFlash=0;//��Ҫ�������ݵ�flash
    
    u8 remChangeFlag = 0xff;//��¼�仯��־
    u8 timeCountSec = 0;//��ʱ����
    
    //�����ַ�����Ӧ ������Ƶ���Ƶı��
    #define HYNSY           "01111" //��ӭʹ��
    #define MODE_MAN        "01112" //�ֶ�
    #define MODE_AUT        "01113" //�Զ�
    #define YYADD_1         "20261"
    #define YYADD_2         "20262"
    #define YYADD_3         "20260"
    #define YYADD_4         "20263"
    unsigned char needPlay=0;//��Ҫ��������
    unsigned char delayPlay=0;//������ʱ
    
    void ctrlPwmLed(u8 grade) //��λ0-5
    {
        My_PWM_SetDuty(TIM3,TIM_CH_1,grade*20);//��ʼ����ʱ��1 ͨ��4 ռ�ձ�
    }
    
    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_PWM_Init(TIM3,TIM_CH_1,2000);//��ʼ����ʱ�� ͨ�� ���� ��PWM������Ҫ��
        delay_ms(100);  
        My_UltWave_Init();
    
        My_STMFlash_SectorSaveInit(ADDR_FLASH_WRITE,saveData,sizeof(saveData));//��ʼ��flash  
            
        LCD_Init();   //tft��ʼ��    
        LCD_Clear(Color16_BLACK);//��ȫ��
        
        BACK_COLOR=Color16_BLACK;FRONT_COLOR=Color16_RED;	 //������ʾ��ɫ  
        MyLCD_Show(3,0,"������������̨��");//��ʾ    
        MyLCD_Show(3,1,"init..");//��ʾ
        
        ctrlPwmLed(3);//�ϵ綯����
        delay_ms(100);
        ctrlPwmLed(pwmLedVal);//�رն���
        
        My_JR6001_Init(31); //��ʼ����������
        delay_ms(10);
        if(My_JR6001_IsBusy() == false ) My_JR6001_PlayByName(HYNSY); //���� ��ӭ����    
        for(i=0; i<6; i++)delay_ms(100);//���ش�����Ҫ�ϵ�һ����ܶ�ȡ�ȶ�     
        
        while(1)
        {
            scanKeyAnddealKey();//����ɨ�輰����
            if(myReadFlag_tick == true ) //��ʱ��ȡʱ�䵽
            {
                myReadFlag_tick = false; //�����־
                
    			ligh  =99 - My_ADC_GetValue(ADC1,ADC_Channel_5)*99/4096 ;//﮵�ص�ѹ
    
                nowDis = (float)My_UltWave_GetDistance(0)/1000;   //��ȡ��������  m     
                if(nowDis>5.0)nowDis=9.99;//����������Χ����Ϊ�쳣
                
                if(setMode == 0) //�Զ�ģʽ��
                {
                    if(ligh < 15){pwmLedVal = 5;}//�ص�pwm �޸�
                    else if(ligh < 25){pwmLedVal = 4;}//�ص�pwm �޸�
                    else if(ligh < 35){pwmLedVal = 3;}//�ص�pwm �޸�
                    else if(ligh < 50){pwmLedVal = 2;}//�ص�pwm �޸�
                    else if(ligh < 70){pwmLedVal = 1;}//�ص�pwm �޸�
                    else {pwmLedVal = 0;}//�ص�pwm �޸�  
                    
                    if(remChangeFlag != (pwmLedVal!=0?1:0))//�Աȵ�ǰpwm �صƿ���
                    {                   
                        if(needPlay==0)//��ǰû���ڲ���
                        {
                            needPlay = 2;//������������
                            remChangeFlag = (pwmLedVal!=0?1:0);//��¼����״̬
                        }
                    }
                }
                if(nowDis<(float)setNum/100)//�����쳣
                {
                    if(needPlay==0)needPlay = 4;//������������
                }            
                if( timeCountSec >= setTime )//һ��ʱ��ﵽ
                {
                    timeCountSec =0;//�������¼���
                    needPlay = 3;//������������
                }
                
                ctrlPwmLed(pwmLedVal);//���Ƶ�״̬
                displayOfCollectedData();//��ʾ�ɼ���������   
    
                if(needWriteFlash==1)
                {   
                    My_STMFlash_SaveUseSector(saveData);   //�����ݱ��浽flash ���粻��ʧ      
    //                needWriteFlash =40;// Լ4s�Զ��洢һ������ 
                    needWriteFlash =0;//0 ֱ��ֹͣ���� �����´δ���
                }              
                else if(needWriteFlash >0 ){needWriteFlash--;}//��ʱд��������ʱ     
    
                
                if(My_JR6001_IsBusy() == false )//��������״̬
                {
                    delayPlay++;//������ʱ ��ʽ�����ظ�����
                    if(delayPlay>=8)//ֹͣ����һ��ʱ����ڲ���
                    {
                        if(needPlay != 0)//�Ƿ���Ҫ��������
                        {
                            switch (needPlay)
                            {
                            case 1 ://������Ӧ��ַ����
                                if(setMode == 0)My_JR6001_PlayByName(MODE_AUT);//����
                                else My_JR6001_PlayByName(MODE_MAN);
                                break;
                            case 2 ://������Ӧ��ַ����
                                if(pwmLedVal != 0)My_JR6001_PlayByName(YYADD_1);  //���� ��Ӧ��ַ������
                                else My_JR6001_PlayByName(YYADD_2); //���� ��Ӧ��ַ������                            
                                break;
                            case 3 ://������Ӧ��ַ����
                                    My_JR6001_PlayByName(YYADD_3); //���� ��Ӧ��ַ������                            
                                break;
                            case 4 ://������Ӧ��ַ����
                                    My_JR6001_PlayByName(YYADD_4); //���� ��Ӧ��ַ������                            
                            break;
                            default :
                                break;
                            }
                            needPlay = 0;//��������
                            delayPlay = 0;//�����ʱ����
                        }
                    }
                }            
            }
            
            if(mySendFlag_tick == true )//��ʱ����ʱ�䵽
            {
                mySendFlag_tick = false;//�����־
                My_UltWave_StartTest(0); //�������������
                timeCountSec++;//ʱ�似����������ƣ��
    //            sprintf((char*)dis0,"N01:%.2fN\r\n",(float)100000/1000*9.8);//�������                
    //            sprintf(dis0,"%s\r\n%s\r\n",dis0,dis1);//���ݸ�ʽת��            
    //            USARTSendString(USART1 , dis0);//���� ���� ����
    //            My_ESP8266_SendStrStr(USART1 , dis0);//���� wifi ����                
            }
            My_UartMessage_Process();//������������
            
        }
    }
    
    
    void scanKeyAnddealKey(void)
    {
    
        My_KeyScan();//����ɨ��
        
        if(KeyIsPress(KEY_1))
        {
            setMode++;//���ñ�־
            if(setMode >= 2) setMode = 0;  
            if(setMode == 1) setFlag = 1;//�ֶ�����pwm
            else setFlag =0;//�л����Զ�ģʽ����������ָʾ
            remChangeFlag =0xff;//��ռ�¼��ǰ״̬ 
            needPlay = 1;//������������
        }
        if(KeyIsPress(KEY_2))//��������
        {   
            if(setFlag == 1) //�ֶ�ģʽ��
            {
                if(pwmLedVal > 0)pwmLedVal--;//����pwm
                else pwmLedVal = 5;//ѭ���ص�
            }
            else if(setFlag == 2) //�ֶ�ģʽ��
            {
                if(setNum > 1)setNum--;//--
            }  
            else if(setFlag == 3) //�ֶ�ģʽ��
            {
                if(setTime > 10)setTime--;//--
            }
             needWriteFlash = 2;  //�����ݱ��浽flash ���粻��ʧ  
        }
        if(KeyIsPress(KEY_3))//��������
        {
            if(setFlag == 1) //�ֶ�ģʽ��
            {
                if(pwmLedVal < 5)pwmLedVal++;//���pwm
                else pwmLedVal = 0;//ѭ���ص�
            }
            else if(setFlag == 2) //�ֶ�ģʽ��
            {
                if(setNum < 100)setNum++;//++
            }  
            else if(setFlag == 3) //�ֶ�ģʽ��
            {
                if(setTime < 99)setTime++;//++
            } 
            needWriteFlash = 2;  //�����ݱ��浽flash ���粻��ʧ          
        }
        if(KeyIsPress(KEY_4))
        {
            if(setFlag!=2 && setFlag!=3 )setFlag=2;//����������ֵ
            else {setFlag++;}
            if(setFlag >= 4)
            {
                if(setMode == 1 )setFlag=1;//�ֶ�ģʽ�½�������pwm
                else setFlag=0;//�Զ�ģʽ ֻ����ֵ����
            }
        }
    }
    
    void displayOfCollectedData(void)
    {
        static u16 remupData_01 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static u16 remupData_02 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static u16 remupData_02_2 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static u16 remupData_03 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static float remupData_04 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static u16 remupData_05 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��
        static u16 remupData_06 = 0xff;//��¼���ݱ��� ���ڲ鿴��Ӧ�����Ƿ�仯,�仯�˸�����ʾ�����ⷴ��������ʾռ��ʱ��     
                            
        yPlace = 1;//��ʾ��λ��                            
        if(remupData_01 != setMode)//��ȡ���ݷ����˱仯
        {
            remupData_01 = setMode;//��¼��������
            FRONT_COLOR = Color16_WHITE;	 //������ʾ��ɫ  
            if(setMode == 0) sprintf(dis0,"ģʽ:�Զ�ģʽ ");//��ӡ                
            else sprintf(dis0,"ģʽ:�ֶ�ģʽ ");//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}
    
        if(remupData_02 != ligh )//��ȡ���ݷ����˱仯
        {
            remupData_02 = ligh  ;//��¼��������
            FRONT_COLOR = Color16_YELLOW;	 //������ʾ��ɫ  
            sprintf(dis0,"��ǰ����:%02d  ",ligh);//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}           
    
        if(remupData_03 !=  pwmLedVal )//��ȡ���ݷ����˱仯
        {
            remupData_03 =  pwmLedVal ;//��¼��������
            FRONT_COLOR = Color16_YELLOW;	 //������ʾ��ɫ  
            sprintf(dis0,"��ǰ��λ: %d ",(int)pwmLedVal);//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}      
        
        if(remupData_04 !=  nowDis)//��ȡ���ݷ����˱仯
        {
            remupData_04= nowDis;//��¼��������
            FRONT_COLOR = Color16_YELLOW;	 //������ʾ��ɫ  
            sprintf(dis0,"������:%4.2fm ",nowDis);//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}
        
        if(remupData_05 !=  setNum)//��ȡ���ݷ����˱仯
        {
            remupData_05= setNum;//��¼��������
            FRONT_COLOR = Color16_WHITE;	 //������ʾ��ɫ  
            sprintf(dis0,"����������ֵ:%4.2fm ",(float)setNum/100);//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}         
    
        if(remupData_06 !=  setTime)//��ȡ���ݷ����˱仯
        {
            remupData_06= setTime;//��¼��������
            FRONT_COLOR = Color16_WHITE;	 //������ʾ��ɫ  
            sprintf(dis0,"ƣ�����Ѽ��:%02ds ",setTime);//��ӡ                
            MyLCD_Show(X_PLACE,yPlace++,dis0);//��ʾ
        }else{yPlace++;}              
    
        FRONT_COLOR = Color16_RED;	 //������ʾ��ɫ
        if(setFlag == 0) //�ֶ�ģʽ��
        {
            MyLCD_Show(19,3,"  ");//��ʾ
            MyLCD_Show(19,5,"  ");//��ʾ
            MyLCD_Show(19,6,"  ");//��ʾ
        }
        else if(setFlag == 1) //�ֶ�ģʽ��
        {
            MyLCD_Show(19,3,"<<");//��ʾ
            MyLCD_Show(19,5,"  ");//��ʾ
            MyLCD_Show(19,6,"  ");//��ʾ
        }    
        else if(setFlag == 2) //�ֶ�ģʽ��
        {
            MyLCD_Show(19,3,"  ");//��ʾ
            MyLCD_Show(19,5,"<<");//��ʾ
            MyLCD_Show(19,6,"  ");//��ʾ
        }  
        else if(setFlag == 3) //�ֶ�ģʽ��
        {
            MyLCD_Show(19,3,"  ");//��ʾ
            MyLCD_Show(19,5,"  ");//��ʾ
            MyLCD_Show(19,6,"<<");//��ʾ
        }  
        
    }
    
    void OnGetUartMessage(const _uart_msg_obj *uartMsgRec)
    {
        char *strPtr;    
        if((strPtr=strstr(uartMsgRec->payload,"RTC"))!=NULL)//���յ�rtc�ַ��� *RTC20200420173611#
        {
    //        My_RTC_SetStr(strPtr+3);//����ʱ��
    //        My_ESP8266_SendStrStr(USART1 , "setRTC\r\n");//���� wifi ����
        }  
        if((strPtr=strstr(uartMsgRec->payload,"SL"))!=NULL)//���յ��ַ��� *MD....#
        {
            if(setMode == 1)pwmLedVal=ParseInteger(strPtr+2,1);//��ȡ���ò���        
        }
    //        needWriteFlash = 3;    //��Ҫ���´洢����
    }
    
    
    void My_ESP8266_SendStrStr(USART_TypeDef* USARTx, const char *str)
    {
    //    u8 i;
    //    for(i=0;i<2;i++)
        {
            My_USART_printf(USARTx,"AT+CIPSEND=%d,%d\r\n",0,strlen(str));  
            delay_ms(10);
            USARTSendBytes(USARTx,str,strlen(str));//��������
            USARTSendBytes(USARTx,"\r\n",2);//��������
            delay_ms(5);
        }
    }
    
    
    

    4 实现效果

    5 最后

    包含内容

    🧿 项目分享:见文末!

    作者:单片机项目集合

    物联沃分享整理
    物联沃-IOTWORD物联网 » STM32单片机坐姿疲劳提醒系统—源码、硬件和论文详解

    发表评论