ESP8266 LUA Verbindung zum Netzwerk

Gast #4414949
Lesenswert?

Dieses kleine Skript soll den ESP8266 mit meinem WLAN-Netzwerk 
verbinden:

-- init.lua

print("\nStart...")

 ssid= "     "
 passw= "     "

    print ("vorher:",wifi.sta.status())


    wifi.setmode(wifi.STATION)
    wifi.sta.config(ssid,passw)
    tmr.delay(1000000)


    print ("nachher:",wifi.sta.status())


Es funktioniert auch, allerdings nur nach dem ich das Skript übertragen 
habe,
kommt als Status 5(verbunden).

Wenn ich jetzt ein Reset mache oder das Modul vom Strom nehme und dann 
wieder in Betrieb, kommt als Meldung Status 1 (Verbindungsaufbau).

Was kann ich machen, dass das Modul nach einem Reset, sich wieder mit 
dem Netzwerk verbindet?
#4415545
Lesenswert?

tmr.delay() ist nur für sehr kleine Verzögerungen sinvoll, weil es 
während der 'Wartezeit' den kompletten Controller blockiert. Das heisst, 
es wird in der Zeit auch keine Verbindung aufgebaut und nach längeren 
Warezeiten wird dann sogar der Watchdog Reset ausgelöst.

Du musst mit tmr.alarm in Abständen den Wifi Status prüfen. zB:

WifiStatus={
[0]="STATION_IDLE",
[1]="STATION_CONNECTING",
[2]="STATION_WRONG_PASSWORD",
[3]="STATION_NO_AP_FOUND",
[4]="STATION_CONNECT_FAIL",
[5]="STATION_GOT_IP",}

wifi.setmode(wifi.STATION)
wifi.sta.config("xxxSSIDxx", "xxPWxx")
wifi.sta.connect()

tmr.alarm(0, 500, 1, function()
   if wifi.sta.getip()==nil then
    print("conn. to AP ".." Status: "..(WifiStatus[wifi.sta.status()]))

   else
      tmr.stop(0)

       print ("Verbunden mit IP "..wifi.sta.getip().." Status: 
"..(WifiStatus[wifi.sta.status()]))
----------- programm
--dofile("xxxx.lua")


-----------
   end
end)


Normalerweise merkt sich aber der ESP8266 die Verbindung und stellt sie 
beim Start automatisch wieder her.
Gast #4415735
Lesenswert?

Vielen Dank, Herr Müller.

So sah ähnlich sah meine Lösung dann auch aus:

x= 1
warten= 0

print("\nStart...")

function tmr0Routine()
 local cStatus= wifi.sta.status()
 print (warten, " : ",cStatus)
 warten = warten + 1
 if cStatus ~= 1 then
  x= 0
  tmr.stop(0)
 end
end

--function connectWLAN(modus)
 ssid= " "
 passw= " "

    print ("vorher:",wifi.sta.status())

     wifi.setmode(wifi.STATION)
     wifi.sta.config(ssid,passw)
     print ("connect...");


    print ("nachher:",wifi.sta.status())

tmr.alarm(0,1000,1,tmr0Routine)

-- Wie kann man hier an der Stelle warten, bis die
   Verbindung hergestellt ist?

   Wie du sagst tmr.delay() blockiert alles.

   " while (x== 1) do

     end "   führt zu einem ständigen Neustart
#4416848
Lesenswert?

Holger74 schrieb:
> while (x== 1) do
>
>      end "   führt zu einem ständigen Neustart

Bei deiner Endlosschleife (oder länger als ein paar Sekunden) wird der 
Watchdog aktiv und macht einen Reset, deshalb Neustart.

Auch das Ausführen von Programmcode blockiert den WIFI Aufbau im 
'Hintergrund' :-(

Deswegen funktioniert der WIFI Aufbau nur, wenn das Lua Programm 
'fertig' ist. Der tmr.alarm wird über Interrupt gesteuert, so das er das 
WIFI nicht stört, was sich dann in den Timerpausen verbinden kann.

So muss man etwas seltsam programmieren und das Hauptprogramm innerhalb 
der tmr.alarm Funktion starten - nach dem (positiven) Status Vergleich, 
der ja zyklisch alle paar 100ms aufgerufen wird, während das Lua 
Programm schon fertig ist. Ist sehr gewöhnungsbedürftig - klappt aber.

Um es übersichtlicher zu machen, kann man das Hauptprogramm ja in eine 
eigene Datei schreiben und mit dofile xxx.lua starten.

Bei meinem obigen Beispiel ist die Timerfunktion nicht extra definiert 
(tmr0Routine), sondern mit function() if .. then .. else ..  end() 
direkt hintendran geschrieben. Die wird nur vom Timer aufgerufen, so wie 
deine tmr0Routine.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren