烧写口:ESP32的GND,RX,TX,5V分别接外部TTL串口模块的GND,TX,RX,5V,下载时IO0需和GND连接,下载完成后再断开IO0和GND间的连接;
我跳线帽是这么接的,应该没错把?
但是上传不了
手机
发完帖后发现端口也选错了,USB转ttl的驱动没装,装完后显示第三个端口了,再试上传显示这个错误,这个错误看来就是线接错了
手机
@胡图图,@罐子,线的位置换了后出现这个错误,是不是线的质量不好啊?
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
手机
ESP32-WROOM-32E下载模式要求GPIO0在EN上升沿时为保持低电平,一般的板子会设计有自动下载电路,但是也不排除没有,可以检查一下, 我看你的图中没有下拉GPIO0。
红米K30 Pro(变焦版)
// WiFi 参数
const char ssid = "64412";
const char password = "32323433";
WiFiServer server(80); // 在端口80上创建一个web服务器
MAX30105 particleSensor;
//Arduino Uno不具备足够的SRAM来存储32位格式的50个红外LED数据和红色LED数据。
//为了解决这个问题,采样数据的16位MSB将被截断。样品变成16位数据。
uint16_t irBuffer[50]; //红外LED传感器数据
uint16_t redBuffer[50]; //红色LED传感器数据
uint32_t irBuffer[50]; //红外LED传感器数据
uint32_t redBuffer[50]; //红色LED传感器数据
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服务器,传感器的采样和计算代码在一个无限循环中会崩溃,帮我修改一下
手机
手机