STM32智能睡眠检测系统

目录

一、前言

二、项目简介

1.功能详解

2.主要器件

三、原理图设计

四、PCB硬件设计

PCB图

五、程序设计

六、实验效果

七、包含内容

项目分享

一、前言

项目成品图片:

哔哩哔哩视频链接:

【STM32智能睡眠检测系统】 https://www.bilibili.com/video/BV12mE96yED6/?share_source=copy_web&vd_source=097fdeaf6b6ecfed8a9ff7119c32faf2f2

(资料分享见文末)

二、项目简介

1.功能详解

基于STM32智能睡眠检测系统

功能如下:

  1. STM32F103C8T6单片机作为主控芯片
  2. 检测功能:检测环境温度、心率、血氧、翻身次数、震动监测
  3. 显示功能:OLED显示环境参数
  4. 手动控制:手动模式下可通过按键控制翻身次数清零、LED的开关
  5. 自动模式:自动模式下系统检测到心率/血氧/体温处于异常范围内或检测到震动时蜂鸣器报警
  6. 模式切换:通过按键可切换自动模式或手动模式
  7. 阈值调节:按键可调节心率上下限、血氧上下限、体温上下限的阈值
  8. 蓝牙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;
            }
					}          
        
        }

      }

六、实验效果

七、包含内容

项目分享

相关推荐
隔窗听雨眠3 小时前
在STM32上跑通TinyML:从模型训练到推理优化的完整实战指南
stm32·单片机·嵌入式硬件
ryanuo75 小时前
Mac(M芯片)上进行嵌入式开发遇到的问题
嵌入式硬件·macos·开发板
机器视觉知识推荐、就业指导5 小时前
为什么同一个引脚不能同时做按键和串口
stm32·单片机·嵌入式硬件
崇山峻岭之间6 小时前
单片机基本定时器实验
单片机·嵌入式硬件
DS小龙哥6 小时前
基于ESP32设计的智能养蜂监测系统
stm32·单片机·嵌入式硬件·物联网·华为云
夜月yeyue7 小时前
STM32 DMA 双缓冲采样
linux·stm32·单片机·嵌入式硬件·系统架构
西城微科方案开发7 小时前
SIC8P370D2L-PLP16 8位OTP单片机 低功耗多功能MCU详解
单片机·嵌入式硬件
踏着七彩祥云的小丑9 小时前
嵌入式测试第 32 天:升级测试:固件OTA升级、断点续传、回滚测试
单片机·嵌入式硬件·学习
点灯小铭9 小时前
基于单片机与DAC0832的双路波形信号发生系统设计
数据库·单片机·mongodb·毕业设计·课程设计·期末大作业