OLED显示

1.所需硬件


脉搏传感器

OLED模块

Arduino主板

2.连接方式

脉搏传感器与主板连接
s — A0
+— 5V
-— GND

OLED模块与主板连接
GND—GND
VCC—3.3V或5V
SCL—A5
SDA—A4

3.基本思路

脉搏传感器原理

首先,需要简要了解一下脉搏传感器大致原理。
脉搏传感器能把脉搏跳动压力转化为电信号输出(以电压形式)。基于这种原理,就可以利用电压值的变化计算脉搏跳动数。

计算脉搏数的思路


如图,跳离直线y=v0的点A1,A2,A3可表示为脉搏跳动的点(脉搏跳动,输出电压增大),而直线y=v0上的其余点则为脉搏平静时的点。如果可以获得每次跳动时的时刻点t1,t2,t3,从而求得Δt,就可利用 跳动次数=总时间/时间间隔 的公式求得每段Δt上的平均脉搏数。

绘制心率图的思路

因为脉搏的跳动导致电压的变化,于是就可以利用电压的变化来绘制折线图(先绘点,再连线)。将某一点的电压值以一定比例缩放为合适的值,作为该点的纵坐标,对应该点的横坐标(横坐标对应时刻点)。随着时间变化,点的横坐标向前推移,纵坐标随之变化。此时再将点与点之间连上直线,即可绘制出心率折线图。

4.代码

声明

#include <Adafruit_SSD1306.h>   //调用一个库文件#define OLED_Address 0x3C     //用OLED_Address取代0x3C//0x3C——16进制数(通讯地址)
#define UpperThreshold 550   //用UpperThreshold取代550
#define LowerThreshold 500   //用LowerThreshold取代500
//UpperThreshold,LowerThreshold为引脚输出模拟电压值的阈值
Adafruit_SSD1306 oled;      //定义变量名为oled

定义变量

//定义变量
int x=0;            //当前点的横坐标
int lastx=0;        //上一个点的横坐标
int lasty=0;        //上一个点的纵坐标
int LastTime=0;     //上一次测量的毫秒数
bool BPMTiming=false;           //LastTime是否为正确的脉搏起始计时点
bool BeatComplete=false;       //一次跳动是否完成=是否可以开始计算下一次跳动(取决于起始计时点是否正确和是否为跳动间隔期)
int BPM=0;         //脉搏跳动数

setup函数

void setup() {oled.begin(SSD1306_SWITCHCAPVCC, OLED_Address);     //初始化oled屏幕的通讯地址为OLED_Address(也就是0x3C)oled.clearDisplay();     //oled清空显示oled.setTextSize(2);     //设置oled显示字体为2号字体
}

loop函数

void loop()
{if(x>127)                    //若屏幕显示已满,清空再来{oled.clearDisplay();      //oled清空显示x=0;                     //当前点横坐标赋值为0lastx=x;                 //上一个点横坐标也为赋值为0}int value=analogRead(0);      //analogRead函数用于读取引脚的模拟电压值,参数0表示所有获取电压值的引脚为A0,返回值为引脚的模拟量电压值oled.setTextColor(WHITE);     //oled显示字体为白色int y=20-(value/45);          //当前点的纵坐标(取决于引脚获取的电压值)oled.writeLine(lastx,lasty,x,y,WHITE);    //从上一个点到当前点画线lasty=y;        //将当前点坐标赋给上一个点,当前点变成上一个点lastx=x;//计算BMP if(value>UpperThreshold)     //如果跳动{if(BeatComplete)          //如果上一次跳动完成,可以开始计算下一次跳动{  BPM=millis()-LastTime;          //millis函数返回的Arduino板开始运行当前程序时的毫秒数,两次测量中间间隔的毫秒数BPM=int(60/(float(BPM)/1000));      //计算BPM(跳动数=总时间/跳动时间间隔)BPMTiming=false;                 //该次跳动的BPM值已经计算,要进入下一次BPM计算,而起始计时点还为原来的起始计时点BeatComplete=false;             //起始计时点错误,跳动未完成}if(BPMTiming==false)       //将起始计时点变为正确起始计时点{LastTime=millis();      //将现在的毫秒数赋变为上一次的毫秒数 BPMTiming=true;    }}if((value<LowerThreshold)&(BPMTiming))      //如果起始计时点正确且进入跳动间隔期BeatComplete=true;                       //一次跳动完成//显示BMP值oled.writeFillRect(0,19,128,20,BLACK);    //画一个填充矩形 oled.setCursor(0,19);    //设置oled内容显示的位置oled.print(BPM);         //设置oled显示的内容oled.print(" BPM");oled.display();     //设置完成,更新显示内容x++;               //横坐标+1,进入下一个循环
}

5.最终效果


最终OLED模块上显示出心率折线图和脉搏数(BPM)。

PS: 代码小白初次尝试,还请大佬们多多包涵,多多指点。

