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?
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.
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
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.