Forum: Mikrocontroller und Digitale Elektronik ESP8266 LUA Verbindung zum Netzwerk


von Holger74 (Gast)


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?

von Herr M. (herrmueller)


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.

von Holger74 (Gast)


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

von Herr M. (herrmueller)


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.

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
Noch kein Account? Hier anmelden.