Arduino之个人健康助理——简易智能药盒系列2相关推荐

  1. arduino智能浇花系统_解放双手!自己动手做一个简易智能浇花系统

    原标题:解放双手!自己动手做一个简易智能浇花系统 面对疫情,宅在家的我们可以以各种方式为战"疫"一线的医护工作者.紧急研究病毒的科研人员.口罩厂日夜工作的人们......加油打气. ...

  2. matlab智能小车避障,Arduino智能小车系列教程4——超声波避障

    Arduino智能小车系列教程4--超声波避障 Arduino智能小车系列教程 准备材料 超声波模块HC-SR04 舵机固定架 舵机安装 超声波接线 代码测试 代码详解 int getDistance ...

  3. 嵌入式单片机智能药盒设计(含代码)

    目录 前言 设计的内容 (1)显示 (2)定时时间与用药量的设定 (3)实时时间调节 (4)报警功能 时钟模块 蓝牙模块 系统软件设计 系统主程序 按键函数 中断服务函数 作品展示 测试药定时提醒功能 ...

  4. 基于Wio Terminal的简易智能家居中控系统(初代版本)

    经过不断地踩坑(学习),初代的简易智能家居中控系统已经做好了,在申请项目时填写的功能都做出来了,但是有些功能不是用Wio Terminal实现的(一方面是因为代码量太大,会给Wio Terminal的 ...

  5. 简易智能手环制作教程

    前言: 为了方便查看博客,特意申请了一个公众号,附上二维码,有兴趣的朋友可以关注,和我一起讨论学习,一起享受技术,一起成长. 转载地址:简易智能手环制作教程 1.智能手环简介 智能手环是一种穿戴式智能 ...

  6. mmse评估量表_简易智能精神状态评价量表(MMSE

    <简易智能精神状态评价量表(MMSE>由会员分享,可在线阅读,更多相关<简易智能精神状态评价量表(MMSE(3页珍藏版)>请在人人文库网上搜索. 1.Xxxxx医院简易智能/精 ...

  7. 特别提醒蓝牙语音智能药盒的设计思路(二)TTS技术应用篇,附手机小程序界面

    全文3000字,阅读时间约8分钟,建议收藏后慢慢看 目录 引言 蓝牙TTS智能药盒方案系统图 智能药盒是什么 智能药盒为什么需要语音提醒 语音提醒功能为什么要用TTS技术 TTS语音提醒的应用场景 1 ...

  8. 基于51单片机简易智能家居

    基于51单片机的智能家居的设计 前言 一.项目简介 二.开发环境/工具: 1.Keil 5/Keil 4 2.STC-ISP 3.蓝牙串口助手 4.手机app 三.硬件设计: 1.单片机与蓝牙模块连接 ...

  9. 基于arduino uno 开发板制作的 智能书包项目

    基于arduino uno 开发板制作的智能书包,当时收短视频启发,集合自动售货机的代码和RC522 读卡模块代码结合制作,现基本功能可以实现 ,目前代码部分尚不稳定需要继续改进 //一个智能书包小发 ...

最新文章

  1. windows 下搭建Web服务器
  2. matplotlib的下载和安装方法
  3. java定义一个盒子类box_定义一个Box(盒子)类,在该类定义中包括数据成员: length(长),width(宽)和height(...
  4. Linux之脚本执行
  5. android socket io和服务器_Java socket通讯服务器和客户端教学版
  6. Effective Java之对可恢复的情况使用受检异常,对编程错误使用运行时异常(五十八)
  7. win7下mongodb 2.6安装方法
  8. linux下解压.tar.bz2文件
  9. php use闭包参数,php 闭包use的使用
  10. 将Windows文件挂在到Linux上
  11. java 继承重写_java 封装 继承 重写 多态
  12. win7(64,32)下JDK的安装和配置
  13. Canvas beginPath()、moveTo()、 lineTo() 、stroke() 绘制直线路径,fillText() 绘制填色的文本
  14. FlasCC例子研究之bitmapdata
  15. 《沸腾十五年》 豆瓣评分[8.20]覆雨翻云的中国网事; 荡气回肠的产业传奇;虚拟世界的真实讲述;万象网络的还原走笔。...
  16. [GIS笔记] 闾国年:地理全息与全息GIS(未来的GIS)
  17. 向日葵公主与驴的爱情故事
  18. 不只是技术!成为IT经理必备的十大软技能
  19. 【Java 8 新特性】Java 8 Collectors:joining()使用示例
  20. MySQL实现7种 SQL JOINS

热门文章

  1. RISC-V基金会董事谭章熹:RISC-V,从边缘逐渐向中央扩展
  2. 基于单片机的数控直流电流源设计
  3. 语音识别——麦克风选型
  4. 第三集 Spring for Apache Kafka 接受消息
  5. linux关机重启机器人,Linux Stopped (tty output) 问题
  6. xrandr调节屏幕亮度 linux
  7. IDEO用户体验创新模式01
  8. 桌面打开计算机图标卡,电脑打开 只有界面什么都没有 一直卡一个壁纸
  9. PIN,PUK,IMEI,ICCID,Ki,IMSI,SMSP之间的区别
  10. 结合网站ASPCMS标签集锦