• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Почему не отключает Disconnect (ESP 12-E)

Brand2

New member
Хочу открывать дверь с помощью реле,которое включается при наличии в зоне доступа WiFi смартфона.
Все работает отлично когда я включаю и выключаю WiFi смартфона в настройках ,реле включается и отключается .Когда вхожу в зону точки доступа реле тоже включается нормально.
Проблемма начинается ,когда я покидаю зону точки доступа,вижу что на телефоне уже отключился WiFi ,но реле остается включенным,т.е модуль выдает Сonnected,
Когда же я вновь приближаюсь к зоне приема WiFi,получаю Disconnected на секунду примерно и тут же
опять Connected.
Такое впечатление что функция onStationDisconnected не работает при постепенном уменьшении сигнала подключенного вайфая.
Может кто знает почему так происходит?
Код:
#include <ESP8266WiFi.h>

const char *ssid = "DELTA_unlocker";
const char *password = "12345678";

unsigned long previousMillis = 0;
const long interval = 7000;
const int SleepTime = 7;

bool ConnectFlag = false;

WiFiEventHandler stationConnectedHandler; // событие - соединение
WiFiEventHandler stationDisconnectedHandler; // событие - разъединение

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT); // реле на GPIO13 (D7)
  digitalWrite(13, HIGH); // начальное значение
  WiFi.persistent(false); // бережем флеш-память, не перезаписываем данные подключения, если они не изменились с прошлой загрузки
  WiFi.mode(WIFI_AP); // Режим точки доступа
  WiFi.softAP(ssid, password);

  stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); // при соединении переходим к функции
  stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected); // при разъединении переходим к функции

}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval && ConnectFlag == false) {
    previousMillis = currentMillis;
    Serial.println("Sleep "+String(SleepTime)+" Sec.");
  //  ESP.deepSleep(SleepTime * 1000000, WAKE_RFCAL);
  }
}

void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { // при коннекте - включаем реле
  Serial.print("CONNECTED: ");
  digitalWrite(13, LOW);
  ConnectFlag = true;
  Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}

void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected& evt) { // при дисконнекте - выключаем реле
  Serial.print("DISCONNECTED: ");
  digitalWrite(13, HIGH);
  ConnectFlag = false;
  Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}

String macToString(const unsigned char* mac) { // Получаем МАС-адрес клиента в виде строки (может пригодиться при идентификации)
  char buf[20];
  snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
}
 

nikolz

Well-known member
Хочу открывать дверь с помощью реле,которое включается при наличии в зоне доступа WiFi смартфона.
Все работает отлично когда я включаю и выключаю WiFi смартфона в настройках ,реле включается и отключается .Когда вхожу в зону точки доступа реле тоже включается нормально.
Проблемма начинается ,когда я покидаю зону точки доступа,вижу что на телефоне уже отключился WiFi ,но реле остается включенным,т.е модуль выдает Сonnected,
Когда же я вновь приближаюсь к зоне приема WiFi,получаю Disconnected на секунду примерно и тут же
опять Connected.
Такое впечатление что функция onStationDisconnected не работает при постепенном уменьшении сигнала подключенного вайфая.
Может кто знает почему так происходит?
Код:
#include <ESP8266WiFi.h>

const char *ssid = "DELTA_unlocker";
const char *password = "12345678";

unsigned long previousMillis = 0;
const long interval = 7000;
const int SleepTime = 7;

bool ConnectFlag = false;

WiFiEventHandler stationConnectedHandler; // событие - соединение
WiFiEventHandler stationDisconnectedHandler; // событие - разъединение

void setup() {
  Serial.begin(115200);
  pinMode(13, OUTPUT); // реле на GPIO13 (D7)
  digitalWrite(13, HIGH); // начальное значение
  WiFi.persistent(false); // бережем флеш-память, не перезаписываем данные подключения, если они не изменились с прошлой загрузки
  WiFi.mode(WIFI_AP); // Режим точки доступа
  WiFi.softAP(ssid, password);

  stationConnectedHandler = WiFi.onSoftAPModeStationConnected(&onStationConnected); // при соединении переходим к функции
  stationDisconnectedHandler = WiFi.onSoftAPModeStationDisconnected(&onStationDisconnected); // при разъединении переходим к функции

}

void loop() {
  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= interval && ConnectFlag == false) {
    previousMillis = currentMillis;
    Serial.println("Sleep "+String(SleepTime)+" Sec.");
  //  ESP.deepSleep(SleepTime * 1000000, WAKE_RFCAL);
  }
}

void onStationConnected(const WiFiEventSoftAPModeStationConnected& evt) { // при коннекте - включаем реле
  Serial.print("CONNECTED: ");
  digitalWrite(13, LOW);
  ConnectFlag = true;
  Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}

