【单片机】心率传感器,串口发送,MAX30102心率传感器模块

数值还是稳定的,但太贵了,stm32单片机的话,直接用这篇博客(https://qq742971636.blog.csdn.net/article/details/137359381)的代码,一样稳定。

在这里插入图片描述

在这里插入图片描述

解析这个模块的数据

char rev_max30102_bufferdata[30];
char rev_max30102_data_cnt = 0;
char rev_max30102_flag = 0;
char rev_max30102_timercnt = 0;
char rev_max30102_sucess = 0;
uint32_t max30102_value_heart = 0;
uint32_t max30102_value_spo2 = 0;
char trig_max30102 = 0;
char trig_max30102_suc_cnt = 0;
char trig_max30102_timer_cnt = 0;
void USART3_IRQHandler(void) {
    u8 res;
    if (USART_GetITStatus(USART3, USART_IT_RXNE) != RESET) /* 接收到数据 */
    {
        res = USART_ReceiveData(USART3);
        if (rev_max30102_flag == 0) {
            rev_max30102_data_cnt = 0;
            rev_max30102_bufferdata[rev_max30102_data_cnt++] = res;
            rev_max30102_flag = 1;
        } else if (rev_max30102_flag == 1) {
            rev_max30102_bufferdata[rev_max30102_data_cnt++] = res;
            if (rev_max30102_data_cnt >= 30) {
                rev_max30102_data_cnt = 0;
            }
        }

    }
}



// 10ms
void TIM4_IRQHandler(void)                                    /* TIM4中断 */
{
    if (TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET)  /* 检查TIM4更新中断发生与否 */
    {
        TIM_ClearITPendingBit(TIM4, TIM_IT_Update);   /* 清除TIM4更新中断标志 */

        //10ms一帧
        if (rev_max30102_flag == 1) {
            rev_max30102_timercnt++;
        }
        if (rev_max30102_timercnt >= 4) {
            rev_max30102_timercnt = 0;
            rev_max30102_flag = 0;
            //数据处理标志
            rev_max30102_sucess = 1;
        }

    }
}

 if (trig_max30102) {
            if (trig_max30102_suc_cnt == 0) {//心率测量
                trig_max30102_timer_cnt++;
                if (trig_max30102_timer_cnt == 2) {
                    USART3_SendString("AT+HEART\r\n");
                }
                if (trig_max30102_timer_cnt > 20) { //200ms发一次
                    trig_max30102_timer_cnt = 0;
                }

                if (rev_max30102_sucess == 1) {
                    rev_max30102_sucess = 0;
                    //收到的是"+HEART=75\r\nOK"
                    if ((rev_max30102_bufferdata[0] == '+') && (rev_max30102_bufferdata[1] == 'H') &&
                        (rev_max30102_bufferdata[2] == 'E') && (rev_max30102_bufferdata[3] == 'A') &&
                        (rev_max30102_bufferdata[4] == 'R') && (rev_max30102_bufferdata[5] == 'T')) {
                        if (rev_max30102_bufferdata[9] == '\r') {
                            rev_max30102_bufferdata[7] = rev_max30102_bufferdata[7] - '0';
                            rev_max30102_bufferdata[8] = rev_max30102_bufferdata[8] - '0';
                            max30102_value_heart = rev_max30102_bufferdata[7] * 10 + rev_max30102_bufferdata[8];
                            trig_max30102_suc_cnt = 1;//心率测完了
                        } else if (rev_max30102_bufferdata[10] == '\r') {
                            rev_max30102_bufferdata[7] = rev_max30102_bufferdata[7] - '0';
                            rev_max30102_bufferdata[8] = rev_max30102_bufferdata[8] - '0';
                            rev_max30102_bufferdata[9] = rev_max30102_bufferdata[9] - '0';
                            max30102_value_heart = rev_max30102_bufferdata[7] * 100 + rev_max30102_bufferdata[8] * 10 +
                                                   rev_max30102_bufferdata[9];
                            trig_max30102_suc_cnt = 1;//心率测完了
                        }
                    }
                }
            } else if (trig_max30102_suc_cnt == 1) {//测血氧
                trig_max30102_timer_cnt++;
                if (trig_max30102_timer_cnt == 2) {
                    USART3_SendString("AT+SPO2\r\n");
                }
                if (trig_max30102_timer_cnt > 20) { //200ms发一次
                    trig_max30102_timer_cnt = 0;
                }
                if (rev_max30102_sucess == 1) {
                    rev_max30102_sucess = 0;
                    //收到的是"+SPO2=75\r\nOK"
                    if ((rev_max30102_bufferdata[0] == '+') && (rev_max30102_bufferdata[1] == 'S') &&
                        (rev_max30102_bufferdata[2] == 'P') && (rev_max30102_bufferdata[3] == 'O') &&
                        (rev_max30102_bufferdata[4] == '2')) {
                        if (rev_max30102_bufferdata[8] == '\r') {
                            rev_max30102_bufferdata[6] = rev_max30102_bufferdata[6] - '0';
                            rev_max30102_bufferdata[7] = rev_max30102_bufferdata[7] - '0';
                            max30102_value_spo2 = rev_max30102_bufferdata[6] * 10 + rev_max30102_bufferdata[7];
                            trig_max30102_suc_cnt = 2;//血氧测完了
                            trig_max30102 = 0;
                        } else if (rev_max30102_bufferdata[9] == '\r') {
                            rev_max30102_bufferdata[6] = rev_max30102_bufferdata[6] - '0';
                            rev_max30102_bufferdata[7] = rev_max30102_bufferdata[7] - '0';
                            rev_max30102_bufferdata[8] = rev_max30102_bufferdata[8] - '0';
                            max30102_value_spo2 = rev_max30102_bufferdata[6] * 100 + rev_max30102_bufferdata[7] * 10 +
                                                  rev_max30102_bufferdata[8];
                            trig_max30102_suc_cnt = 2;//血氧测完了
                            trig_max30102 = 0;
                        }
                    }
                }
            }
        }
            //显示心率和血氧
            memset(disp, 0, 16);
            sprintf(disp, "HR%d SPO2%d", max30102_value_heart, max30102_value_spo2);
            OLED_P8x16Str(0, 4, disp, 0);

帮助、问询

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tab=BB08J2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/521311.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flutter学习12 - SharedPreferences

1、shared_preferences 插件 类似于 Android 中的 SharedPreferences,键值对的形式进行本地存储 1.1、引入插件 在 pubspec.yaml 中引入 dependencies:shared_preferences: ^2.1.0在需要用到的文件中引入 import package:shared_preferences/shared_preference…

安全的通信协议HTTPS被攻击改采用什么防护方案

随着互联网的发展,保护用户在网上交换的敏感信息的安全性变得至关重要。HTTPS(Hypertext Transfer Protocol Secure)作为一种安全的通信协议,通过加密数据传输,保护用户的隐私和数据安全。然而,尽管HTTPS提…

Ubuntu部署LangChain-Chatchat

个人博客:https://blog.lukeewin.top 更多内容欢迎访问我的博客。 一、环境 OS: Ubuntu 20.04 PyTorch: 2.0.0 Python: 3.8 CUDA: 11.8 GPU: RTX 4090 24GB CPU: 12 vCPU Intel(R) Xeon(R) Platinum 8352V CPU 2.10GHz RAM: 90GB 硬盘: 180GB LLM: Chatglm3-6b E…

ubuntu20.04.6安装sshd服务,并连接到远程服务器

文章目录 sshd 是 OpenSSH 服务器的守护进程OpenSSH下载在 Ubuntu 上,可以按照以下步骤来管理 sshd 服务 防火墙开启22端口使用Mobaxterm链接服务器 sshd 是 OpenSSH 服务器的守护进程 它负责提供远程登录和安全的 shell 服务。通过启动 sshd 服务,可以…

小米汽车su7全色系展示源码

源码简介 小米汽车全色系展示源码,小米汽车su7全色系展示源码 安装教程 纯HTML,直接将压缩包上传网站目录解压即可 首页截图 源码下载 小米汽车su7全色系展示源码-小8源码屋源码简介 小米汽车全色系展示源码,小米汽车su7全色系展示源码 …

015——步进电机模块驱动开发(基于I.MX6uLL、MX-1502和28BYJ-48)

目录 一、电机驱动模块介绍 1.1 特性 1.2 应用范围 1.3 概述 1.4 电气属性 1.5 经典应用线路 二、电机介绍(本节内容来自韦东山老师课程资料) 三、 代码编写思路 四、 驱动程序 五、应用程序 一、电机驱动模块介绍 1.1 特性  低待机电流 (…

lua学习笔记6(经典问题输出99乘法表)

print("************for循环的99乘法表*************") for i 1, 9 dolocal line "" -- 创建一个局部变量来累积每行的输出--local 是一个关键字,用于声明一个局部变量。for j 1, i doline line .. j .. "*" .. i .. ""…

基于YOLOv8的铁路工人安全作业检测系统

💡💡💡本文摘要:基于YOLOv8的铁路工人安全作业检测系统,属于小目标检测范畴,并阐述了整个数据制作和训练可视化过程, 博主简介 AI小怪兽,YOLO骨灰级玩家,1&#xff0…

考研高数(平面图形的面积,旋转体的体积)

1.平面图形的面积 纠正:参数方程求面积 2.旋转体的体积(做题时,若以x为自变量不好计算,可以求反函数,y为自变量进行计算)

深入浅出 -- 系统架构之分布式多形态的存储型集群

一、多形态的存储型集群 在上阶段,我们简单聊了下集群的基本知识,以及快速过了一下逻辑处理型集群的内容,下面重点来看看存储型集群,毕竟这块才是重头戏,集群的形态在其中有着多种多样的变化。 逻辑处理型的应用&…

Docker容器与虚拟化技术:OpenEuler 部署 Prometheus 与 Grafana

目录 一、实验 1.环境 2.OpenEuler 部署 Prometheus 3.OpenEuler 部署 Grafana 4.使用cpolar内网穿透 二、问题 1.拉取镜像失败 2.如何导入Grafana监控模板(ES) 一、实验 1.环境 (1)主机 表1 主机 系统架构版本IP备注…

【简单讲解下epoll】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

ELK报错,索引变成只读状态。

问题描述 今天发现当天的索引在ES中并没有创建,logstash中不停的报错: [2021-05-24T05:47:51,904][INFO ][logstash.outputs.elasticsearch] retrying failed action with response code: 403 ({“type”>“cluster_block_exception”, “reason”&g…

c++算法学习笔记 (20) 哈希表

1.模拟散列表 // 拉链法 #include <bits/stdc.h> using namespace std; const int N 100003; int h[N]; int e[N], ne[N], idx; // 存链void insert(int x) {int k (x % N N) % N; // 让负数的余数变成正数(若直接加N,则可能溢出)e[idx] x;ne[idx] h[k];h[k] idx;…

29岁东张女神凭索爆身材演活情妇角色。

正在热播的《逆天奇案2》&#xff0c;云集陈展鹏、林夏薇、冯盈盈、黄智贤、蒋祖曼、多位老戏骨&#xff0c;亦有不少新力军。日前一集展开新单元「龙头棍风暴」&#xff0c;饰演林景程情妇的王嘉慧&#xff08;Cathy&#xff09;&#xff0c;与平日「东张女神」形象反差极大。…

记录重装ubuntu系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言无法进入ubuntu图形化界面进入ubuntu的tty模式开始解决误打误撞进入X-Window界面&#xff0c;拷贝ubuntu系统文件重装ubuntu系统 前言 提示&#xff1a;这里可…

解决win7作为虚拟机无法复制粘贴共享文件的问题

win7作为虚拟机经常会出现无法与主机的剪切板共享、文件共享。 归根结底是win7虚拟机里面没有安装VMware Tools 能够成功安装vmware tools的条件&#xff1a; 1&#xff09;win7版本为win7 sp1及以上 2&#xff09;安装KB4490628&#xff0c;KB4474419补丁 因此下面来详细介绍…

【鸿蒙 HarmonyOS】@ohos.promptAction (弹窗)

一、背景 创建并显示文本提示框、对话框和操作菜单。 文档地址&#x1f449;&#xff1a;文档中心 说明 本模块首批接口从API version 9开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 该模块不支持在UIAbility的文件声明处使用&#xff0c;即…

sfml sdl2 windows vscode 调试和coderunner插件运行

链接库写在编译链接命令里&#xff0c;如果没有使用到不会加入到生成的可执行文件里。所以tasks.json可以这样写&#xff0c; {"version": "2.0.0","tasks": [{"type": "cppbuild","label": "C/C: g.exe 生…

Hive 之 UDF 运用(包会的)

文章目录 UDF 是什么&#xff1f;reflect静态方法调用实例方法调用 自定义 UDF&#xff08;GenericUDF&#xff09;1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么&#xff1f; H…