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.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.