【物资准备】

esp32-wroom

max30102

点灯科技账号or阿里云物联网平台账号

(本来是想用屏幕去显示的,但是我发现我的esp32只有一个iic引出来,而max30102模块正好是iic通讯,我又懒得弄spi的屏幕,所以用手机app或者网页去起到显示数据的一个作用了)

1、阿里云物联网平台

先上代码

#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>// 这里添加要连的wifi名称和密码
const char* ssid     = "";
const char* password = "";/* 设备证书信息,根据情况修改*/
#define PRODUCT_KEY       ""
#define DEVICE_NAME       ""
#define DEVICE_SECRET     ""
#define REGION_ID         "cn-shanghai"#define CLIENT_ID         ""
#define MQTT_PASSWD       ""#define ALINK_BODY_FORMAT         "{\"params\":%s}"
#define ALINK_TOPIC_PROP_POST     "/sys/" PRODUCT_KEY "/" DEVICE_NAME "/thing/event/property/post"/* 线上环境域名和端口号,不需要改 */
#define MQTT_SERVER       PRODUCT_KEY ".iot-as-mqtt." REGION_ID ".aliyuncs.com"
#define MQTT_PORT         1883
#define MQTT_USRNAME      DEVICE_NAME "&" PRODUCT_KEYWiFiClient espClient;
PubSubClient  client(espClient);void WiFiInit()
{WiFi.begin(ssid, password);while(WiFi.status() != WL_CONNECTED){delay(500);Serial.print(".");}Serial.println("WIFI CONNECTED!");
}// 连接MQTT,每隔5s自动重连
void mqttCheckConnect()
{while(!client.connected()){Serial.println("Connecting to MQTT Server ...");if(client.connect(CLIENT_ID, MQTT_USRNAME, MQTT_PASSWD)){Serial.println("MQTT Connected!");}else{Serial.print("MQTT Connect err:");Serial.println(client.state());delay(5000);}}
}// publish(ESP32发送,阿里云接收)
void mqttIntervalPost()
{char param[32];     // 存放参数数据char jsonBuf[128];  // 存放json格式数据sprintf(param, "{\"XY\":%d}", 32); //这是测试的发送数据sprintf(jsonBuf, ALINK_BODY_FORMAT, param);Serial.println(jsonBuf);if(client.publish(ALINK_TOPIC_PROP_POST, jsonBuf)){Serial.println("Publish success!");}else{Serial.println("Publish error!");}
}void setup()
{Serial.begin(115200);WiFiInit();client.setServer(MQTT_SERVER, MQTT_PORT);client.setCallback(callback);}void loop()
{if(!client.connected()){mqttCheckConnect();//mqttIntervalPost();}mqttIntervalPost();//定期发送血氧数据client.loop();delay(500);
}

阿里云我用的是物联网平台接收数据+物联网平台内置的lot Studio来实现网页上线显示数据

2、用点灯科技来实现app

先直接上代码,用的是blinker库

#define BLINKER_PRINT Serial
#define BLINKER_WIFI#include <Blinker.h>char auth[] = "";
char ssid[] = "";
char pswd[] = "";// 新建组件对象
BlinkerNumber Number1("num-gwy"); //xueyang
BlinkerNumber Number2("num-xoe"); //xinlvvoid setup() {// put your setup code here, to run once:// 初始化串口Serial.begin(115200);// 初始化有LED的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);// 初始化blinkerBlinker.begin(auth, ssid, pswd);
}void loop() {Number1.print(93);    //血氧测试数据Blinker.run();
}

外面的资料都比较少,只能看官方文档

3、MAX30102

直接上代码

void setup() {// put your setup code here, to run once:// 初始化串口Serial.begin(115200);#if defined(BLINKER_PRINT)BLINKER_DEBUG.stream(BLINKER_PRINT);#endif// 初始化有LED的IOpinMode(LED_BUILTIN, OUTPUT);digitalWrite(LED_BUILTIN, HIGH);// 初始化blinkerBlinker.begin(auth, ssid, pswd);// Initialize sensorif (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //Use default I2C port, 400kHz speed{Serial.println(F("MAX30105 was not found. Please check wiring/power."));while (1);}byte ledBrightness = 60; //Options: 0=Off to 255=50mAbyte sampleAverage = 4; //Options: 1, 2, 4, 8, 16, 32byte ledMode = 2; //Options: 1 = Red only, 2 = Red + IR, 3 = Red + IR + Greenbyte sampleRate = 100; //Options: 50, 100, 200, 400, 800, 1000, 1600, 3200int pulseWidth = 411; //Options: 69, 118, 215, 411int adcRange = 4096; //Options: 2048, 4096, 8192, 16384particleSensor.setup(ledBrightness, sampleAverage, ledMode, sampleRate, pulseWidth, adcRange); //Configure sensor with these settings}void loop() {// put your main code here, to run repeatedly:bufferLength = 100; //buffer length of 100 stores 4 seconds of samples running at 25sps//read the first 100 samples, and determine the signal rangefor (byte i = 0 ; i < bufferLength ; i++){while (particleSensor.available() == false) //do we have new data?particleSensor.check(); //Check the sensor for new dataredBuffer[i] = particleSensor.getRed();irBuffer[i] = particleSensor.getIR();particleSensor.nextSample(); //We're finished with this sample so move to next sampleSerial.print(F("red="));Serial.print(redBuffer[i], DEC);Serial.print(F(", ir="));Serial.println(irBuffer[i], DEC);}//calculate heart rate and SpO2 after first 100 samples (first 4 seconds of samples)maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);//Continuously taking samples from MAX30102.  Heart rate and SpO2 are calculated every 1 secondwhile (1){//dumping the first 25 sets of samples in the memory and shift the last 75 sets of samples to the topfor (byte i = 25; i < 100; i++){redBuffer[i - 25] = redBuffer[i];irBuffer[i - 25] = irBuffer[i];}//take 25 sets of samples before calculating the heart rate.for (byte i = 75; i < 100; i++){while (particleSensor.available() == false) //do we have new data?particleSensor.check(); //Check the sensor for new datadigitalWrite(readLED, !digitalRead(readLED)); //Blink onboard LED with every data readredBuffer[i] = particleSensor.getRed();irBuffer[i] = particleSensor.getIR();particleSensor.nextSample(); //We're finished with this sample so move to next sample//send samples and calculation result to terminal program through UART//Serial.print(F("red="));//Serial.print(redBuffer[i], DEC);//Serial.print(F(", ir="));//Serial.print(irBuffer[i], DEC);Serial.print(F(", HR="));Serial.print(heartRate, DEC);Serial.print(F(", HRvalid="));Serial.print(validHeartRate, DEC);Serial.print(F(", SPO2="));Serial.print(spo2, DEC);Serial.print(F(", SPO2Valid="));Serial.println(validSPO2, DEC);}//After gathering 25 new samples recalculate HR and SP02maxim_heart_rate_and_oxygen_saturation(irBuffer, bufferLength, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);}Number1.print(spo2);Blinker.run();
}

