eps8266作为AP服务端
上传代码后,ESP8266会创建热点
用手机/电脑连接ESP8266_AP热点
浏览器访问192.168.4.1/LED=ON/OFF控制LED
ESP8266通过串口转发指令到ESP32C3
#include <ESP8266WiFi.h>
const char* ssid = "ESP8266_AP";
const char* password = "12345678";
WiFiServer webServer(80);
WiFiServer cmdServer(8080); // 指令服务端口
WiFiClient cmdClients[5]; // 最大5个客户端
bool ledState = false;
void setup() {
Serial.begin(115200);
WiFi.softAP(ssid, password);
webServer.begin();
cmdServer.begin();
Serial.println("AP IP: " + WiFi.softAPIP().toString());
}
String sendHTML(){
String ptr = "<!DOCTYPE html><html><head>";
ptr += "<meta name='viewport' content='width=device-width, initial-scale=1.0'>";
ptr += "<style>button{font-size:20px; padding:10px 20px;}</style></head>";
ptr += "<body><h1>ESP8266 LED Control</h1>";
ptr += "<p>LED Status: <strong>";
ptr += (ledState)?"ON":"OFF";
ptr += "</strong></p>";
ptr += "<a href='/LED=ON'><button>Turn ON</button></a>";
ptr += "<a href='/LED=OFF'><button>Turn OFF</button></a>";
ptr += "</body></html>";
return ptr;
}
void broadcastCommand(const String& cmd){
for(int i=0; i<5; i++){
if(cmdClients[i] && cmdClients[i].connected()){
cmdClients[i].println(cmd);
Serial.println("Sent: " + cmd);
}
}
}
void loop() {
// 处理网页请求
WiFiClient webClient = webServer.available();
if(webClient){
String request = webClient.readStringUntil('\r');
if(request.indexOf("LED=ON") != -1){
ledState = true;
broadcastCommand("LED_ON");
}else if(request.indexOf("LED=OFF") != -1){
ledState = false;
broadcastCommand("LED_OFF");
}
webClient.println("HTTP/1.1 200 OK");
webClient.println("Content-Type: text/html");
webClient.println();
webClient.println(sendHTML());
delay(10);
webClient.stop();
}
// 处理指令客户端连接
WiFiClient newClient = cmdServer.available();
if(newClient){
for(int i=0; i<5; i++){
if(!cmdClients[i]){
cmdClients[i] = newClient;
Serial.println("New client connected");
break;
}
}
}
}
esp32c3作为STA客户端
#include <WiFi.h>
const char* ssid = "ESP8266_AP";
const char* password = "12345678";
WiFiClient cmdClient;
const int ledPin = 12; // GPIO2
IPAddress serverIP(192,168,4,1); // AP默认IP
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
digitalWrite(ledPin, HIGH);
WiFi.begin(ssid, password);
while(WiFi.status() != WL_CONNECTED){
delay(500);
Serial.print(".");
}
Serial.println("\nConnected to AP");
while(!cmdClient.connect(serverIP, 8080)){
delay(1000);
Serial.println("Connecting to command server...");
}
Serial.println("Command channel ready");
}
void loop() {
if(!cmdClient.connected()){
cmdClient.connect(serverIP, 8080);
delay(1000);
return;
}
if(cmdClient.available()){
String cmd = cmdClient.readStringUntil('\n');
cmd.trim();
Serial.println("Received: " + cmd);
if(cmd == "LED_ON"){
digitalWrite(ledPin, HIGH);
}else if(cmd == "LED_OFF"){
digitalWrite(ledPin, LOW);
}
}
delay(10);
}