You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:Arduino Mega2560+ESP8266-01请求PHP网站URL的实现

解决Arduino Mega + ESP8266-01 访问PHP网站URL的问题

嘿,我仔细看了你的代码和需求,发现几个关键问题导致你没法成功访问目标URL——主要是HTTP请求格式不规范,还有AT指令的执行顺序和反馈处理不够严谨。你需要的是一个简单的GET请求来访问index.php?out,下面是修正后的完整代码,我会逐一解释改动的地方:

修正后的完整代码

int ledPin = 13;

void setup() {
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
  Serial1.begin(115200); // 注意:ESP8266-01默认波特率是115200,要是你的模块改了波特率记得同步调整
  // 确保WiFi连接成功后再往下走,避免后续操作失败
  while (!connectWiFi()) {
    Serial.println("重试WiFi连接...");
    delay(2000);
  }
}

void loop() {
  // 闪烁LED提示程序运行
  digitalWrite(ledPin, HIGH);
  delay(500);
  digitalWrite(ledPin, LOW);
  delay(500);

  // 先关闭可能残留的旧连接,避免冲突
  Serial1.println("AT+CIPCLOSE\r\n");
  delay(1000);

  // 设置单连接模式(MUX=0),这个是基础配置
  Serial1.println("AT+CIPMUX=0\r\n");
  delay(1000);
  if (Serial1.find("ERROR")) {
    Serial.println("设置CIPMUX失败");
    return;
  }

  // 建立TCP连接到你的网站
  String cmd = "AT+CIPSTART=\"TCP\",\"mywebsite.000webhostapp.com\",80\r\n";
  Serial.println(cmd);
  Serial1.println(cmd);
  delay(2000);
  if (Serial1.find("ERROR")) {
    Serial.println("TCP连接失败");
    return;
  }
  Serial.println("TCP连接成功");

  // 构造符合HTTP规范的GET请求(这就是你要的访问index.php?out的请求)
  String getRequest = "GET /index.php?out HTTP/1.1\r\n";
  getRequest += "Host: mywebsite.000webhostapp.com\r\n";
  getRequest += "Connection: close\r\n"; // 告诉服务器处理完请求就关闭连接
  getRequest += "\r\n"; // 必须加这个空行,HTTP协议要求请求头结束后是空行

  // 发送数据长度指令,告诉ESP8266要发多少内容
  cmd = "AT+CIPSEND=" + String(getRequest.length()) + "\r\n";
  Serial.println(cmd);
  Serial1.println(cmd);
  delay(1000);

  // 等待ESP8266输出">"提示符,然后发送请求内容
  if (Serial1.find(">")) {
    Serial.println("发送GET请求...");
    Serial1.print(getRequest);
    // 等待服务器响应并打印到串口,方便你调试看结果
    delay(2000);
    while (Serial1.available()) {
      Serial.write(Serial1.read());
    }
    Serial.println("\n请求完成");
  } else {
    Serial.println("发送请求失败,关闭连接");
    Serial1.println("AT+CIPCLOSE\r\n");
  }

  delay(5000); // 这里可以根据你的需求调整请求间隔
}

boolean connectWiFi() {
  Serial1.println("AT+CWMODE=1\r\n"); // 设置ESP8266为STA模式(连接WiFi)
  delay(1000);
  Serial1.println("AT+RST\r\n"); // 重置ESP8266,确保模块状态干净
  delay(2000);

  // 构造连接WiFi的AT指令
  String cmd = "AT+CWJAP=\"Silver-WiFi\",\"MyWifi123\"\r\n";
  Serial.println(cmd);
  Serial1.println(cmd);
  delay(5000); // 给足够时间让ESP8266连接WiFi,别改太短

  // 检查是否真的连接上了指定WiFi
  Serial1.println("AT+CWJAP?\r\n");
  delay(1000);
  if (Serial1.find("Silver-WiFi")) { // 直接检查SSID,比模糊匹配更准确
    Serial.println("已成功连接WiFi");
    return true;
  } else {
    Serial.println("WiFi连接失败");
    return false;
  }
}

关键改动说明

  1. HTTP请求类型修正:你原来用了POST,但你要的只是访问index.php?out这种带参数的URL,用GET请求才是正确的选择,完全符合你的需求。
  2. HTTP请求头规范:补全了必要的请求头,比如Host(必须指定,服务器需要知道你访问哪个域名),还有Connection: close避免残留连接;最后加了空行,这是HTTP协议的硬性要求,少了这个服务器可能不会处理你的请求。
  3. AT指令逻辑优化:每次循环先关闭旧连接,再重新建立,避免连接冲突;增加了ESP8266重置步骤,确保模块状态稳定,很多时候连接失败都是因为模块状态异常。
  4. 反馈处理更严谨:WiFi连接时直接检查是否连接到你的SSID,而不是模糊匹配+CWJAP,这样判断更准确;发送请求后还会打印服务器的响应,方便你调试看请求是否成功。
  5. 延迟调整:把一些不必要的长延迟缩短了,同时给关键步骤(比如WiFi连接、TCP连接)留了足够的响应时间,平衡了稳定性和效率。

调试小技巧

  • 打开Arduino串口监视器(波特率设成9600),看每一步的输出,哪一步报错就重点查哪一步。
  • 要是ESP8266没响应,先查硬件连接:
    • Arduino Mega的TX1(18脚)接ESP8266的RX
    • Arduino Mega的RX1(19脚)接ESP8266的TX
    • 一定要给ESP8266单独供3.3V电!Arduino的3.3V电流不够,模块会工作异常,GND要和Arduino共地。
  • 可以先用串口助手单独测试ESP8266的AT指令,确保模块本身是好的,比如发AT看是否返回OK。

内容的提问来源于stack exchange,提问作者Chamal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:15:01