找到72个回复 (用户: 童真再见)
  • 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("&lt;html>");
            client.println("&lt;head>&lt;title>MAX30102 控制&lt;/title>&lt;/head>");
            client.println("&lt;body>");
            client.println("&lt;h1>MAX30102 控制&lt;/h1>");
            client.println("&lt;p>当前状态: " + String(sensorEnabled ? "已打开" : "已关闭") + "&lt;/p>");
            client.println("&lt;form method=\"POST\">");
            if (sensorEnabled) {
              client.println("&lt;input type=\"submit\" name=\"action\" value=\"关闭传感器\"/>");
            } else {
              client.println("&lt;input type=\"submit\" name=\"action\" value=\"打开传感器\"/>");
            }
            client.println("&lt;/form>");
            client.println("&lt;/body>");
            client.println("&lt;/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 &lt; 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服务器,传感器的采样和计算代码在一个无限循环中会崩溃,帮我修改一下
    手机

  • [网页插件] hu60bot: 立即与openai 对话
    207950点击 / 2023-03-19发布 / 2023-03-30回复 / /

    @老虎会游泳,原来如此
    手机

  • [网页插件] hu60bot: 立即与openai 对话
    207950点击 / 2023-03-19发布 / 2023-03-30回复 / /

    @老虎会游泳,是我网页插件的问题吗
    手机

  • 谢谢老虎,这玩意可比百度好用多了

    手机
  • @罐子@Curtion,找到原因了是排针和板子接触不良
    手机

  • @胡图图@罐子,线的位置换了后出现这个错误,是不是线的质量不好啊?

    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

    微信截图_20230304230539.png(61.65 KB)

    手机

  • 发完帖后发现端口也选错了,USB转ttl的驱动没装,装完后显示第三个端口了,再试上传显示这个错误,这个错误看来就是线接错了

    微信图片_20230304210211.png(35.62 KB)
    手机

  • @胡图图@罐子没仔细看原来是接错了...我刚才把软件卸载了,现在重下呢,疏忽了
    手机

  • 微信图片_20230304155514.jpg(4.02 MB)
    手机

  • 是里面放卡那种吗
    手机

  • @老虎会游泳,以前看过这种事,最后也没消息了,个人维权感觉很麻烦
    手机

  • 这种行为违法不
    手机

  • 有什么方式可以将web页面封装成apk
    129272点击 / 2023-01-24发布 / 2023-01-25回复 / /

    用APP封装的容易闪退
    手机

  • 视频链接

    手机

  • 等在用不了时候试试
    手机

  • 又正常了…不知道哪里的问题
    手机

  • virus.js.qexvmc.2这个是什么病毒
    6037点击 / 2022-11-23发布 / 2022-11-24回复 / /
  • 求推荐blog程序
    15096点击 / 2022-10-24发布 / 2022-10-27回复 / /

    有没有用过这个的wellcms
    手机

  • @老虎会游泳,只要 不是病毒就行,我还以为电脑里有隐藏病毒了呢
    手机

  • @无名啊,我替换文件时发现的
    手机