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

