MAX30102空气质量监测模块STM32源程序与资料

2020-08-06来源: 51hei关键字:MAX30102  空气质量监测模块  STM32

电路原理图如下:
51hei.png

功能实现:采用STM32F103C8T6小板,驱动血氧心率传感器max30102,实现PPG信号采集,并将计算的心率和血氧值显示在0.96寸OLED和串口上。


软件实现:ST标准库3.5

硬件连接:

MAX30102:

    VCC<->3.3V

    GND<->GND

    SCL<->PB7

    SDA<->PB8

    IM<->PB9

0.96inch OLED :

    VCC<->3.3V

    GND<->GND

    SCL<->PA5

    SDA<->PA6

    RST<->PA3

    DC<->PA4

    CS<->PA2

USB-TTL:

    5V<->5V

    GND<->GND

    RXD<->PA9

    TXD<->PA10


单片机源程序如下:

#include "led.h"

#include "delay.h"

#include "sys.h"

#include "usart.h"

#include "max30102.h"

#include "myiic.h"

#include "algorithm.h"

#include "oled.h"


uint32_t aun_ir_buffer[500]; //IR LED sensor data

int32_t n_ir_buffer_length;    //data length

uint32_t aun_red_buffer[500];    //Red LED sensor data

int32_t n_sp02; //SPO2 value

int8_t ch_spo2_valid;   //indicator to show if the SP02 calculation is valid

int32_t n_heart_rate;   //heart rate value

int8_t  ch_hr_valid;    //indicator to show if the heart rate calculation is valid

uint8_t uch_dummy;


#define MAX_BRIGHTNESS 255


void dis_DrawCurve(u32* data,u8 x);


int main(void)

