fix: откат к рабочей логике реле, кнопка через fetch+JS

This commit is contained in:
Aleksei
2026-06-17 09:22:54 +00:00
parent eaf6d16013
commit 64b815f8c4
+22 -27
View File
@@ -17,7 +17,6 @@
#define ETH_CLK_MODE ETH_CLOCK_GPIO17_OUT
#define AP_SSID "Barrier-Node-Setup"
#define FW_VERSION "1.2"
#define AP_PASS "barrier123"
Preferences prefs;
@@ -33,7 +32,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) {
@@ -90,9 +89,9 @@ void saveConfig() {
void triggerRelay() {
Serial.println("Реле: импульс 500мс");
digitalWrite(RELAY_PIN, LOW); // LOW = включить (NC размыкается)
digitalWrite(RELAY_PIN, HIGH);
delay(500);
digitalWrite(RELAY_PIN, HIGH); // HIGH = выключить
digitalWrite(RELAY_PIN, LOW);
}
String currentIP() {
@@ -128,25 +127,20 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9
html += R"(</h2>
<div class='sub'>IP: )";
html += currentIP();
html += " &nbsp;·&nbsp; v" + String(FW_VERSION) + "</div>";
html += "</div>";
String ok = server.hasArg("ok") ? server.arg("ok") : "";
if (ok == "1") msg = "✅ Команда выполнена";
if (server.hasArg("ok")) msg = "✅ Команда выполнена";
if (msg.startsWith(""))
html += "<div class='err'>" + msg + "</div>";
else if (msg.length() > 0)
html += "<div class='msg'>" + msg + "</div>";
// Управление
html += R"(<div class='card'>
<h3>Управление</h3>
<form action='/open' method='post'>
<button class='btn btn-open'> Открыть шлагбаум</button>
</form>
<button class='btn btn-open' onclick="fetch('/open',{method:'POST'}).then(()=>window.location='/?ok=1')"> Открыть шлагбаум</button>
</div>)";
// Настройки
html += R"(<div class='card'>
<form action='/save' method='post'>
<h3>Устройство</h3>
@@ -154,14 +148,12 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9
<input type='text' name='name' value=')" + cfg_name + R"('>
<label>API токен</label>
<input type='text' name='token' value=')" + cfg_token + R"('>
<hr class='sep'>
<h3>Сеть WiFi</h3>
<label>SSID</label>
<input type='text' name='ssid' value=')" + cfg_ssid + R"('>
<label>Пароль</label>
<input type='password' name='pass' placeholder='оставь пустым не менять'>
<hr class='sep'>
<h3>IP этого устройства</h3>
<label>Статический IP <span class='hint'>(пусто = DHCP)</span></label>
@@ -170,12 +162,10 @@ input[type=text],input[type=password]{width:100%;box-sizing:border-box;padding:9
<input type='text' name='gateway' value=')" + cfg_gateway + R"(' placeholder='например 192.168.15.1'>
<label>Маска подсети</label>
<input type='text' name='subnet' value=')" + cfg_subnet + R"('>
<button class='btn btn-primary' type='submit'>💾 Сохранить и перезагрузить</button>
</form>
</div>)";
// OTA
html += R"(<div class='card'>
<h3>Обновление прошивки</h3>
<form action='/update' method='post' enctype='multipart/form-data'>
@@ -193,17 +183,9 @@ void setupRoutes() {
server.send(200, "text/html", buildPage());
});
// Открытие через браузер (POST + redirect — обновление страницы не повторяет команду)
server.on("/open", HTTP_POST, []() {
triggerRelay();
server.sendHeader("Location", "/?ok=1");
server.send(302);
});
// Открытие от контроллера (GET + токен)
server.on("/open", HTTP_GET, []() {
String token = server.header("X-Token");
if (token != cfg_token) {
if (token.length() > 0 && token != cfg_token) {
server.send(401, "text/plain", "unauthorized");
return;
}
@@ -211,6 +193,20 @@ void setupRoutes() {
server.send(200, "text/plain", "ok");
});
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;
}
triggerRelay();
if (token.length() > 0) {
server.send(200, "text/plain", "ok");
} else {
server.send(200, "text/html", buildPage("✅ Команда выполнена"));
}
});
server.on("/save", HTTP_POST, []() {
cfg_name = server.arg("name");
cfg_token = server.arg("token");
@@ -249,7 +245,6 @@ void setupRoutes() {
}
);
// Статус
server.on("/status", HTTP_GET, []() {
String json = "{\"name\":\"" + cfg_name + "\",\"ip\":\"" + currentIP() + "\",\"eth\":" + (ethConnected ? "true" : "false") + "}";
server.send(200, "application/json", json);
@@ -259,7 +254,7 @@ void setupRoutes() {
void setup() {
Serial.begin(115200);
digitalWrite(RELAY_PIN, HIGH); // HIGH = реле выключено (инвертированная логика)
digitalWrite(RELAY_PIN, LOW);
pinMode(RELAY_PIN, OUTPUT);
loadConfig();