include <Wire.h>
include "MAX30105.h"
include "spo2_algorithm.h"
include <WiFi.h> // 引入WiFi 库
// WiFi 参数
const char ssid = "64412";
const char password = "32323433";WiFiServer server(80); // 在端口80上创建一个web服务器
MAX30105 particleSensor;
define MAX_BRIGHTNESS 255
if defined(AVR_ATmega328P) || defined(AVR_ATmega168)
//Arduino Uno不具备足够的SRAM来存储32位格式的50个红外LED数据和红色LED数据。
//为了解决这个问题,采样数据的16位MSB将被截断。样品变成16位数据。
uint16_t irBuffer[50]; //红外LED传感器数据
uint16_t redBuffer[50]; //红色LED传感器数据else
uint32_t irBuffer[50]; //红外LED传感器数据
uint32_t redBuffer[50]; //红色LED传感器数据endif
int32_t spo2; //SPO2值
int8_t validSPO2; //指示SPO2计算是否有效
int32_t heartRate; //心率值
int8_t validHeartRate; //指示心率计算是否有效bool sensorEnabled = false; //标志位,表示传感器是否启用
void setup()
{
Serial.begin(115200); // 以115200比特/秒初始化串行通信:// 初始化WIFI连接
Serial.println();
Serial.println();
Serial.print("连接到 ");
Serial.println(ssid);
WiFi.begin(ssid, password);while (WiFi.status() != WL_CONNECTED) {
delay(1000);
Serial.print(".");
}Serial.println("");
Serial.println("WiFi 连接成功");
Serial.println(WiFi.localIP());// 初始化Web服务器
server.begin();
Serial.println("Web服务器已启动");// 初始化传感器
Wire.begin(4, 5); // SDA = GPIO 4, SCL = GPIO 5
if (!particleSensor.begin(Wire, I2C_SPEED_FAST)) //使用默认的I2C端口,400kHz的速度
{
Serial.println(F("未找到MAX30105。 请检查布线/电源。"));
while (1);
}particleSensor.setup(55, 4, 2, 200, 411, 4096); //使用这些设置配置传感器
// 初始化结束后关闭传感器模块
particleSensor.shutDown();
sensorEnabled = false;
}long lastActiveTime = 0;
void loop()
{
// 等待Web客户端连接
WiFiClient client = server.available();
if (client) {
Serial.println("New Client.");
String currentLine = "";
while (client.connected()) {
if (client.available()) {
char c = client.read();
Serial.write(c);
if (c == '\n') {
if (currentLine.length() == 0) {
// 发送HTTP头部
client.println("HTTP/1.1 200 OK");
client.println("Content-type:text/html");
client.println();// 发送HTML内容 client.println("<html>"); client.println("<head><title>MAX30102 控制</title></head>"); client.println("<body>"); client.println("<h1>MAX30102 控制</h1>"); client.println("<p>当前状态: " + String(sensorEnabled ? "已打开" : "已关闭") + "</p>"); client.println("<form method=\"POST\">"); if (sensorEnabled) { client.println("<input type=\"submit\" name=\"action\" value=\"关闭传感器\"/>"); } else { client.println("<input type=\"submit\" name=\"action\" value=\"打开传感器\"/>"); } client.println("</form>"); client.println("</body>"); client.println("</html>"); // 处理命令 if (currentLine.indexOf("GET /?action=打开传感器") != -1) { if (!sensorEnabled) { // 打开传感器模块 particleSensor.wakeUp(); delay(500); // 给传感器启动一些时间 sensorEnabled = true; } } else if (currentLine.indexOf("GET /?action=关闭传感器") != -1) { if (sensorEnabled) { // 关闭传感器模块 particleSensor.shutDown(); sensorEnabled = false; } } break; } else { currentLine = ""; } } else if (c != '\r') { currentLine += c; } } } // 断开连接 client.stop(); Serial.println("Client Disconnected.");
}
// 检查传感器是否需要关闭
if (sensorEnabled && (millis() - lastActiveTime > 60000)) {
particleSensor.shutDown();
sensorEnabled = false;
}//读取前50个样本,并确定信号范围
for (byte i = 0 ; i < 50 ; i++)
{
while (particleSensor.available() == false) //是否有新数据?
particleSensor.check(); //检查传感器是否有新数据redBuffer<span style="font-style:italic"> = particleSensor.getRed(); irBuffer<span style="font-style:italic"> = particleSensor.getIR(); particleSensor.nextSample(); //处理完当前样本后,转到下一个样本 Serial.print(F("红光=")); Serial.print(redBuffer<span style="font-style:italic">, DEC); Serial.print(F(", 红外=")); Serial.println(irBuffer<span style="font-style:italic">, DEC);
}
//在前50个样本之后计算心率和SpO2(前4秒的样本)
maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate);//无线循环地从MAX30102中采样。每1秒计算一次心率和SpO2
while (1)
{
//将内存中的前25个样本丢弃,并将最后25个样本移动到顶部
for (byte i = 25; i < 50; i++)
{
redBuffer[i - 25] = redBuffer;
irBuffer[i - 25] = irBuffer;
}//在计算心率之前,采取25个样本集。 for (byte i = 25; i < 50; i++) { while (particleSensor.available() == false) //是否有新数据? particleSensor.check(); //检查传感器是否有新数据 redBuffer<span style="font-style:italic"> = particleSensor.getRed(); irBuffer<span style="font-style:italic"> = particleSensor.getIR(); particleSensor.nextSample(); //处理完当前样本后,转到下一个样本 Serial.print(F("红光=")); Serial.print(redBuffer<span style="font-style:italic">, DEC); Serial.print(F(", 红外=")); Serial.print(irBuffer<span style="font-style:italic">, DEC); Serial.print(F(", 心率=")); Serial.print(heartRate, DEC); Serial.print(F(", HRvalid=")); Serial.print(validHeartRate, DEC); Serial.print(F(", 血氧饱和度=")); Serial.print(spo2, DEC); Serial.print(F(", SPO2Valid=")); Serial.println(validSPO2, DEC); } //收集25个新样本后,重新计算HR和SP02 maxim_heart_rate_and_oxygen_saturation(irBuffer, 50, redBuffer, &spo2, &validSPO2, &heartRate, &validHeartRate); printToSerial();
}
}void printToSerial() {
if(validSPO2 && validHeartRate) {
Serial.print(F("心率: ")); Serial.println(heartRate, DEC);
Serial.print(F("血氧饱和度: ")); Serial.println(spo2, DEC);
} else {
Serial.println(F("无效"));
}
}// 如果需要关闭传感器模块,则可以使用以下函数
void shutDownSensorModule() {
if (sensorEnabled) {
particleSensor.shutDown();
sensorEnabled = false;
}
}
这段代码中Web服务器,传感器的采样和计算代码在一个无限循环中会崩溃,帮我修改一下
手机
@老虎会游泳,原来如此
手机
@老虎会游泳,是我网页插件的问题吗
手机
谢谢老虎,这玩意可比百度好用多了
手机
@胡图图,@罐子,线的位置换了后出现这个错误,是不是线的质量不好啊?
esptool.py v3.0-dev
Serial port COM3
Connecting......................................_____A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header
A fatal error occurred: Failed to connect to ESP32: Timed out waiting for packet header手机
发完帖后发现端口也选错了,USB转ttl的驱动没装,装完后显示第三个端口了,再试上传显示这个错误,这个错误看来就是线接错了
手机
手机
是里面放卡那种吗
手机
@老虎会游泳,以前看过这种事,最后也没消息了,个人维权感觉很麻烦
手机
这种行为违法不
手机
用APP封装的容易闪退
手机
手机
等在用不了时候试试
手机
又正常了…不知道哪里的问题
手机
源码案例(有病毒不要打开).zip(6.8 MB)@晨曦,在这个压缩包里
手机
有没有用过这个的wellcms
手机
@老虎会游泳,只要 不是病毒就行,我还以为电脑里有隐藏病毒了呢
手机
@无名啊,我替换文件时发现的
手机