Нужен совет по реализации замка на блютутз

Суть вопроса возможно ли реализовать такую задачу на ардуино:
Ардуино на нем блок двойного реле на конце моторчик который управляется +- 0.5 секунда импульс открытие .
Встроенный датчик положения двери при закрытие двери замок закрывается подается на мототорчик сигнал -+ 0.5 секунд и врубается сигнал .
Открытие с помощью программы через блютутз с возможностью ставить свой пароль код.
Если забыл код чтоб была возможность сбросить код путем какой нибудь фичи типа программы доступа администратора или кода администратора

https://create.arduino.cc/editor/denis0690/e947ab9c-a4e0-4161-b7b5-622cbcb567ff помогите исправить код

Требуется пароль. Разместите здесь свой код и чертеж схемы.

Requires password. Post your code and a drawing of your circuit here.

#include <WiFi.h>
#include <WebServer.h>
#include <DNSServer.h>
#include <SPIFFS.h>

const int IN_1 = 13; // L298N in1 motors Right GPIO 13 (D13)
const int IN_2 = 12; // L298N in2 motors Right GPIO 12 (D12)
const int ENDSTOP_PIN = 15; // Пин для концевого выключателя GPIO 15 (D15)

const char* ssid = "Denis123";
const char* password = "Denis12345"; // Ваш пароль Wi-Fi
String adminPassword;

const int unlockTime = 1000; // Время подачи тока на мотор для открытия замка (в миллисекундах)
const int lockTime = 1000; // Время подачи тока на мотор для закрытия замка (в миллисекундах)
const int endstopDelay = 3000; // Пауза после срабатывания концевого выключателя (в миллисекундах)
const int maxAttempts = 3; // Максимальное количество попыток ввода пароля
const int lockoutTime = 1000 * 60 * 30; // Время блокировки после превышения максимального количества попыток (в миллисекундах)

int attemptCount = 0; // Счетчик попыток ввода пароля
unsigned long lockoutStart = 0; // Время начала блокировки

bool doorLocked = false; // Переменная для отслеживания состояния замка двери
bool doorOpened = false; // Переменная для отслеживания состояния двери

const byte DNS_PORT = 53;
IPAddress apIP(192, 168, 1, 250);
DNSServer dnsServer;
WebServer server(80);

void setup() {
  pinMode(IN_1, OUTPUT);
  pinMode(IN_2, OUTPUT);
  pinMode(ENDSTOP_PIN, INPUT_PULLUP);
  
  Serial.begin(115200);
  
  Serial.begin(115200);
  Serial.println("Serial initialized");
  
  if (!SPIFFS.begin(true)) {
    Serial.println("Форматирование SPIFFS...");
    SPIFFS.format();
    
    if (!SPIFFS.begin(true)) {
      Serial.println("Ошибка форматирования SPIFFS");
      return;
    }
    
    Serial.println("SPIFFS успешно отформатирована");
  }
  
  File configFile = SPIFFS.open("/config.txt", "r");
  if (!configFile) {
    Serial.println("Не удалось открыть файл конфигурации для чтения");
  } else {
    Serial.println("Файл конфигурации успешно открыт");
    String adminPasswordFromFile;
    while (configFile.available()) {
        adminPasswordFromFile += (char)configFile.read();
    }
    configFile.close();
    adminPasswordFromFile.trim(); // Удаляем лишние пробелы
    adminPassword = adminPasswordFromFile; // Присваиваем значение без пробелов
    Serial.println("Пароль администратора, считанный из файла конфигурации: " + adminPassword);
  }
  WiFi.mode(WIFI_AP);
  WiFi.softAPConfig(apIP, apIP, IPAddress(255, 255, 255, 0));
  WiFi.softAP(ssid, password, 1, 0);
  
  IPAddress myIP = WiFi.softAPIP();
  Serial.print("AP IP address: ");
  Serial.println(myIP);
  
  dnsServer.start(DNS_PORT, "*", apIP);
  
  server.on("/", HTTP_handleRoot);
  server.on("/unlock", HTTP_handlePassword);
  server.on("/checkpassword", HTTP_handleCheckPassword);
  server.on("/changepassword", HTTP_handleChangePassword);
  server.onNotFound(HTTP_handleRoot);
  
  server.begin();
}

void loop() {
  dnsServer.processNextRequest();
  server.handleClient();
  
  String command = server.arg("State");
  
  if (command == "doorunlock") {
    if (!doorLocked) {
      doorunlock();
    }
  }
  
  if (digitalRead(ENDSTOP_PIN) == LOW && !doorLocked && doorOpened) {
    delay(endstopDelay);
    doorlock();
  }
  
  if (digitalRead(ENDSTOP_PIN) == HIGH) {
    doorOpened = true;
  } else {
    doorOpened = false;
  }
}

void doorunlock() {
  digitalWrite(IN_1, HIGH);
  delay(unlockTime);
  digitalWrite(IN_1, LOW);
  doorLocked = false;
}

void doorlock() {
  digitalWrite(IN_2, HIGH);
  delay(lockTime);
  digitalWrite(IN_2, LOW);
  doorLocked = true;
}

