• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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
Сверху Снизу