[Proteus simulation] [STM32 microcontroller] Intelligent sleep aid machine system design

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.