但是不知道是不是模块问题还是我测量方式不对,好难测出准确的血氧数据= =

【Esp32】用esp32和max30102制作一个血氧仪相关推荐

  1. ESP32制作一个拟辉光管时钟

    拟辉光管时钟 60 多年过去了,尽管辉光管已经停产,有很多工程师仍然对它情有独钟.我用 8 块液晶显示屏制作了一个拟辉光管时钟,感受复古元素的美感,表达对过去经典的敬意. 项目起源 看过<命运石 ...

  2. 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)

    本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...

  3. 用安信可ESP32-G开发板制作一个简易路由器

    文章目录 一.前言 二.中继路由器 三.以太网路由器 四.源码及使用方法 联系我们 一.前言 本文介绍用安信可ESP32-G开发板制作一个路由器,有两种玩法; ESP32无线连接路由器后开启热点,周围 ...

  4. 55节开源巨献,教你制作一个智能无线电应答平台

           <如何制作一个智能无线电应答平台>                                             作者:BG7EJL 项目背景 目前市面上基于U/V ...

  5. arduino nano 蓝牙_用Arduino玩转掌控板(ESP32):ESP32概述与Arduino软件准备

    前言 近年来,掌控板(英文名:mPython)在创客教育中应用越来越广泛.掌控板集成了 ESP32 高性能双核芯片,具备 WiFi 和蓝牙连接功能,同时在板子上又配置了丰富的传感器,最重要的是它是专门 ...

  6. 【Esp32】Esp32+sx1268 Spi接口驱动SX1268模块

    [Esp32]Spi接口驱动SX1268模块 0. 实验结果 1.原理解析 2.硬件接线 3. SX1268 模块的 SPI 时序分析 4. 基于 ESP32 实现函数封装 4.1 读寄存器 4.2 ...

  7. 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4

    在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...

  8. 制作一个简单的linux

    我这里是借助宿主机做的一个简单的Linux,我们只要知道一个Linux启动过程需要什么,这里制作就简单的多了.不过没有基础的也没关系,我写的很详细,没有基础的看了我写的步骤只要细心也是会做出来的,我这 ...

  9. 使用 ale.js 制作一个小而美的表格编辑器(2)

    今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...

最新文章

  1. Windows server 2003 IP路由配置
  2. Xposed框架实战
  3. roc曲线怎么绘制_利用ROC曲线寻找最佳cutoff值(连续型变量组成的riskscore)
  4. Dubbo(十)之配置加载流程
  5. Extmail maildrop错误
  6. JUnit 5 Alpha版本简化了单元测试
  7. 【带权并查集 —— 是否说谎】Parity game【POJ 1733】
  8. QML 环形进度条canvas 98行代码实现
  9. windows 删除服务命令
  10. 移动端开发框架mui介绍
  11. 利用python实现对豆瓣排名电影的信息获取
  12. ligerui demo php,LigerUI——天外飞仙
  13. nyoj 海岛争霸(Floyd最短路径)
  14. LASSO近端梯度下降法Proximal Gradient Descent公式推导及代码
  15. 2019年第十届蓝桥杯C/C++ 省赛B组真题+题解
  16. 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos
  17. JavaScript进阶(4)-dom查询
  18. AMZ Seller Browser|亚马逊产品研究工具
  19. 卸载CUDA10.1,安装CUDA10.0
  20. 利用Python爬取微信好友头像

热门文章

  1. 渗透测试--ARP攻击
  2. 二叉树的基本概念及遍历(先中后)序
  3. 「VUE 3」 v-model 的使用变化
  4. 团体无线心理测评系统:心理健康评估、抑郁筛查、危机预警、问卷调查、物联网测评
  5. oracle 获取每周五,Oracle获取周几以及每周对应得开始日期和结束日期
  6. IBM陈国豪谈虚拟化、刀片、云计算及绿色存储
  7. 全面认识包图,组件图,部署图
  8. HTML 中 a:link ...什么意思
  9. 沃利斯圆周率用c语言,沃利斯圆周率计算公式!
  10. 微信小程序 - 音频播放进度条和点击拖动的控制,支持自定义音乐播放控件样式布局(wx.createAudioContext)解决各种 InnerAudioContext.onTimeUpdate不执行