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();
}
}