// apRemote.ino - ESP32 as its own access point.
#include <WiFi.h>
// The network the BOARD creates. Anyone who joins it can control the LED,
// so pick a real password - 8 characters minimum, or the AP silently
// starts open.
const char* apSsid = "EmbedClub-Node";
const char* apPassword = "changeThis123";
const int LED_PIN = 2; // on-board LED on most ESP32 dev boards
WiFiServer server(80);
void setup() {
Serial.begin(115200);
pinMode(LED_PIN, OUTPUT);
digitalWrite(LED_PIN, LOW);
WiFi.softAP(apSsid, apPassword);
Serial.print("AP up, connect to it and open http://");
Serial.println(WiFi.softAPIP()); // 192.168.4.1 by default
server.begin();
}
void loop() {
WiFiClient client = server.available();
if (!client) return;
// Read only the request line - that is all we need, and reading the whole
// request without a timeout is how these sketches hang.
String request = client.readStringUntil('\r');
client.readStringUntil('\n');
if (request.indexOf("/LEDON") != -1) digitalWrite(LED_PIN, HIGH);
if (request.indexOf("/LEDOFF") != -1) digitalWrite(LED_PIN, LOW);
bool on = digitalRead(LED_PIN) == HIGH;
client.println("HTTP/1.1 200 OK");
client.println("Content-Type: text/html");
client.println("Connection: close");
client.println();
client.println("<!DOCTYPE html><html><head>");
client.println("<meta name='viewport' content='width=device-width,initial-scale=1'>");
client.println("<title>Node</title></head><body style='font-family:sans-serif;text-align:center;padding-top:3rem'>");
client.print("<h1>LED is ");
client.print(on ? "ON" : "OFF");
client.println("</h1>");
client.println("<p><a href='/LEDON'>Turn on</a> <a href='/LEDOFF'>Turn off</a></p>");
client.println("</body></html>");
client.stop();
}