diff --git a/barrier_controller/barrier_controller.ino b/barrier_controller/barrier_controller.ino index 7772cb7..c1ca8db 100644 --- a/barrier_controller/barrier_controller.ino +++ b/barrier_controller/barrier_controller.ino @@ -18,6 +18,7 @@ #define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT #define AP_SSID "Barrier-Setup" +#define FW_VERSION "1.2" #define AP_PASS "barrier123" Preferences prefs; @@ -141,7 +142,7 @@ input[type=text]:focus,input[type=password]:focus{outline:none;border-color:#219

Barrier Controller

IP: )"; html += currentIP(); - html += "
"; + html += "  ·  v" + String(FW_VERSION) + ""; if (msg.startsWith("❌")) html += "
" + msg + "
"; diff --git a/barrier_node/barrier_node.ino b/barrier_node/barrier_node.ino index ce2ac89..b1d7cb9 100644 --- a/barrier_node/barrier_node.ino +++ b/barrier_node/barrier_node.ino @@ -17,6 +17,7 @@ #define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT #define AP_SSID "Barrier-Node-Setup" +#define FW_VERSION "1.1" #define AP_PASS "barrier123" Preferences prefs; @@ -32,7 +33,7 @@ String cfg_token = "barrier_token_2026"; String cfg_self_ip = ""; String cfg_gateway = ""; String cfg_subnet = "255.255.255.0"; -String cfg_name = "Шлагбаум 1"; +String cfg_name = "Шлагбаум 1"; // имя для идентификации void WiFiEvent(WiFiEvent_t event) { switch (event) { @@ -89,9 +90,9 @@ void saveConfig() { void triggerRelay() { Serial.println("Реле: импульс 500мс"); - digitalWrite(RELAY_PIN, HIGH); + digitalWrite(RELAY_PIN, LOW); // LOW = включить (NC размыкается) delay(500); - digitalWrite(RELAY_PIN, LOW); + digitalWrite(RELAY_PIN, HIGH); // HIGH = выключить } String currentIP() { @@ -127,20 +128,22 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9 html += R"(
IP: )"; html += currentIP(); - html += "
"; + html += "  ·  v" + String(FW_VERSION) + ""; if (msg.startsWith("❌")) html += "
" + msg + "
"; else if (msg.length() > 0) html += "
" + msg + "
"; + // Управление html += R"(

Управление

-
+
)"; + // Настройки html += R"(

Устройство

@@ -148,12 +151,14 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9 +

Сеть WiFi

+

IP этого устройства

@@ -162,10 +167,12 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9 +
)"; + // OTA html += R"(

Обновление прошивки

@@ -183,8 +190,17 @@ void setupRoutes() { server.send(200, "text/html", buildPage()); }); + // Открытие через браузер (POST) + server.on("/open", HTTP_POST, []() { + triggerRelay(); + server.send(200, "text/html", buildPage("✅ Команда выполнена")); + }); + + // Открытие от контроллера (GET + токен) server.on("/open", HTTP_GET, []() { String token = server.header("X-Token"); + // Если запрос из браузера (нет токена) — разрешаем + // Если запрос от контроллера — проверяем токен if (token.length() > 0 && token != cfg_token) { server.send(401, "text/plain", "unauthorized"); return; @@ -235,6 +251,7 @@ void setupRoutes() { } ); + // Статус server.on("/status", HTTP_GET, []() { String json = "{\"name\":\"" + cfg_name + "\",\"ip\":\"" + currentIP() + "\",\"eth\":" + (ethConnected ? "true" : "false") + "}"; server.send(200, "application/json", json); @@ -244,7 +261,7 @@ void setupRoutes() { void setup() { Serial.begin(115200); - digitalWrite(RELAY_PIN, LOW); + digitalWrite(RELAY_PIN, HIGH); // HIGH = реле выключено (инвертированная логика) pinMode(RELAY_PIN, OUTPUT); loadConfig();