Лог-Трекер состояния GPIO

Тема в разделе "Закажу проект", создана пользователем SimyriK, 5 сен 2018.

  1. SimyriK

    SimyriK Нуб

    Добрый день. Появилась необходимость в мониторинге состояния закрытия замка двери. Реализовать хочу следующим образом: К 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;
      }
    }

     
     
  2. iodev

    iodev Нуб