Добрый день. Появилась необходимость в мониторинге состояния закрытия замка двери. Реализовать хочу следующим образом: К ESP32 dev-board подключил датчик холла SS441A, который планируется установить в дверной раме. В защелку замка врезать маленький неодимовый магнит. С этим проблем возникнуть не должно. Но возникла проблема в ПО, а именно: Необходимо, чтобы esp32 подключалась к wifi сети, и при изменении статуса датчика холла - отправляла данный статус куда-либо (web-сервер или подобное), где бы фиксировалось время изменения статуса и сам статус. Но нужно учесть нестабильный интернет на объекте, чтобы, если в момент передачи не было доступа в интернет, фиксировались все изменения статусов и переданные передавались все после появления доступа в интернет. PS: на объекте не белый ip и доступ извне напрямую к устройству не возможен, поэтому фиксировать на web-сервере на самой esp не получится. Есть возможность использовать сторонний веб-сервер. На данный момент скетч такой (Сигнализация изменения статуса производится на данный момент в консоль порта и с помощью встроенного диода): Код (C++): #include <WiFi.h> #include <ESPmDNS.h> #include <WiFiUdp.h> #include <ArduinoOTA.h> #include "time.h" #include <Bounce2.h> //////////////////// WIFI //////////////////// const char* ssid = "SSID"; const char* password = "PASS"; //////////////////// TIME //////////////////// const char* ntpServer = "pool.ntp.org"; const long gmtOffset_sec = 3600; const int daylightOffset_sec = 3600; void printLocalTime() { struct tm timeinfo; if(!getLocalTime(&timeinfo)){ Serial.println("Failed to obtain time"); return; } Serial.println(&timeinfo, "%A, %B %d %Y %H:%M:%S"); } //////////////////// INPUTS AND OUTPUTS //////////////////// #define BUTTON_PIN 4 #define LED_PIN 2 Bounce debouncer1 = Bounce(); int flag=0; void setup() { //////////////////// WIFI //////////////////// Serial.begin(115200); Serial.println("Booting"); WiFi.mode(WIFI_STA); Serial.printf("Connecting to %s ", ssid); WiFi.begin(ssid, password); while (WiFi.waitForConnectResult() != WL_CONNECTED) { Serial.println("Connection Failed! Rebooting..."); delay(5000); ESP.restart(); } while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println(" CONNECTED"); //////////////////// TIME //////////////////// //init and get the time configTime(gmtOffset_sec, daylightOffset_sec, ntpServer); printLocalTime(); //////////////////// OTA //////////////////// ArduinoOTA.setHostname("esp32_HallSensor"); ArduinoOTA .onStart([]() { String type; if (ArduinoOTA.getCommand() == U_FLASH) type = "sketch"; else // U_SPIFFS type = "filesystem"; // NOTE: if updating SPIFFS this would be the place to unmount SPIFFS using SPIFFS.end() Serial.println("Start updating " + type); }) .onEnd([]() { Serial.println("\nEnd"); }) .onProgress([](unsigned int progress, unsigned int total) { Serial.printf("Progress: %u%%\r", (progress / (total / 100))); }) .onError([](ota_error_t error) { Serial.printf("Error[%u]: ", error); if (error == OTA_AUTH_ERROR) Serial.println("Auth Failed"); else if (error == OTA_BEGIN_ERROR) Serial.println("Begin Failed"); else if (error == OTA_CONNECT_ERROR) Serial.println("Connect Failed"); else if (error == OTA_RECEIVE_ERROR) Serial.println("Receive Failed"); else if (error == OTA_END_ERROR) Serial.println("End Failed"); }); ArduinoOTA.begin(); Serial.println("Ready"); Serial.print("IP address: "); Serial.println(WiFi.localIP()); //////////////////// INPUTS AND OUTPUTS //////////////////// pinMode(BUTTON_PIN,INPUT_PULLUP); // After setting up the button, setup the Bounce instance : debouncer1.attach(BUTTON_PIN); debouncer1.interval(5); // interval in ms // Setup the second button with an internal pull-up : ////pinMode(BUTTON_PIN_2,INPUT_PULLUP); // After setting up the button, setup the Bounce instance : ////debouncer2.attach(BUTTON_PIN_2); ////debouncer2.interval(5); // interval in ms //Setup the LED : pinMode(LED_PIN,OUTPUT); } void loop() { //////////////////// OTA //////////////////// ArduinoOTA.handle(); //////////////////// INPUTS AND OUTPUTS //////////////////// // Update the Bounce instances : debouncer1.update(); ////debouncer2.update(); // Get the updated value : int value1 = debouncer1.read(); boolean isButtonUp = digitalRead(value1); if ( value1 == LOW && flag==0 ) { digitalWrite(LED_PIN, HIGH ); Serial.print("Door closed"); printLocalTime(); flag=1; } if ( value1 == HIGH && flag==1 ) { digitalWrite(LED_PIN, LOW ); Serial.print("Door opened"); printLocalTime(); flag=0; } }