void onStationDisconnected(const WiFiEventSoftAPModeStationDisconnected& evt) { // при дисконнекте - выключаем реле
  Serial.print("DISCONNECTED: ");
  digitalWrite(13, HIGH);
  ConnectFlag = false;
  Serial.println(macToString(evt.mac)); // МАС-адрес в порт
}

String macToString(const unsigned char* mac) { // Получаем МАС-адрес клиента в виде строки (может пригодиться при идентификации)
  char buf[20];
  snprintf(buf, sizeof(buf), "%02x:%02x:%02x:%02x:%02x:%02x",
           mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);
  return String(buf);
}
А почему Вы считаете, что должна работать?
Это Вы в какой-то документации прочитали или это Вам хочется?
 

Brand2

New member
А почему Вы считаете, что должна работать?
Это Вы в какой-то документации прочитали или это Вам хочется?
А почему Вы считаете, что должна работать?
Это Вы в какой-то документации прочитали или это Вам хочется?
Я только начинаю учится программировать для Arduino и ESP,но думаю вполне логично ,если функция
WiFiEventHandler stationConnectedHandler показывает что есть соединение,
то так же и функция
WiFiEventHandler stationDisconnectedHandler должна показывать что есть разьединение,
независимо от того,это произошло от отключения от сети ,или разьединение произошло от пропадания сигнала,
или я ошибаюсь?
 

nikolz

Well-known member
Я только начинаю учится программировать для Arduino и ESP,но думаю вполне логично ,если функция
WiFiEventHandler stationConnectedHandler показывает что есть соединение,
то так же и функция
WiFiEventHandler stationDisconnectedHandler должна показывать что есть разьединение,
независимо от того,это произошло от отключения от сети ,или разьединение произошло от пропадания сигнала,
или я ошибаюсь?
соединение есть так как принят ответ.
А соединения нет - это когда Вы разорвете соединение либо попытаетесь соединиться.
По уровню сигнала ничего не контролируется.
 

Brand2

New member
соединение есть так как принят ответ.
А соединения нет - это когда Вы разорвете соединение либо попытаетесь соединиться.
По уровню сигнала ничего не контролируется.
Спасибо,кажется понял.
А можно ли как то отслеживать,подключен кто то к точе доступа или нет в таком случае?
Можно конечно сделать что модуль сам будет искать заданную сеть и подключаться к ней,я сделал и это работает ,
проблемма в том что только сам телефон всегда должен быть в режиме точки доступа,что не очень удобно.
 

nikolz

Well-known member
Спасибо,кажется понял.
А можно ли как то отслеживать,подключен кто то к точе доступа или нет в таком случае?
Можно конечно сделать что модуль сам будет искать заданную сеть и подключаться к ней,я сделал и это работает ,
проблемма в том что только сам телефон всегда должен быть в режиме точки доступа,что не очень удобно.
в SDK есть функции (не знаю есть ли они в дурине) можно установить время проверки существования подключения.
т е точка доступа пошлет запрос и если ответа нет то отключит.
Можно сделать точкой доступа ESP и смартфон будет подключаться к ней и отключаться.
Тогда при уходе надо на смартфоне отключится от точки доступа.
либо периодически посылать широковещательный запрос с точки доступа и смартфон должен ответить.
Вариантов много.
Можно конечно и уровень сигнала измерять и по нему определять приближаетесь или удаляетесь но не думаю что это будет надежно работать.
 

Brand2

New member
в SDK есть функции (не знаю есть ли они в дурине) можно установить время проверки существования подключения.
т е точка доступа пошлет запрос и если ответа нет то отключит.
Можно сделать точкой доступа ESP и смартфон будет подключаться к ней и отключаться.
Тогда при уходе надо на смартфоне отключится от точки доступа.
либо периодически посылать широковещательный запрос с точки доступа и смартфон должен ответить.
Вариантов много.
Можно конечно и уровень сигнала измерять и по нему определять приближаетесь или удаляетесь но не думаю что это будет надежно работать.
Вообще то ESP здесь и является точкой доступа
Я сделал так,телефон становится точкой доступа а модуль ищет сеть,и как только находит,подключается и отключается когда теряет сеть,работает стабильно,но это не удобно,так можно с одним только телефоном,да и все время нужно смотреть что бы тел был в этом режиме.
Еще пытаюсь сейчас сделать на блютузе с ардуиной ,подключение по имени телефонана и мак адреса там свои камни ,да и конструкция сложнее,а так подключил к ESP-01 реле и вуаля.
 

nikolz

