The board does reconnect from time to time, but there are times where it just disconnects and never reconnects again and I can't replicate the error because while I run it with Serial open and turn ON and OFF my WiFis it always reconnects as it should.
#include <ArduinoHttpClient.h>
#include <WiFiNINA.h>
#include <EmonLib.h>
EnergyMonitor emon1;
EnergyMonitor emon2;
EnergyMonitor emon3;
int INTERVAL = 60;
int last_code = 0;
char ssid[] = "MySSID";
char pass[] = "MyPW";
String ID = "Garden_Pump_Sensor";
int sequence = 0;
double kWh = 0.0;
char serverAddress[] = "192.168.1.108"; // server address
int port = 5005;
WiFiClient wifi;
HttpClient client = HttpClient(wifi, serverAddress, port);
int status = WL_IDLE_STATUS;
void setup() {
Serial.begin(9600);
analogReadResolution(9);
emon1.current(0, 100);
emon2.current(5, 100);
emon3.current(6, 100);
Connecting();
}
void Connecting() {
int tries = 4;
while ( (WiFi.status() != WL_CONNECTED && tries > 0) || last_code != 200) {
Serial.print("Status #1: ");
Serial.println(WiFi.status());
WiFi.begin(ssid, pass);
Serial.print("Status #2: ");
Serial.println(WiFi.status());
tries--;
last_code = 200;
}
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
IPAddress ip = WiFi.localIP();
Serial.print("IP Address: ");
Serial.println(ip);
}
void reconnecting() {
if (WiFi.status() != 3 || (WiFi.RSSI() <= -90) || (WiFi.RSSI() == 0) || last_code != 200) {
WiFi.end();
Connecting();
}
}
void loop() {
unsigned long delayTime = INTERVAL * 1000;
unsigned long time_start = millis();
DataMonitorAndSend();
unsigned long time_final = millis() - time_start;
unsigned long delay_value = delayTime - time_final;
Serial.println(delay_value);
if (delay_value < 1 || delay_value > delayTime) {
return;
} else {
delay(delay_value);
}
}
void DataMonitorAndSend() {
reconnecting();
Serial.println("making POST request");
String contentType = "application/json";
kWh = kWh + getKWH();
String postData = "{\"ID\": \""+ID+"\",\"seq\": " + String(sequence) + ",\"kWh\": " + String(kWh, 6) + "}";
Serial.print("data: ");
Serial.println(postData);
client.setHttpResponseTimeout(5 * 1000);
client.post("/receivedata/", contentType, postData);
// read the status code and body of the response
int statusCode = client.responseStatusCode();
String response = client.responseBody();
Serial.print("Status code: ");
Serial.println(statusCode);
if (statusCode == 200) {
kWh = 0;
sequence++;
}
last_code = statusCode;
Serial.print("Response: ");
Serial.println(response);
}
double getKWH() {
int LOOPS = 15;
double kWh_Total = 0.0;
unsigned long delayTime_kwh = 2 * 1000;
for (int i = 0; i < LOOPS; i++) {
unsigned long time_start_kwh = millis();
double Irms1 = emon1.calcIrms(600);
if (Irms1 < 0.3) Irms1 = 0;
double Watt1 = (Irms1 * 230) / 1000;
double Irms2 = emon2.calcIrms(600);
if (Irms2 < 0.3) Irms2 = 0;
double Watt2 = (Irms2 * 230) / 1000;
double Irms3 = emon3.calcIrms(600);
if (Irms3 < 0.3) Irms3 = 0;
double Watt3 = (Irms3 * 230) / 1000;
kWh_Total = kWh_Total + ((Watt1 + Watt2 + Watt3) / 60);
unsigned long time_final_kwh = millis() - time_start_kwh;
unsigned long delay_value_kwh = delayTime_kwh - time_final_kwh;
if (delay_value_kwh < 0 || delay_value_kwh > delayTime_kwh) {
delay(0);
} else {
delay(delay_value_kwh);
}
}
return kWh_Total / LOOPS;
}
Feel free to ignore the getkWH()
, it's code related to power consumption. Also the firmware is up to date and the server is using a static IP.