logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

ESP8266 i LM393 do zliczania mrugnięć diody: problem z WiFi i bazą danych

gomolec 27 Mar 2024 20:50 939 4
REKLAMA
  • #1 21022405
    gomolec
    Poziom 6  
    Posty: 3
    Chciałem wykonać licznik mrugnięć diody umieszczonej na liczniku energii elektrycznej przy użyciu esp8266 i czujnika światła LM393. Napisałem program który zlicza mrugnięcia i co jakiś czas wysyła dane do lokalnego serwera w celu ich zapisu w bazie danych (sql). Narazie mam tylko taka możliwość zapisu danych, czyli Apache i MySql. Niestety wysyłanie tych danych do serwera powoduje zatrzymanie się pętli na chwile, przez co pomijane co niektóre mignięcia. Jako tako esp nie posiada żadnej wielowątkowości więc nie wiem jak ugryśc ten temat. Czy może ktoś się zna, miał podobny problem i mi pomoże? Oprócz tego mam problem z samym połączeniem wifi, gdy używam biblioteki ESP8266WiFi.h to komputerek po pewnym czasie tak jakby tracił zasięg, w przypadku biblioteki ESP8266WiFiMulti.h nie ma takiego problemu, jednak nie wiem czy po prostu esp nie łączy się ponownie automatycznie (to też pewnie wpływa na spowalnianie programu).

    
    #include <Arduino.h>
    #include <ESP8266WiFi.h>
    #include <ESP8266HTTPClient.h>
    #include "time.h"
    
    // WiFi network
    const char* ssid = "";
    const char* password = "";
    
    // API
    const char* serverIP = "192.168.43.1";
    const int serverPort = 8080;
    const char* serverPath = "/energy.php";
    
    // NTP Server
    const char* ntpServer = "tempus1.gum.gov.pl";
    const long  gmtOffset_sec = 3600;
    const int   daylightOffset_sec = 3600;
    
    // Timer for updating the database
    unsigned long previousMillis = 0;
    const long interval = 10000;//60000;
    
    // Inpulse Counter
    const int analogInPin = A0; 
    bool was_dark = false;
    int counter = 0;
    
    unsigned long getTime() {
      time_t now;
      struct tm timeinfo;
      if (!getLocalTime(&timeinfo)) {
        return(0);
      }
      time(&now);
      return now;
    }
    
    void sendToServer() {
      Serial.println("[HTTP] begin...\n");
      WiFiClient client;
      HTTPClient http;
    
      String request = serverPath;
      request += "?date=" + String(getTime());
      request += "&value=" + String(counter++);
      Serial.print("Generating request: ");
      Serial.println(request);
        
      if (!http.begin(client, serverIP, serverPort, request)) {
        Serial.println("Connection failed");
        Serial.print("Wifi status: ");
        Serial.println(WiFi.status());
        return;
      }
    
      Serial.print("[HTTP] GET...\n");
      int httpCode = http.GET();
    
      Serial.printf("[HTTP] GET... code: %d\n", httpCode);
    
      if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
        String payload = http.getString();
        Serial.println(payload);
        counter = 0;
        return;
      }
    
      Serial.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
    }
    
    void setup() {
      Serial.begin(115200);
    
      Serial.println();
      Serial.println();
      Serial.print("Connecting to ");
      Serial.println(ssid);
    
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    
      while (WiFi.status() != WL_CONNECTED) {
        delay(500);
        Serial.print(".");
      }
    
      Serial.println("");
      Serial.println("WiFi connected");
      Serial.println("IP address: ");
      Serial.println(WiFi.localIP());
    
      configTime(gmtOffset_sec, daylightOffset_sec, ntpServer);
    }
    
    void loop() {
      Serial.println(WiFi.status());
    
      int value = analogRead(analogInPin);
    
      if (value > 900) {
        was_dark = true;
        return;
      }
      
      if (value > 90 || !was_dark) {
        return;
      }
        
      counter++;
      was_dark = false;
      Serial.print("Counter: ");
      Serial.println(counter);
    
      unsigned long currentMillis = millis();
    
      if(currentMillis - previousMillis >= interval) {
        previousMillis = currentMillis;
        sendToServer();
      }
    }
    
  • REKLAMA
  • #2 21022486
    krzbor
    Poziom 29  
    Posty: 1744
    Pomógł: 40
    Ocena: 1051
    Może na początek nie rób aktywnego czekania na rezultat GET. Zobacz jak to zrobiłem: Link
  • REKLAMA
  • #3 21024323
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1461
    Skoro po HTTP, to MySQL nie powinno w ogóle w twoich myślach istnieć gdy myślisz o kodzie na uK

    Miejscem na martwienie się o to jest część serwerowa (Python, PHP, Java)
  • REKLAMA
REKLAMA