Базовый скетч для управляемых устройств

Базовый скетч для управляемых устройств


При первом запуске или если не удается подключиться к сохраненной сети, ESP создает точку доступа "ESP8266-Setup". Необходимо подключиться к ней, открыть в браузере адрес 192.168.4.1 и настроить данные для подключения к домашней WI-FI сети. Далее ESP каждые 5 секунд отправляет GET-запрос на 192.168.1.207/test.php. Если сервер возвращает "1" - встроенный в ESP светодиод включается, если "0" - выключается. Данные Wi-Fi сохраняются в EEPROM и остаются после перезагрузки микроконтроллера.

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
#include <EEPROM.h>

// Конфигурация пинов
const int LED_PIN = LED_BUILTIN;  // Встроенный LED на GPIO2 (D4)

// Настройки сети
const char* AP_SSID = "ESP8266-Setup";
const unsigned long CHECK_INTERVAL = 5000;  // 5 секунд между запросами
const char* SERVER_URL = "http://192.168.1.207/test.php";

// Глобальные переменные
ESP8266WebServer server(80);
String wifi_ssid = "";
String wifi_password = "";
unsigned long last_check_time = 0;

// HTML страница для настройки
const char* config_page = R"rawliteral(
<!DOCTYPE html>
<html>
<head>
  <title>Wi-Fi Setup</title>
  <meta charset="UTF-8">
  <style>
    body { font-family: Arial; margin: 20px; }
    form { max-width: 300px; }
    input { margin-bottom: 10px; width: 100%; }
  </style>
</head>
<body>
  <h1>Wi-Fi Configuration</h1>
  <form action="/save" method="POST">
    <label>SSID:</label><br>
    <input type="text" name="ssid" value="%SSID%"><br>
    <label>Password:</label><br>
    <input type="password" name="password" value="%PASSWORD%"><br>
    <input type="submit" value="Save">
  </form>
</body>
</html>
)rawliteral";

void setup() {
  Serial.begin(115200);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);  // Выключить LED
  
  EEPROM.begin(512);
  loadCredentials();
  
  WiFi.mode(WIFI_STA);
  connectToWiFi();
  
  setupWebServer();
}

void loop() {
  server.handleClient();
  
  if (WiFi.status() == WL_CONNECTED && millis() - last_check_time >= CHECK_INTERVAL) {
    last_check_time = millis();
    checkServer();
  }
}

// ========== Функции работы с Wi-Fi ==========
void connectToWiFi() {
  if (wifi_ssid.length() == 0) {
    startAPMode();
    return;
  }

  Serial.printf("Connecting to %sn", wifi_ssid.c_str());
  WiFi.begin(wifi_ssid.c_str(), wifi_password.c_str());

  int attempts = 0;
  while (WiFi.status() != WL_CONNECTED && attempts < 20) {
    delay(500);
    Serial.print(".");
    attempts++;
  }

  if (WiFi.status() == WL_CONNECTED) {
    Serial.printf("nConnected! IP: %sn", WiFi.localIP().toString().c_str());
  } else {
    Serial.println("nFailed to connect. Starting AP mode...");
    startAPMode();
  }
}

void startAPMode() {
  WiFi.mode(WIFI_AP);
  WiFi.softAP(AP_SSID);
  Serial.printf("AP Mode. SSID: %s, IP: %sn", AP_SSID, WiFi.softAPIP().toString().c_str());
}

// ========== Веб-сервер ==========
void setupWebServer() {
  server.on("/", handleRoot);
  server.on("/save", handleSave);
  server.begin();
  Serial.println("HTTP server started");
}

void handleRoot() {
  String page = config_page;
  page.replace("%SSID%", wifi_ssid);
  page.replace("%PASSWORD%", wifi_password);
  server.send(200, "text/html", page);
}

void handleSave() {
  if (server.hasArg("ssid") && server.hasArg("password")) {
    wifi_ssid = server.arg("ssid");
    wifi_password = server.arg("password");
    
    saveCredentials();
    
    server.send(200, "text/html", 
      "<h1>Settings saved!</h1><p>Device will restart...</p>");
    delay(1000);
    ESP.restart();
  }
}

// ========== EEPROM ==========
void loadCredentials() {
  wifi_ssid = readEEPROM(0);
  wifi_password = readEEPROM(64);
  Serial.printf("Loaded credentials: SSID='%s', Pass='%s'n", 
               wifi_ssid.c_str(), wifi_password.c_str());
}

void saveCredentials() {
  writeEEPROM(0, wifi_ssid);
  writeEEPROM(64, wifi_password);
  EEPROM.commit();
  Serial.printf("Saved credentials: SSID='%s', Pass='%s'n", 
               wifi_ssid.c_str(), wifi_password.c_str());
}

String readEEPROM(int offset) {
  String value;
  for (int i = offset; i < offset + 64; ++i) {
    char c = EEPROM.read(i);
    if (c == 0) break;
    value += c;
  }
  return value;
}

void writeEEPROM(int offset, String value) {
  for (int i = 0; i < value.length(); ++i) {
    EEPROM.write(offset + i, value[i]);
  }
  EEPROM.write(offset + value.length(), 0);
}

// ========== Работа с сервером ==========
void checkServer() {
  WiFiClient client;
  HTTPClient http;
  
  Serial.printf("Requesting URL: %sn", SERVER_URL);
  
  if (http.begin(client, SERVER_URL)) {
    int httpCode = http.GET();
    
    if (httpCode == HTTP_CODE_OK) {
      String payload = http.getString();
      payload.trim();
      Serial.printf("Server response: %sn", payload.c_str());
      
      if (payload == "1") {
        digitalWrite(LED_PIN, LOW);  // Включить
        Serial.println("LED ON");
      } else if (payload == "0") {
        digitalWrite(LED_PIN, HIGH); // Выключить
        Serial.println("LED OFF");
      }
    } else {
      Serial.printf("HTTP error: %sn", http.errorToString(httpCode).c_str());
    }
    
    http.end();
  } else {
    Serial.println("Failed to connect to server");
  }
}
Комментариев пока нет.

Оставить комментарий