Arduino-ESP32-WROOM-32E—PulseSensor传感器测心率

2023-10-22 18:20

本文主要是介绍Arduino-ESP32-WROOM-32E—PulseSensor传感器测心率,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1、下载ESP32驱动

2、右击以管理员身份运行

3、运行完成后,即可安装成功。打开Adruino,选中如图开发板

4、双击打开.ino文件

5、 选择合适的开发板型号和端口

6、 安装库文件ESP32time、U8g2、PulseSensor Playground

 7、修改为自己的传感器S口连接的引脚,此处我选择D36。

8、修改OLED显示屏SCL和SDA的引脚。使用ESP32_WROOM_32E开发板时修改为22,21号。 

 9、定时中断启动中,可以采用按键来中断检测将数据存储到SD卡,ESP32_WROOM_32E开发板支持使用BOOT和EN口连接按键,EN为复位按键,所以此处采用BOOT IO0口,将外部中断attachInterrupt函数的第一个参数改为0。(具体选几号IO口请查阅开发板手册)。

函数功能:配置初始化外部中断

参数1:pin,外部中断所使用的引脚,ESP32所有引脚均可以配置为外部中断引脚

参数2:中断服务函数,此处填写函数名即可

参数3:中断触发方式,支持以下触发方式:

-LOW 低电平触发

-CHANGE 电平变化

-RISING 上升沿触发

-FALLING 下降沿触发

-HIGH 高电平触发

 10、若不安装SD卡,注释掉图中代码

 11、烧写成功后会出现ESP32 Sensor kit字样如图

 12将手指放入绿光保持静止,后出现

 完整代码如下:

