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?
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);
}
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
}
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.
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
Erst mal: Danke!
Werde ich mal alles durchtesten....
This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.