目录
一、前言
项目成品图片:

哔哩哔哩视频链接:
(资料分享见文末)
二、项目简介
1.功能详解
基于STM32智能睡眠检测系统
功能如下:
- STM32F103C8T6单片机作为主控芯片
- 检测功能:检测环境温度、心率、血氧、翻身次数、震动监测
- 显示功能:OLED显示环境参数
- 手动控制:手动模式下可通过按键控制翻身次数清零、LED的开关
- 自动模式:自动模式下系统检测到心率/血氧/体温处于异常范围内或检测到震动时蜂鸣器报警
- 模式切换:通过按键可切换自动模式或手动模式
- 阈值调节:按键可调节心率上下限、血氧上下限、体温上下限的阈值
- 蓝牙APP:通过蓝牙连接手机APP,可查看环境信息数据与控制指令下发
2.主要器件
- STM32F103C8T6单片机
- OLED 屏幕
- DS18B20温度
- MAX30102心率血氧
- ADXL345加速度
- 震动传感器
- BT04-A蓝牙模块
- 有源蜂鸣器
- LED灯
三、原理图设计

四、PCB硬件设计
PCB图


五、程序设计
cpp
#include "stm32f10x.h"
#include "led.h"
#include "beep.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "key.h"
#include "Modules.h"
#include "adcx.h"
#include "flash.h"
#include "TIM2.h"
#include "timer.h"
#include "max30102_read.h"
#include "ds18b20.h"
#include "adxl345.h"
#include "myiic.h"
#include "iic.h"
#include "usart2.h"
/****************异方辰电子工作室******************
STM32
* 项目 : STM32睡眠监测系统(蓝牙版)
* 版本 : V2.0
* 日期 : 2026.3.11
* MCU : STM32F103C8T6
* 接口 : 见代码
* IP账号 : 异方辰电子/辰哥单片机设计(同BILIBILI|抖音|快手|小红书|CSDN|公众号|视频号等)
* 作者 : 辰哥
* 工作室 : 异方辰电子工作室
* 授权IP : 辰哥单片机设计、异方辰电子、YFC电子、异方辰系列
* 官方网站 : www.yfcdz.cn
**********************BEGIN***********************/
#define KEY_Long1 11
#define KEY_1 1
#define KEY_2 2
#define KEY_3 3
#define KEY_4 4
#define AUTO_MODE 1 // 自动模式
#define MANUAL_MODE 2 // 手动模式
#define SETTINGS_MODE 3 // 设置模式
#define FLASH_START_ADDR 0x0801f000 // 起始地址
// 外部变量声明
SensorModules sensorData;
SensorThresholdValue Sensorthreshold;
DriveModules driveData;
// 全局变量定义
uint8_t mode = 1; //系统模式 1自动 2手动 3设置
uint8_t step_num = 0;
extern unsigned char p[16];
// 系统静态变量
uint8_t count_m = 1; // 手动模式按键计数
uint8_t count_s = 1; // 设置模式按键计数
uint8_t auto_page = 1;
/**
* @brief 主函数
*/
int main(void)
{
// 系统初始化
SystemInit();
delay_init(72);
ADCx_Init();
LED_Init();
BEEP_Init();
BEEP_Off();
USART1_Config();
USART2_Init();
Key_Init();
OLED_Init();
OLED_Clear();
DS18B20_Init(); // DS18B20 温度传感器初始化
IIC_init(); // IIC初始化
adxl345_init(); // ADXL345模块初始化
Init_MAX30102();// MAX30102模块初始化
delay_ms(100);
TIM2_Init(72-1,1000-1);
delay_ms(200);
flash_read();
delay_ms(200);
// 主循环
while (1)
{
USART2_ProcessCmd();
SensorScan();
uint8_t current_key_num = KeyNum;
switch(mode)
{
case AUTO_MODE:
OLED_autoPage1();
SensorDataDisplay1();
AutoControl();
Control_Manager();
if(current_key_num == KEY_1)
{
mode = MANUAL_MODE;
count_m = 1;
driveData.LED_Flag = 0;
driveData.BEEP_Flag = 0;
OLED_Clear();
KeyNum = 0;
}
else if(current_key_num == KEY_Long1)
{
OLED_Clear();
mode = SETTINGS_MODE;
count_s = 1;
KeyNum = 0;
}
break;
case MANUAL_MODE:
OLED_manualPage1();
OLED_manualOption(SetManual());
ManualSettingsDisplay1();
ManualControl(count_m);
Control_Manager();
if(current_key_num == KEY_1)
{
mode = AUTO_MODE;
OLED_Clear();
auto_page = 1; // 强制重置自动模式为第一页
KeyNum = 0;
}
break;
case SETTINGS_MODE:
{
uint8_t sel = SetSelection();
if(sel <= 4)
{
OLED_settingsPage1();
SettingsThresholdDisplay1();
}
else
{
OLED_settingsPage2();
SettingsThresholdDisplay2();
}
OLED_settingsOption(sel);
ThresholdSettings(sel);
OLED_Refresh();
if(current_key_num == KEY_1)
{
FLASH_W(FLASH_START_ADDR,Sensorthreshold.tempminValue,
Sensorthreshold.tempmaxValue,
Sensorthreshold.hrMin,
Sensorthreshold.hrMax,
Sensorthreshold.spo2Min,
Sensorthreshold.spo2Max,
0x55AA);
mode = AUTO_MODE;
count_s = 1;
OLED_Clear();
OLED_autoPage1();
KeyNum = 0;
}
break;
}
}
}
}
六、实验效果

七、包含内容
