Mkr1010 отключается и снова подключается нормально до тех пор, пока не достигнет точки, где он никогда больше не подключится снова

wifi http mkr1010

Плата подключается время от времени, но бывают случаи, когда она просто отключается и никогда не подключается снова, и я не могу повторить ошибку, потому что, когда я запускаю ее с последовательным открытием и включаю и выключаю свою WiFis, он всегда подключается, как и должно.

#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;
}

Не стесняйтесь игнорировать getkWH(), это код, связанный с потреблением энергии. Кроме того, прошивка обновлена, и сервер работает в статическом IP-адресе.

, 👍0

Обсуждение

Быстрый ответ (так что принимайте его за то, что он стоит): Если при использовании Windows у меня были разные версии Windows, решите сами, что конкретная сеть была плохой, прекратите общаться по ней и не говорите об этом ни слова. При переходе на Linux все сетевые проблемы стали понятны, и, наконец, проблемы можно было легко решить., @st2000

Спасибо, но для сервера я использую raspberry pi / raspbian OS под управлением простого сервера Flask. На самом деле у меня есть этот сервер для других проектов, и у меня не было никаких проблем, я думаю, что проблема в том, что mkr не отправляет /зависает где-то, а не в том, что сервер не получает, так как я отправлял на него запросы из других источников, и он работает нормально., @BryceSoker


2 ответа


0

Я обнаружил, что перед использованием WiFi.begin() для повторного подключения необходимо сначала использовать WiFi.disconnect (). По крайней мере, это обеспечивает надежное повторное подключение моей установки, когда ее батарея разряжена или мой маршрутизатор на мгновение отключен. Кроме того, тестирование на WL_CONNECTED или 3 означает только то, что ваша настройка подключена к маршрутизатору, но маршрутизатор еще не обязательно подключен к Интернету; в случае перезапуска маршрутизатора после отключения питания. На одном из моих маршрутизаторов нужно подождать 10 секунд, на другом-18 секунд.

void connectToWLAN()
{
  // Проверка, работает ли беспроводной модуль AirLift FeatherWing
  if (WiFi.status() == WL_NO_MODULE)
  {
    Serial.println("Connection to AirLift FeatherWing WLAN module failed");

    // Если нет, укажите, что произошел сбой в работе модуля WLAN
    WiFi.setLEDs(0, 255, 0); // Red

    // И остановись навсегда
    while (true);
  }

  // Вернуться к циклу loop(), если он уже подключен к маршрутизатору WLAN
  if (WiFi.status() == WL_CONNECTED)
  {
    return;
  }

  Serial.println("Trying to connect to WLAN router");

  // Укажите, что пока нет подключения к маршрутизатору WLAN
  WiFi.setLEDs(192, 255, 0); // Yellow

  do
  {
    // Запустите подключение к маршрутизатору WLAN и выведите значение состояния
    WiFi.disconnect();
    delay(1000);

    status = WiFi.begin(WLAN_SSID, WLAN_PASS);
    // WL_IDLE_STATUS     = 0
    // WL_NO_SSID_AVAIL   = 1
    // WL_SCAN_COMPLETED  = 2
    // WL_CONNECTED       = 3
    // WL_CONNECT_FAILED  = 4
    // WL_CONNECTION_LOST = 5
    // WL_DISCONNECTED    = 6
    Serial.println(WiFi.status());
    delay(10000);
  }
  while (status != WL_CONNECTED);

  Serial.println("Connection to WLAN router successful");

  // Укажите, что соединение с маршрутизатором WLAN было установлено
  WiFi.setLEDs(255, 0, 0); // Green

  // Чтобы лучше видеть состояние, указывающее задержку состояния светодиода RGB
  delay(2000);
}
,

1

Поскольку вы отправляете данные каждые 60 секунд, лучше устанавливать Wi-Fi только тогда, когда вам это нужно, И только после этого создавать экземпляр HttpClient. Это означает, что экземпляры wifi и client создаются только тогда, когда вам это нужно, вместо использования глобальных экземпляров. Вот способ, который я обычно делаю для такого приложения, которое я модифицировал на основе вашего скетча, вы можете попробовать. Обратите внимание, что в моем фрагменте кода выделены только те изменения, которые я внес, пожалуйста, заполните остальную часть кода:

unsigned long INTERVAL = 60000;  // в миллисекундах
unsigned long time_start = millis() + INTERVAL;    // заметил, что я изменил это на глобальную переменную и на unsigned long

// WiFi-клиент wifi;
// HttpClient client = HttpClient(wifi, serverAddress, port);

void Connecting() {
  WiFi.disconnect();
  WiFi.begin(ssid, pass);
  Serial.print("Connecting to ");
  Serial.print(ssid);
  while (WiFi.status() != WL_CONNECTED) {
    Serial.print(".");
    delay(1000);
  }
  Serial.println(" Connected");

  // ваш код для печати localIP
}

void loop() {
  
  if (WiFi.status() != WL_CONNECTED)
    connecting();

  // отправляем данные при достижении INTERVAL
  if (millis() - time_start > INTERVAL) {
    DataMonitorAndSend();
    time_start = millis();
  }

  yield();

}

void DataMonitorAndSend() {
  // переподключение();

  WiFiClient wifi;
  HttpClient client = HttpClient(wifi, serverAddress, port);

  // остальная часть вашего кода DataMinitorAndSend()

  client.end();

}
,