Well-known member
Вообще то ESP здесь и является точкой доступа
Я сделал так,телефон становится точкой доступа а модуль ищет сеть,и как только находит,подключается и отключается когда теряет сеть,работает стабильно,но это не удобно,так можно с одним только телефоном,да и все время нужно смотреть что бы тел был в этом режиме.
Еще пытаюсь сейчас сделать на блютузе с ардуиной ,подключение по имени телефонана и мак адреса там свои камни ,да и конструкция сложнее,а так подключил к ESP-01 реле и вуаля.
А почему бы не сделать это на двух ESP или на RFID
Что собственно Вы делаете? Электронный ключ?
 

Brand2

New member
А почему бы не сделать это на двух ESP или на RFID
Что собственно Вы делаете? Электронный ключ?
Да,это электронный ключ,для двери в подьезде,автоматического шлакбаума,типа дал пароль жильцам от точки доступа и все,ничего даже не нужно добавлять в скетч пользователей.
Сделал и работает открывание и закрывание машины,но там телефон работает как точка доступа,очень удобно,не нужно думать,закрыл машину или нет,давить на кнопки пульта ,подошел,машина открыта уже,ушел,она закрылась.Но нужно смотреть что бы тел всегда был в режиме точки доступа,а это неудобно .
 

nikolz

Well-known member
Да,это электронный ключ,для двери в подьезде,автоматического шлакбаума,типа дал пароль жильцам от точки доступа и все,ничего даже не нужно добавлять в скетч пользователей.
Сделал и работает открывание и закрывание машины,но там телефон работает как точка доступа,очень удобно,не нужно думать,закрыл машину или нет,давить на кнопки пульта ,подошел,машина открыта уже,ушел,она закрылась.Но нужно смотреть что бы тел всегда был в режиме точки доступа,а это неудобно .
это как у брелка опция свободные руки.
Однако получается и так. бывает что остановился когда уходишь а система опознает что приходишь и открывает машину.
При этом расстояние такое, что желающий может легко незаметно проникнуть в машину.
Другой вариант Вы отходите но система еще не закрыла злоумышленник быстро приоткрывает дверь. И усе. двери останутся открытыми, а система сработает.
 

Brand2

New member
Нет ,так не бывает,если машина была открыта и ты уходишь,закрывание происходит метров 30-40 от нее,если остановился раньше,она так и будет окрыта пока не отойдешь,а когда подходишь,она открывается уже метров с 20-30,нет прыгания,срабатывание очень четкое.
В дальнейшем можно экранировать часть корпуса что ты ослабить сигнали уменьшить дистанцию срабатывания,но пока в этом нет необходимости.
А что касается злоумышленника,то у нас иногда оставляешь окно открытым или машину,никто не лез пока,да и что там брать сейчас,магнитолу что ли ,а доллары я там не вожу))
Да и никакая система не сможет обеспечить 100% защиту если кто то захочет взломать .
 

nikolz

Well-known member
Нет ,так не бывает,если машина была открыта и ты уходишь,закрывание происходит метров 30-40 от нее,если остановился раньше,она так и будет окрыта пока не отойдешь,а когда подходишь,она открывается уже метров с 20-30,нет прыгания,срабатывание очень четкое.
В дальнейшем можно экранировать часть корпуса что ты ослабить сигнали уменьшить дистанцию срабатывания,но пока в этом нет необходимости.
А что касается злоумышленника,то у нас иногда оставляешь окно открытым или машину,никто не лез пока,да и что там брать сейчас,магнитолу что ли ,а доллары я там не вожу))
Да и никакая система не сможет обеспечить 100% защиту если кто то захочет взломать .
Ну если все работает, то не понятно в чем проблема.
 

Brand2

New member
Я хочу испльзовать esp как точку доступа ,что бы мог любой,кто знаетимя и пароль точки доступа ,октрывать и закрывать двери в подьезде и шлагбаум,
а используя телефон в режиме AP , только я могу один,забив имя телефона в скетч ,записывать и менять имена всех пользователей это не реально,если из около 300
 

nikolz

Well-known member
Я хочу испльзовать esp как точку доступа ,что бы мог любой,кто знаетимя и пароль точки доступа ,октрывать и закрывать двери в подьезде и шлагбаум,
а используя телефон в режиме AP , только я могу один,забив имя телефона в скетч ,записывать и менять имена всех пользователей это не реально,если из около 300
Ну и в чем проблема. Запрограммируйте ESP как AP.
и сделайте так чтобы через заданное время клиент отключался самой AP
Но будет проблема с переполнением буфера так как ESP стандартно не может подключить много клиентов да и канал будет один на всех
 

Brand2

New member
Ну и в чем проблема. Запрограммируйте ESP как AP.
и сделайте так чтобы через заданное время клиент отключался самой AP
Но будет проблема с переполнением буфера так как ESP стандартно не может подключить много клиентов да и канал будет один на всех
А как мне отключить клиента ,по идее клиент может быть один,если только еще кто то в это время не подойдет к двери .
 

Brand2

New member
Сверху Снизу