Sporadische Wifi-Einwahl ohne Code zu blockieren

RP2040 mit WifiNina: Ich bräuchte für ein Projekt die Möglichkeit mich nicht im Setup sondern sporadisch im Code ins Wifi einzuwählen. Quasi: Wenn Wifi irgendwann vorhanden, dann Einwahl. Der Einwahlcode dürfte aber meinen Code nicht blockieren. Geht das?:thinking:

Dieser Funktionsaufruf ist nicht blockierend

int status = WiFi.begin(ssid, pass);

Sie können ein blockierendes while darum schreiben und auf einen Status WL_CONNECTED warten oder einfach mit etwas anderem weitermachen.

schauen Sie das Beispiel an

➜ block:


  // attempt to connect to WiFi network:
  while (status != WL_CONNECTED) {
    Serial.print("Attempting to connect to WPA SSID: ");
    Serial.println(ssid);
    // Connect to WPA/WPA2 network:
    status = WiFi.begin(ssid, pass);

    // wait 10 seconds for connection:
    delay(10000);
  }

1 Like

das geht imho auch zweistufig und nicht blockierend unter verzicht auf delay

  • Du hast irgend einen Event der Wifi Benötigt: wenn der Event auftritt forderst du wifi an
  • Wenn der Event aufgetreten ist und wifi vorhanden ist löst du was aus.

pseudo:

if (importantEvent == true) notify = true; //flag setzen dass was zu tun ist
if (notify) {
  if (WiFi.status() == WL_CONNECTED) {
    bool result = sendData();  // Funktion kann zurückliefern obs ok war
	if (result == OK) 
	  notify = false;               // flag löschen
	else
	  nokCounter++;           // oder irgend eine andere Fehlerbehandlung
  }
  else
    reconnectWifi();              // im prinzip die zeilen die du heute im setup() für wifi hast
}
1 Like

Ich nutze auf meinem ESP32 eine Funktion, die ich im setup und bei Bedarf in loop aufrufe, beispielsweise beim Synchronisieren mit einem NTP-Server alle zehn Minuten.

void routerVerbindung()
{
  if (WiFi.status() != WL_CONNECTED)
  {
    WiFi.mode(WIFI_STA);
    WiFi.disconnect();
    WiFi.begin(STA_SSID, STA_PASSWORD);
    if (WiFi.status() == WL_CONNECTED)
    {
      WiFi.setAutoReconnect(true);
      WiFi.persistent(false);  // true = default, bei reboot werden ssid+pass in den Flash geschrieben, killt den freien Speicher!
  }
}

Eine bestehende Verbindung bleibt erhalten, sonst gibt es eine neue.

1 Like

Hallo,
Du könntest das übliche delay() und die while schleife durch eine Konstrukt aus millis () ind if ersezten .

sowas in der Art ungetestet

Wificonnect() {
  static uint32_t altzeit = 0;
  if (WiFi.status() != WL_CONNECTED) {
    if (millis() - altzeit > 500) {
      altzeit = millis();
      WiFi.persistent(false);   // daten nicht in EEprom
      WiFi.mode(WIFI_STA);
      WiFi.begin(ssid, password);
    }
  }
}

der Funktion könnte man einen Rückgabewert verpassen mit dem man den Status von ```
WL_CONNECTED nach aussen geben kann damit man weiß ob verbunden ist.

Heinz

1 Like

Erst mal: Danke!:hugs:

Werde ich mal alles durchtesten....:+1:

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.