Article directory
- 1. Function introduction
- 2. Software design
- 3. Experimental phenomena
- Contact the author
1. Function introduction
This project uses Proteus8 to simulate the STM32 microcontroller controller, and uses the buzzer alarm module, LCD1602 display module, heart rate and blood oxygen module, PCF8691 ADC module, button module, etc.
The main function:
After the system is running, LCD1602 displays the heart rate and blood oxygen value collected by the sensor as well as the current time; you can enter the time modification mode through the K3 key, which is used to switch hours, minutes, and seconds, and the K1 and K2 keys for adjustment; after the time modification is completed, press K4 key to save and return to the main interface.
The K4 key can be used to enter the sleep aid and wake-up alarm setting mode. K4 is used to switch the sleep aid hour/minute, wake-up hour/minute, and K1 and K2 key adjustments. After setting the alarm, you can press the K3 key to save and return to the main interface. If the current time reaches the sleep aid time or wake-up alarm time, the buzzer alarm will be turned on, and the ongoing alarm can be canceled through the K2 key.
In the normal interface, you can check the data information of monitoring heart rate and blood oxygen through the K1 key. LCD1602 displays the minimum and maximum values of heart rate and blood oxygen.
2. Software design
/* Author: Hi Xiaoyi (QQ: 3443792007) */ //System data display void sys_data_show(void) {<!-- --> while(1) {<!-- --> //Not checked if(sys_ctrl.find==0) {<!-- --> //Does not enter alarm setting mode if(sys_ctrl.set_alarm_mode==0) {<!-- --> \t\t\t\t//display time lcd1602_show_nums(6,0,sys_ctrl.hour,2,0x80); lcd1602_show_nums(9,0,sys_ctrl.min,2,0x80); lcd1602_show_nums(12,0,sys_ctrl.sec,2,0x80); \t\t\t\t\t //Heart rate display lcd1602_show_nums(3,1,sys_ctrl.heart,3,0); //blood oxygen display lcd1602_show_nums(12,1,sys_ctrl.oxygen,3,0); \t\t\t\t //Time adjustment position flashes switch(sys_ctrl.set_time_mode) {<!-- --> case 1:// lcd1602_show_string(6,0," "); delay_ms(50); lcd1602_show_nums(6,0,sys_ctrl.hour,2,0x80); break; case 2://fen lcd1602_show_string(9,0," "); delay_ms(50); lcd1602_show_nums(9,0,sys_ctrl.min,2,0x80); break; case 3://seconds lcd1602_show_string(12,0," "); delay_ms(50); lcd1602_show_nums(12,0,sys_ctrl.sec,2,0x80); break; } } //Enter alarm clock setting mode else {<!-- --> //Display sleep aid time lcd1602_show_nums(7,0,sys_ctrl.alarm_time[0][0],2,0x80); lcd1602_show_nums(10,0,sys_ctrl.alarm_time[0][1],2,0x80); //Display wake-up time lcd1602_show_nums(7,1,sys_ctrl.alarm_time[1][0],2,0x80); lcd1602_show_nums(10,1,sys_ctrl.alarm_time[1][1],2,0x80); \t\t\t\t //Time adjustment position flashes switch(sys_ctrl.set_alarm_mode) {<!-- --> case 1://when sleeping lcd1602_show_string(7,0," "); delay_ms(50); lcd1602_show_nums(7,0,sys_ctrl.alarm_time[0][0],2,0x80); break; case 2://sleep aid points lcd1602_show_string(10,0," "); delay_ms(50); lcd1602_show_nums(10,0,sys_ctrl.alarm_time[0][1],2,0x80); break; case 3://When getting up lcd1602_show_string(7,1," "); delay_ms(50); lcd1602_show_nums(7,1,sys_ctrl.alarm_time[1][0],2,0x80); break; case 4://wake up time lcd1602_show_string(10,1," "); delay_ms(50); lcd1602_show_nums(10,1,sys_ctrl.alarm_time[1][1],2,0x80); break; } } } //Looking up else {<!-- --> //Display the minimum and maximum heart rate lcd1602_show_nums(8,0,sys_ctrl.heart_lh[0],3,0x80); lcd1602_show_nums(12,0,sys_ctrl.heart_lh[1],3,0x80); //Display the minimum and maximum blood oxygen values lcd1602_show_nums(8,1,sys_ctrl.oxygen_lh[0],3,0x80); lcd1602_show_nums(12,1,sys_ctrl.oxygen_lh[1],3,0x80); } break; } } //System data settings void sys_data_set(void) {<!-- --> u8 key=0; static u8 oneflag=0; \t key=KEY_Scan(0); //Set time if(key==KEY3_PRESS) {<!-- --> //Does not enter alarm setting mode if(sys_ctrl.set_alarm_mode==0) {<!-- --> TIM_Cmd(TIM2,DISABLE);//Close the timer sys_ctrl.set_time_mode + + ; if(sys_ctrl.set_time_mode>=4)sys_ctrl.set_time_mode=1; } //Alarm clock setting mode, OK else {<!-- --> oneflag=0; sys_ctrl.set_alarm_mode=0; sys_open_show();//Boot interface display TIM_Cmd(TIM2,ENABLE);//Start the timer } } \t//add else if(key==KEY1_PRESS) {<!-- --> //Time setting mode switch(sys_ctrl.set_time_mode) {<!-- --> case 1:// sys_ctrl.hour + + ; if(sys_ctrl.hour>23)sys_ctrl.hour=0; break; case 2://fen sys_ctrl.min + + ; if(sys_ctrl.min>59)sys_ctrl.min=0; break; case 3://seconds sys_ctrl.sec + + ; if(sys_ctrl.sec>59)sys_ctrl.sec=0; break; } //Alarm clock setting mode switch(sys_ctrl.set_alarm_mode) {<!-- --> case 1://when sleeping sys_ctrl.alarm_time[0][0] + + ; if(sys_ctrl.alarm_time[0][0]>23)sys_ctrl.alarm_time[0][0]=0; break; case 2://sleep aid points sys_ctrl.alarm_time[0][1] + + ; if(sys_ctrl.alarm_time[0][1]>59)sys_ctrl.alarm_time[0][1]=0; break; case 3://When getting up sys_ctrl.alarm_time[1][0] + + ; if(sys_ctrl.alarm_time[1][0]>23)sys_ctrl.alarm_time[1][0]=0; break; case 4://wake up time sys_ctrl.alarm_time[1][1] + + ; if(sys_ctrl.alarm_time[1][1]>59)sys_ctrl.alarm_time[1][1]=0; break; } //In normal mode, check blood oxygen and heart rate information if(sys_ctrl.set_time_mode==0 & amp; & sys_ctrl.set_alarm_mode==0) {<!-- --> sys_ctrl.find=!sys_ctrl.find; //Check if(sys_ctrl.find==1) {<!-- --> lcd1602_clear(); lcd1602_show_string(0,0," Heart->000-000"); lcd1602_show_string(0,1,"Oxygen->000-000"); } //Exit the search else {<!-- --> sys_open_show();//Boot interface display } } } \t//reduce else if(key==KEY2_PRESS) {<!-- --> //Time setting mode switch(sys_ctrl.set_time_mode) {<!-- --> case 1:// sys_ctrl.hour--; if(sys_ctrl.hour<0)sys_ctrl.hour=23; break; case 2://fen sys_ctrl.min--; if(sys_ctrl.min<0)sys_ctrl.min=59; break; case 3://seconds sys_ctrl.sec--; if(sys_ctrl.sec<0)sys_ctrl.sec=59; break; } //Alarm clock setting mode switch(sys_ctrl.set_alarm_mode) {<!-- --> case 1://when sleeping sys_ctrl.alarm_time[0][0]--; if(sys_ctrl.alarm_time[0][0]<0)sys_ctrl.alarm_time[0][0]=23; break; case 2://sleep aid points sys_ctrl.alarm_time[0][1]--; if(sys_ctrl.alarm_time[0][1]<0)sys_ctrl.alarm_time[0][1]=59; break; case 3://When getting up sys_ctrl.alarm_time[1][0]--; if(sys_ctrl.alarm_time[1][0]<0)sys_ctrl.alarm_time[1][0]=23; break; case 4://wake up time sys_ctrl.alarm_time[1][1]--; if(sys_ctrl.alarm_time[1][1]<0)sys_ctrl.alarm_time[1][1]=59; break; } sys_ctrl.alarm_flag=0;//Cancel the alarm } \t//Sure else if(key==KEY4_PRESS) {<!-- --> //Time setting mode if(sys_ctrl.set_time_mode!=0) {<!-- --> sys_ctrl.set_time_mode=0; TIM_Cmd(TIM2,ENABLE);//Start the timer } //Alarm clock setting mode else {<!-- --> TIM_Cmd(TIM2,DISABLE);//Close the timer if(oneflag==0)//Only display the interface once {<!-- --> oneflag=1; lcd1602_clear(); lcd1602_show_string(0,0,"Sleep->00:00"); lcd1602_show_string(0,1,"Alarm->00:00"); } sys_ctrl.set_alarm_mode + + ; if(sys_ctrl.set_alarm_mode>=5)sys_ctrl.set_alarm_mode=1; } } } //System function control void sys_fun_ctrl(void) {<!-- --> //The alarm has not been turned on yet if(sys_ctrl.alarm_flag==0) {<!-- --> //In normal mode, check whether the time is reached if(sys_ctrl.set_time_mode==0 & amp; & sys_ctrl.set_alarm_mode==0) {<!-- --> //If the sleep aid time is reached, turn on the buzzer sound if(sys_ctrl.alarm_time[0][0]==sys_ctrl.hour)//hour {<!-- --> if(sys_ctrl.alarm_time[0][1]==sys_ctrl.min)//minutes {<!-- --> if(sys_ctrl.sec==0)//seconds sys_ctrl.alarm_flag=1;//alarm } } //If the wake-up time arrives, turn on the buzzer sound if(sys_ctrl.alarm_time[1][0]==sys_ctrl.hour)//hour {<!-- --> if(sys_ctrl.alarm_time[1][1]==sys_ctrl.min)//minutes {<!-- --> if(sys_ctrl.sec==0)//seconds sys_ctrl.alarm_flag=1;//alarm } } } } //start alarm else {<!-- --> beep_alarm(1,10000); } } //Application control system void appdemo_show(void) {<!-- --> u8 i=5; sys_parm_init();//System parameter initialization KEY_Init(); BEEP_Init(); pcf8591_init(); lcd1602_init();//LCD1602 initialization TIM2_Init(400-1,70);//Timing 10ms while(i--) {<!-- --> //Get blood oxygen and heart rate sys_ctrl.heart=pcf8591_read_adcvalue(1); sys_ctrl.heart=cal_map(sys_ctrl.heart,0,255,0,200); sys_ctrl.heart_lh[0]=sys_ctrl.heart; //Initial value as minimum value sys_ctrl.heart_lh[1]=sys_ctrl.heart; //Initial value as maximum value sys_ctrl.oxygen=pcf8591_read_adcvalue(0); sys_ctrl.oxygen=cal_map(sys_ctrl.oxygen,0,255,0,200); sys_ctrl.oxygen_lh[0]=sys_ctrl.oxygen; //Initial value as minimum value sys_ctrl.oxygen_lh[1]=sys_ctrl.oxygen; //Initial value as maximum value delay_ms(100); } sys_open_show();//System startup interface display TIM_Cmd(TIM2,ENABLE); //Open timer while(1) {<!-- --> sys_data_get(); // System data acquisition sys_data_show();//System data display sys_data_set();//System data setting sys_fun_ctrl();//System function control } }
3. Experimental phenomena
Station B demo video: https://space.bilibili.com/444388619
Contact the author
Video address: https://space.bilibili.com/444388619/video
Focus on 51 microcontroller, STM32, domestic 32, DSP, Proteus, ardunio, ESP32, Internet of Things software development, PCB design, video sharing, and technical exchanges.