#include "esp32-hal-cpu.h"
#include <stdio.h>
#include <string.h>
int initFlag = 0;  //硬件初始化标志
int intFlag = 0;   //按键1中断标志位
int count = 0;
char point[11];
#define USART_DEBUG 1  //使能串口打印调试信息
//RTC
#include <ESP32Time.h>
ESP32Time rtc(0);  //时间偏移量,单位ms
//OLED
#include <U8g2lib.h>
#include <Wire.h>
//SD Card
#include "FS.h"
#include "SD.h"
#include "SPI.h"
//OLED
#define OLED_SCL 22
#define OLED_SDA 21
//ADC->PulseSensor
#define USE_ARDUINO_INTERRUPTS false
#include <PulseSensorPlayground.h>
uint16_t dataHR = 0;
uint16_t data = 0;
struct Data {char HR[10] = "HR:0";char SPO2[10] = "SPO2:N/A";
} adcData;
PulseSensorPlayground pulseSensor;
const int OUTPUT_TYPE = SERIAL_PLOTTER;
const int PULSE_INPUT = 36;
#ifdef USART_DEBUG
const int THRESHOLD = 550;  // Adjust this number to avoid noise when idle
#else
const int THRESHOLD = 550;  // Adjust this number to avoid noise when idle
#endif
byte samplesUntilReport;
const byte SAMPLES_PER_SERIAL_SAMPLE = 10;
//OLED
U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /*reset=*/U8X8_PIN_NONE, /*clock=*/OLED_SCL, /*data=*/OLED_SDA);  //U8G2程序库 SSD1306控制晶片 128X64_NONAME解析度和型号 F暂存区大小可以改为1或2 F_HW_I2C控制介面 u8g2(U8G2_R0代表不旋转,U8X8_PIN_NONE代表没有重置引脚)
//Timer
hw_timer_t *timer = NULL;//按键1中断服务函数
ICACHE_RAM_ATTR void INTfunction() {if (intFlag == 0)intFlag = 1;elseintFlag = 0;
}void setup() {Serial.begin(115200);setCpuFrequencyMhz(240);
#ifdef USART_DEBUGSerial.print("CpuFrequency:");Serial.print(getCpuFrequencyMhz());Serial.println("MHz");
#endif/** RTC*/rtc.setTime(0, 0, 14, 7, 11, 2022);  // 7th Nov 2021 14:0:0/** OLED*/u8g2.begin();u8g2.enableUTF8Print();  //使能UTF-8支持库u8g2.setFont(u8g2_font_unifont_t_symbols);u8g2.clear();u8g2.clearBuffer();u8g2.firstPage();do {u8g2.setCursor(0, 14);           //指定显示位置u8g2.print("ESP32 Sensor Kit");  //使用print来显示字符串u8g2.setCursor(0, 35);           //指定显示位置u8g2.print("Booting...");        //使用print来显示字符串} while (u8g2.nextPage());/** SD卡*//*if (!SD.begin()) {  //检测SD卡挂载状态u8g2.clearBuffer();u8g2.firstPage();do {u8g2.setCursor(0, 14);           //指定显示位置u8g2.print("ESP32 Sensor Kit");  //使用print来显示字符串u8g2.setCursor(0, 35);           //指定显示位置u8g2.print("Card Mount");        //使用print来显示字符串u8g2.setCursor(0, 55);           //指定显示位置u8g2.print("Failed !!!");        //使用print来显示字符串} while (u8g2.nextPage());Serial.println("Card Mount Failed !");return;}uint8_t cardType = SD.cardType();if (cardType == CARD_NONE) {Serial.println("No SD card attached");return;}Serial.print("SD Card Type: ");if (cardType == CARD_MMC) {Serial.println("MMC");} else if (cardType == CARD_SD) {Serial.println("SDSC");} else if (cardType == CARD_SDHC) {Serial.println("SDHC");} else {Serial.println("UNKNOWN");}Serial.printf("Total space: %lluMB\n", SD.totalBytes() / (1024 * 1024));Serial.printf("Used space: %lluMB\n", SD.usedBytes() / (1024 * 1024));listDir(SD, "/", 0);*//** ADC->PulseSensor*/pulseSensor.analogInput(PULSE_INPUT);pulseSensor.setSerial(Serial);pulseSensor.setOutputType(OUTPUT_TYPE);pulseSensor.setThreshold(THRESHOLD);samplesUntilReport = SAMPLES_PER_SERIAL_SAMPLE;if (!pulseSensor.begin()) {u8g2.clearBuffer();u8g2.firstPage();do {u8g2.setCursor(0, 14);           //指定显示位置u8g2.print("ESP32 Sensor Kit");  //使用print来显示字符串u8g2.setCursor(0, 35);           //指定显示位置u8g2.print("PulseSensor Init");  //使用print来显示字符串u8g2.setCursor(0, 55);           //指定显示位置u8g2.print("Failed !!!");        //使用print来显示字符串} while (u8g2.nextPage());Serial.println("PulseSensor Init Failed !");return;}timer = timerBegin(0, 80, true);              // 初始化定时器指针timerAttachInterrupt(timer, &onTimer, true);  // 绑定定时器timerAlarmWrite(timer, 2000, true);           // 配置报警计数器保护值(就是设置时间)单位ustimerAlarmEnable(timer);                      // 启用定时器//使能按键1中断监测
//  attachInterrupt(0, INTfunction, FALLING);//硬件初始化成功 标志置一initFlag = 1;
}void loop() {dataHR = data;data = 0;if (initFlag == 0) {  //初始化失败则退出程序Serial.print("hardware init failed !\r\n");delay(3000);ESP.restart();}
#ifdef USART_DEBUGSerial.print("HR: ");Serial.println(dataHR);
#endifchar temp[10];memset(adcData.HR, 0, sizeof(char) * 10);adcData.HR[0] = 'H';adcData.HR[1] = 'R';adcData.HR[2] = ':';itoa(dataHR, temp, 10);for (int i = 0; i < strlen(temp); i++) {adcData.HR[3 + i] = temp[i];}/** OLED*/u8g2.clearBuffer();u8g2.firstPage();do {if (adcData.HR[3] == '0') {point[count] = '.';u8g2.setCursor(0, 14);           //指定显示位置u8g2.print("ESP32 Sensor Kit");  //使用print来显示字符串u8g2.setCursor(0, 35);           //指定显示位置u8g2.print("Please keep");       //使用print来显示字符串if (intFlag == 1) {u8g2.setCursor(100, 40);  //指定显示位置u8g2.print("REC");        //使用print来显示字符串}u8g2.setCursor(0, 55);       //指定显示位置u8g2.print("touch stable");  //使用print来显示字符串u8g2.setCursor(101, 55);     //指定显示位置u8g2.print(point);           //使用print来显示字符串if (count == 2) {memset(point, 0, sizeof(char) * 10);count = 0;} elsecount++;} else {count = 0;memset(point, 0, sizeof(char) * 10);u8g2.setCursor(0, 14);           //指定显示位置u8g2.print("ESP32 Sensor Kit");  //使用print来显示字符串u8g2.setCursor(0, 35);           //指定显示位置u8g2.print(adcData.HR);          //使用print来显示字符串if (intFlag == 1) {u8g2.setCursor(100, 40);  //指定显示位置u8g2.print("REC");        //使用print来显示字符串}u8g2.setCursor(0, 55);     //指定显示位置u8g2.print(adcData.SPO2);  //使用print来显示字符串}} while (u8g2.nextPage());/** SD Card*//*if (intFlag == 1) {if (adcData.HR[3] != '0') {appendFile(SD, "/PulseSensor.txt", &(rtc.getTime("%B %d %Y %H:%M:%S"))[0]);appendFile(SD, "/PulseSensor.txt", "\t\t");appendFile(SD, "/PulseSensor.txt", adcData.HR);appendFile(SD, "/PulseSensor.txt", "\r\n");}}*/adcData.HR[3] == '0';dataHR = 0;delay(800);
}/** ADC->PulseSensor*/
void onTimer()  //PulseSensor采集数据
{if (pulseSensor.sawNewSample()) {if (--samplesUntilReport == (byte)0) {samplesUntilReport = SAMPLES_PER_SERIAL_SAMPLE;pulseSensor.outputSample();if (pulseSensor.sawStartOfBeat()) {// pulseSensor.outputBeat();data = pulseSensor.getBeatsPerMinute();}}}
}/** * SD Card->Function* *//*
void listDir(fs::FS &fs, const char *dirname, uint8_t levels) {Serial.printf("Listing directory: %s\n", dirname);File root = fs.open(dirname);if (!root) {Serial.println("Failed to open directory");return;}if (!root.isDirectory()) {Serial.println("Not a directory");return;}File file = root.openNextFile();while (file) {if (file.isDirectory()) {Serial.print("  DIR : ");Serial.println(file.name());if (levels) {listDir(fs, file.name(), levels - 1);}} else {Serial.print("  FILE: ");Serial.print(file.name());Serial.print("  SIZE: ");Serial.println(file.size());}file = root.openNextFile();}
}*/
void appendFile(fs::FS &fs, const char *path, const char *message) {
#ifdef USART_DEBUGSerial.printf("Appending to file: %s\n", path);
#endifFile file = fs.open(path, FILE_APPEND);if (!file) {Serial.println("Failed to open file for appending");return;}if (file.print(message)) {
#ifdef USART_DEBUGSerial.println("Message appended");
#endif} else {Serial.println("Append failed");}file.close();
}

这篇关于Arduino-ESP32-WROOM-32E—PulseSensor传感器测心率的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/262916

相关文章

arduino ide安装详细步骤

​ 大家好,我是程序员小羊! 前言: Arduino IDE 是一个专为编程 Arduino 微控制器设计的集成开发环境,使用起来非常方便。下面将介绍如何在不同平台上安装 Arduino IDE 的详细步骤,包括 Windows、Mac 和 Linux 系统。 一、在 Windows 上安装 Arduino IDE 1. 下载 Arduino IDE 打开 Arduino 官网

WIN11 ESP32 IDF + VSCODE 环境搭建[教程向]

前言 目录 前言 安装ESP32-IDF VSCODE插件安装 编译测试 很多时候我们想学习一门新的技能,需要使用全新的开发环境,很多时候我们会在安装环境这个环节卡住很久,这里简单介绍一下ESP32+VSCODE环境搭建。 安装ESP32-IDF https://dl.espressif.cn/dl/esp-idf/?idf=4.4 直接复制上面链接,进入idf下载界面。

人体红外传感器简介

人体红外传感器的工作原理是利用热释电效应,将人体发出的特定波长的红外线转化为电信号,从而实现对人体的检测和感知。               具体来说,人体红外传感器主要由滤光片、热释电探测元和前置放大器组成。滤光片的作用是使特定波长的红外辐射选择性地通过,到达热释电探测元,而在其截止范围外的红外辐射则不能通过。热释电探测元是传感器的核心元件,当它受到非恒定强度的红外光照射时,会产生

Class4——Esp32|Thonny两种方式同过电脑控制LED灯,路由器与电脑自带热点连接ESP32

上一节我们通过路由器和设备创建了连接,不懂可按上节配置 Class3——Esp32|Thonny——网络连接主机-wifi连接(源代码带教程)-CSDN博客文章浏览阅读57次。Esp32|Thonny网络连接主机-wifi连接(源代码带教程)https://blog.csdn.net/m0_66701835/article/details/141960572?spm=1001.2014.3001

物联网之ESP32控制舵机、通过网页设置舵机角度、Web服务、舵机原理、接线、Arduino、WiFi、Http

MENU 前言原理硬件电路设计软件程序设计LEDC输出PWM信号使用第三方库控制舵机网页控制舵机 前言 舵机在电子产品中非常常见,比如四足机器人、固定翼航模等都有应用,因此学习舵机对电子制作非常有意义。本文章使用Arguino的PWM对SG90舵机旋转角度控制。 原理 舵机是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。舵机只

Arduino IDE安装

Arduino IDE(集成开发环境)的安装过程是一个相对直观且易于操作的流程,主要步骤包括下载、安装和配置。以下将详细阐述Arduino IDE的安装过程,同时提供一些背景信息和注意事项,确保安装过程顺利进行。 一、Arduino IDE下载 1. 访问Arduino官网 首先,用户需要访问Arduino的官方网站(https://www.arduino.cc),这是获取Arduino I

ubuntu14下Arduino IDE无法打开串口的问题

ubuntu版本是14.04 LTS,arduino版本是1.8.1。使用arduino的串口工具时无法打开串口,串口是USB转的,用的cp2102 。 google了一下,发现可能是权限的问题,执行以下语句,即可解决: sudo chown username /dev/ttyUSB0将username改成自己的用户名就行了。

胎压监测方案传感器技术分析

DSH700B 是一款常用于胎压监测方案的传感器,它具有以下一些特点和优势:一、高精度测量 DSH700B 传感器能够实现高精度的胎压和温度测量。它采用先进的传感技术,能够准确地感知轮胎内部的压力变化和温度变化,并将这些数据以准确的数值形式输出。这对于确保胎压监测的准确性至关重要,能够及时发现轮胎气压异常,避免因胎压过高或过低而导致的安全隐患。二、稳定性和可靠性 该传感器在设计上注重稳定性和可靠性

乐鑫 ESP32-P4 无线连接解决方案

ESP32-P4 是乐鑫信息科技推出的一款功能强大的芯片 (SoC) ,专为高性能的应用打造。尽管 ESP32-P4 集成了一系列先进特性,但它并未设置无线连接功能,因此需要额外的连接方案来满足嵌入式系统的多样化需求。乐鑫为 ESP32-P4 提供了三种主要的连接方案:ESP-AT、ESP-Hosted 和 ESP-Extconn。下面我们来探讨每种解决方案的优势、限制和使用场景。 ESP-AT

ESP32!Thonny+MicroPython+ESP32开发环境搭建!!

准备工具: Thonny+MicroPython+ESP32 一.Thonny安装 下载地址:Thonny, Python IDE for beginnershttps://thonny.org/ 二.下载esp32环境——根据型号下载 下载地址:MicroPython - Python for microcontrollershttps://micropython.org/downlo