void HTTP_handleRoot() {
  String page = "<!DOCTYPE html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width, initial-scale=1.0'>";
  page += "<style>body {background-color: black; color: white; font-family: Arial, sans-serif;}";
  page += "button {font-size: 24px; border: none; border-radius: 5px;}";
  page += "input[type='password'] {width: 80%; height: 50px; font-size: 20px; padding: 5px; margin-bottom: 10px;}";
  page += "#unlockButton {width: 80%; height: 70px; font-size: 24px; background-color: #0055FF; color: white; transition: background-color 0.3s;}";
  page += "#unlockButton:hover {background-color: #0088FF;}";
  page += "#settingsButton {width: 80%; height: 70px; font-size: 18px; background-color: gray; color: white;}";
  page += "#settingsButton:hover {background-color: darkgray;}";
  page += "#changePasswordButton {width: 80%; height: 70px; font-size: 24px; background-color: red; color: white;}</style>";
  page += "</head><body>";
  page += "<h1>Введите пароль:</h1>";
  page += "<input type='password' id='password'>";
  page += "<button id='unlockButton' onclick=\"unlockDoor()\">Открыть</button>";
  page += "<p id='status'></p>";
  page += "<button id='settingsButton' onclick=\"toggleSettings()\">Настройки</button>";
  page += "<div id='settings' style='display: none;'>";
  page += "<h1>Сменить пароль:</h1>";
  page += "<input type='password' id='oldPassword' placeholder='Старый пароль'>";
  page += "<input type='password' id='newPassword' placeholder='Новый пароль'>";
  page += "<input type='password' id='confirmPassword' placeholder='Подтвердите новый пароль'>";
  page += "<button id='changePasswordButton' onclick=\"changePassword()\">Сменить пароль</button>";
  page += "</div>";
  page += "<script>";
  page += "var passwordField = document.getElementById('password');";
  page += "var statusField = document.getElementById('status');";
  page += "var settingsDiv = document.getElementById('settings');";
  page += "var oldPasswordField = document.getElementById('oldPassword');";
  page += "var newPasswordField = document.getElementById('newPassword');";
  page += "var confirmPasswordField = document.getElementById('confirmPassword');";
  page += "function unlockDoor() { var password = passwordField.value; var xhr = new XMLHttpRequest(); xhr.open('GET', '/unlock?password=' + password, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { passwordField.value = ''; statusField.innerHTML = xhr.responseText; } }; xhr.send(); }";
  page += "function toggleSettings() { if (settingsDiv.style.display === 'block') { settingsDiv.style.display = 'none'; } else { settingsDiv.style.display = 'block'; } }";
  page += "function changePassword() { var oldPassword = oldPasswordField.value; var newPassword = newPasswordField.value; var confirmPassword = confirmPasswordField.value; if (newPassword == confirmPassword) { var xhr = new XMLHttpRequest(); xhr.open('GET', '/changepassword?oldpassword=' + oldPassword + '&newpassword=' + newPassword + '&confirmpassword=' + confirmPassword, true); xhr.onreadystatechange = function() { if (xhr.readyState == 4 && xhr.status == 200) { statusField.innerHTML = xhr.responseText; } }; xhr.send(); } else { statusField.innerHTML = 'Пароли не совпадают'; } }";
  page += "</script></body></html>";
  server.send(200, "text/html", page);
}

void HTTP_handlePassword() {
  if (attemptCount < maxAttempts && millis() - lockoutStart > lockoutTime) {
    if (server.hasArg("password")) {
      String enteredPassword = server.arg("password");
      if (enteredPassword.equals(adminPassword)) {
        doorunlock();
        server.send(200, "text/plain", "Дверь разблокирована");
      } else {
        attemptCount++;
        if (attemptCount >= maxAttempts) {
          lockoutStart = millis();
        }
        server.send(200, "text/plain", "Неверный пароль");
      }
    } else {
      server.send(200, "text/plain", "Пароль не предоставлен");
    }
  } else {
    server.send(200, "text/plain", "Заблокировано");
  }
}

void HTTP_handleCheckPassword() {
  if (server.hasArg("password")) {
    if (server.arg("password").equals(adminPassword)) {
      server.send(200, "text/plain", "Пароль верный");
    } else {
      server.send(200, "text/plain", "Неверный пароль");
    }
  } else {
    server.send(200, "text/plain", "Пароль не предоставлен");
  }
}

void HTTP_handleChangePassword() {
  if (server.hasArg("oldpassword") && server.hasArg("newpassword") && server.hasArg("confirmpassword")) {
    String oldPassword = server.arg("oldpassword");
    String newPassword = server.arg("newpassword");
    String confirmPassword = server.arg("confirmpassword");
    
    if (oldPassword.equals(adminPassword)) {
      if (newPassword.equals(confirmPassword)) {
        adminPassword = newPassword;

        File newConfigFile = SPIFFS.open("/config.txt", "w");
        if (!newConfigFile) {
          Serial.println("Не удалось открыть файл конфигурации для записи");
          return;
        }
        newConfigFile.println(adminPassword);
        newConfigFile.close();
        server.send(200, "text/plain", "Пароль изменен");
      } else {
        server.send(200, "text/plain", "Новые пароли не совпадают");
      }
    } else {
      server.send(200, "text/plain", "Старый пароль неверный");
    }
  } else {
    server.send(200, "text/plain", "Не все аргументы предоставлены");
  }
}

Не работает открытие замка при вводе пароля

Это третья тема с той же темой, которую вы создали, проигнорировали и/или удалили.

This is the third topic with the same subject that you have created, ignored and/or deleted.

Какую доску вы используете? Покажите чертеж вашей схемы.

Which board are you using? Show a drawing of your circuit.

4 of 4 deleted. You misspelled your name.

Я реши лвсе вопросы с помощью Chat gpt спасибо

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.