【Esp32】用esp32和max30102制作一个血氧仪
【物资准备】
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制作一个血氧仪相关推荐
- ESP32制作一个拟辉光管时钟
拟辉光管时钟 60 多年过去了,尽管辉光管已经停产,有很多工程师仍然对它情有独钟.我用 8 块液晶显示屏制作了一个拟辉光管时钟,感受复古元素的美感,表达对过去经典的敬意. 项目起源 看过<命运石 ...
- 乐鑫Esp32学习之旅⑦ esp32上利用GPIO中断做一个按键的短按和长按的回调事件,再也无须担心触发源。(附带Demo)
本系列博客学习由非官方人员 半颗心脏 潜心所力所写,仅仅做个人技术交流分享,不做任何商业用途.如有不对之处,请留言,本人及时更改. 1. 爬坑学习新旅程,虚拟机搭建esp32开发环境,打印 " ...
- 用安信可ESP32-G开发板制作一个简易路由器
文章目录 一.前言 二.中继路由器 三.以太网路由器 四.源码及使用方法 联系我们 一.前言 本文介绍用安信可ESP32-G开发板制作一个路由器,有两种玩法; ESP32无线连接路由器后开启热点,周围 ...
- 55节开源巨献,教你制作一个智能无线电应答平台
<如何制作一个智能无线电应答平台> 作者:BG7EJL 项目背景 目前市面上基于U/V ...
- arduino nano 蓝牙_用Arduino玩转掌控板(ESP32):ESP32概述与Arduino软件准备
前言 近年来,掌控板(英文名:mPython)在创客教育中应用越来越广泛.掌控板集成了 ESP32 高性能双核芯片,具备 WiFi 和蓝牙连接功能,同时在板子上又配置了丰富的传感器,最重要的是它是专门 ...
- 【Esp32】Esp32+sx1268 Spi接口驱动SX1268模块
[Esp32]Spi接口驱动SX1268模块 0. 实验结果 1.原理解析 2.硬件接线 3. SX1268 模块的 SPI 时序分析 4. 基于 ESP32 实现函数封装 4.1 读寄存器 4.2 ...
- 如何制作一个类似Tiny Wings的游戏 Cocos2d-x 2.1.4
在第一篇<如何使用CCRenderTexture创建动态纹理>基础上,增加创建动态山丘,原文<How To Create A Game Like Tiny Wings with Co ...
- 制作一个简单的linux
我这里是借助宿主机做的一个简单的Linux,我们只要知道一个Linux启动过程需要什么,这里制作就简单的多了.不过没有基础的也没关系,我写的很详细,没有基础的看了我写的步骤只要细心也是会做出来的,我这 ...
- 使用 ale.js 制作一个小而美的表格编辑器(2)
今天来教大家如何使用 ale.js 制作一个小而美的表格编辑器,首先先上 gif: 是不是还是有一点非常 cool 的感觉的?那么我们现在开始吧! 这是我们这篇文章结束后完成的效果(如果想继续完成请访 ...
最新文章
- Windows server 2003 IP路由配置
- Xposed框架实战
- roc曲线怎么绘制_利用ROC曲线寻找最佳cutoff值(连续型变量组成的riskscore)
- Dubbo(十)之配置加载流程
- Extmail maildrop错误
- JUnit 5 Alpha版本简化了单元测试
- 【带权并查集 —— 是否说谎】Parity game【POJ 1733】
- QML 环形进度条canvas 98行代码实现
- windows 删除服务命令
- 移动端开发框架mui介绍
- 利用python实现对豆瓣排名电影的信息获取
- ligerui demo php,LigerUI——天外飞仙
- nyoj 海岛争霸(Floyd最短路径)
- LASSO近端梯度下降法Proximal Gradient Descent公式推导及代码
- 2019年第十届蓝桥杯C/C++ 省赛B组真题+题解
- 报错已加载插件:fastestmirror, langpacksLoading mirror speeds from cached hostfileThere are no enabled repos
- JavaScript进阶(4)-dom查询
- AMZ Seller Browser|亚马逊产品研究工具
- 卸载CUDA10.1,安装CUDA10.0
- 利用Python爬取微信好友头像
热门文章
- 渗透测试--ARP攻击
- 二叉树的基本概念及遍历(先中后)序
- 「VUE 3」 v-model 的使用变化
- 团体无线心理测评系统:心理健康评估、抑郁筛查、危机预警、问卷调查、物联网测评
- oracle 获取每周五,Oracle获取周几以及每周对应得开始日期和结束日期
- IBM陈国豪谈虚拟化、刀片、云计算及绿色存储
- 全面认识包图,组件图,部署图
- HTML 中 a:link ...什么意思
- 沃利斯圆周率用c语言,沃利斯圆周率计算公式!
- 微信小程序 - 音频播放进度条和点击拖动的控制,支持自定义音乐播放控件样式布局(wx.createAudioContext)解决各种 InnerAudioContext.onTimeUpdate不执行