{

        //variables to calculate the on-board LED brightness that reflects the heartbeats

        uint32_t un_min, un_max, un_prev_data;  

        int i;

        int32_t n_brightness;

        float f_temp;

        u8 temp_num=0;

        u8 temp[6];

        u8 str[100];

        u8 dis_hr=0,dis_spo2=0;


        NVIC_Configuration();

        delay_init();                     //延时函数初始化         

        uart_init(115200);                 //串口初始化为115200

        LED_Init();

        

        //OLED

        OLED_Init();

        OLED_ShowString(0,0,"  initializing  ",16);

        OLED_Refresh_Gram();//更新显示到OLED         


        max30102_init();


        printf("rn MAX30102  init  rn");


        un_min=0x3FFFF;

        un_max=0;

        

        n_ir_buffer_length=500; //buffer length of 100 stores 5 seconds of samples running at 100sps

        //read the first 500 samples, and determine the signal range

    for(i=0;i

    {

        while(MAX30102_INT==1);   //wait until the interrupt pin asserts

        

                max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);

                aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number

                aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number

            

        if(un_min>aun_red_buffer[i])

            un_min=aun_red_buffer[i];    //update signal min

        if(un_max

            un_max=aun_red_buffer[i];    //update signal max

    }

        un_prev_data=aun_red_buffer[i];

        //calculate heart rate and SpO2 after first 500 samples (first 5 seconds of samples)

    maxim_heart_rate_and_oxygen_saturation(aun_ir_buffer, n_ir_buffer_length, aun_red_buffer, &n_sp02, &ch_spo2_valid, &n_heart_rate, &ch_hr_valid);

        

        while(1)

        {

                i=0;

        un_min=0x3FFFF;

        un_max=0;

               

                //dumping the first 100 sets of samples in the memory and shift the last 400 sets of samples to the top

        for(i=100;i<500;i++)

        {

            aun_red_buffer[i-100]=aun_red_buffer[i];

            aun_ir_buffer[i-100]=aun_ir_buffer[i];

            

            //update the signal min and max

            if(un_min>aun_red_buffer[i])

            un_min=aun_red_buffer[i];

            if(un_max

            un_max=aun_red_buffer[i];

        }

                //take 100 sets of samples before calculating the heart rate.

        for(i=400;i<500;i++)

        {

            un_prev_data=aun_red_buffer[i-1];

            while(MAX30102_INT==1);

            max30102_FIFO_ReadBytes(REG_FIFO_DATA,temp);

                        aun_red_buffer[i] =  (long)((long)((long)temp[0]&0x03)<<16) | (long)temp[1]<<8 | (long)temp[2];    // Combine values to get the actual number

                        aun_ir_buffer[i] = (long)((long)((long)temp[3] & 0x03)<<16) |(long)temp[4]<<8 | (long)temp[5];   // Combine values to get the actual number

        

            if(aun_red_buffer[i]>un_prev_data)

            {

                f_temp=aun_red_buffer[i]-un_prev_data;

                f_temp/=(un_max-un_min);

                f_temp*=MAX_BRIGHTNESS;

                n_brightness-=(int)f_temp;

                if(n_brightness<0)

                    n_brightness=0;

            }

            else

            {

                f_temp=un_prev_data-aun_red_buffer[i];

                f_temp/=(un_max-un_min);

                f_temp*=MAX_BRIGHTNESS;

                n_brightness+=(int)f_temp;

                if(n_brightness>MAX_BRIGHTNESS)

                    n_brightness=MAX_BRIGHTNESS;

            }

                        //send samples and calculation result to terminal program through UART

                        if(ch_hr_valid == 1 && n_heart_rate<120)//**/ ch_hr_valid == 1 && ch_spo2_valid ==1 && n_heart_rate<120 && n_sp02<101

                        {

                                dis_hr = n_heart_rate;

                                dis_spo2 = n_sp02;

                        }

                        else

                        {

                                dis_hr = 0;

                                dis_spo2 = 0;

                        }

                                printf("HR=%i, ", n_heart_rate);

                                printf("HRvalid=%i, ", ch_hr_valid);

                                printf("SpO2=%i, ", n_sp02);

                                printf("SPO2Valid=%irn", ch_spo2_valid);

[1] [2]
关键字:MAX30102  空气质量监测模块  STM32 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic505498.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32单片机LCD240128搬货物Proteus仿真程序
下一篇:STM32F103ZE+mpu6050+hmc5883L通过卡尔曼滤波串口输出姿态角

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

MAX30102基于STM32F103C8T6的程序源码
单片机源程序如下:/** file main.cpp ******************************************************** Project: STM32F103C8T6+MAX30102* Edited by Anning* ------------------------------------------------------------------------- *//******************************************************************************** Copyright (C) 2016 Maxim
发表于 2020-08-08
STM32定时器T2纯软件仿真时间准确,JTAG在线调试查看时间不准
通过查看Sec的值和上次中断的差值计算的,虽然这个值是不准的 ,但实际上时间是准的,原因如下:stm32在调试模式下虽然进断点之后程序停止了,但定时器的时钟还在走,计数器还在计数,若要在产生断点时计数器停止计数可以在初始化时调用函数DBGMCU_Config(DBGMCU_TIM2_STOP,ENABLE);,这样一来仿真的时候定时时间就是准的了
发表于 2020-09-15
<font color='red'>STM32</font>定时器T2纯软件仿真时间准确,JTAG在线调试查看时间不准
STM32的JTAG下载模式
SWJ:串行线JTAG配置 (Serial wire JTAG configuration)SWJ(串行线JTAG)支持JTAG或SWD访问Cortex的调试端口。系统复位后的默认状态是启用SWJ但没有跟踪功能,这种状态下可以通过JTMS/JTCK脚上的特定信号选择JTAG或SW(串行线)模式。
发表于 2020-09-15
Python 和OpenMV如何玩转 STM32 MCU
如今网络边缘侧的机器学习现状如何?哪些工具可以帮助工程师收集数据并执行推断运算?在哪里可以找到ST MEMS,它们对现实生活中的产品有哪些影响?本文是我们即将举行的STM32全国研讨会系列的第二篇专题文章。在第14届STM32全国研讨会上,我们将通过应用演示、产品展示以及工程师与观众互动回答问题的方式,来与蝶粉社区近距离交流。在STM32全国研讨会专题系列报道第一部分我们着重介绍了云连接方面的用例,如一款新的智能门铃功能演示,还介绍了工业和数据安全相关应用。 今天,我们将重点探讨人工智能、计算以及感知技术。 人工智能与计算Qeexo 和STM32Cube.AI 当今边缘机器学习解决方案的种类
发表于 2020-09-14
stm32定时器主从模式
TIM2作master;TIM3,TIM4作slave定时器2事件更新被用作触发输出TRGO从定时器TIM3,TIM4工作在从模式:门控模式触发选择设为:ITR1,这样TIM2的TRGO就连到了TIM3和TIM4的内部触发输入ITR1上,经过一系列选择器之后TIM2的TRGO就是TIM3和tim4的TRGI;这样一来就可以通过控制TIM2的period和Pulse来控制TIM3和TIM4输出一定的脉冲个数;
发表于 2020-09-14
<font color='red'>stm32</font>定时器主从模式
STM32驱动74hc595
#include "bsp_74HC595.h"#define HC595_DS        PCout(13)//#define HC595_OE        PAout(0)//#define HC595_ST_CP        PBout(9)//#define HC595_SH_CP             PBout(8)//static void HC595_Delay(u32 t){    u32 i; 
发表于 2020-09-14
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2020 EEWORLD.com.cn, Inc. All rights reserved