Skip to content

Instantly share code, notes, and snippets.

@jimoconnell
Last active February 12, 2017 21:05
Show Gist options
  • Star 4 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save jimoconnell/39ea6673aa25e04fcd6b to your computer and use it in GitHub Desktop.
Save jimoconnell/39ea6673aa25e04fcd6b to your computer and use it in GitHub Desktop.
Code by HoracioBouzas, formatted for use with ESPlorer
--http://www.instructables.com/id/ESP8266-based-web-configurable-wifi-general-purpos-1/
--Code by HoracioBouzas, formatted for use with ESPlorer by jimoconnell
print("WIFI control");
-- put module in AP mode
wifi.setmode(wifi.SOFTAP);
print("ESP8266 mode is: " .. wifi.getmode());
cfg={};
-- Set the SSID of the module in AP mode and access password
cfg.ssid="ESP8266";
cfg.pwd="passwordpassword";
if ssid and password then
print("ESP8266 SSID is: " .. cfg.ssid .. " and PASSWORD is: " .. cfg.password);
end;
-- Now you should see an SSID wireless router named ESP_STATION when you scan for available WIFI networks
-- Lets connect to the module from a computer of mobile device. So, find the SSID and connect using the password selected
wifi.ap.config(cfg);
ap_mac = wifi.ap.getmac();
-- create a server on port 80 and wait for a connection, when a connection is coming in function c will be executed
sv=net.createServer(net.TCP,30);
sv:listen(80,function(c)
c:on("receive", function(c, pl)
-- print the payload pl received from the connection
print(pl);
print(string.len(pl));
-- wait until SSID comes back and parse the SSID and the password
print(string.match(pl,"GET"));
ssid_start,ssid_end=string.find(pl,"SSID=");
if ssid_start and ssid_end then
amper1_start, amper1_end =string.find(pl,"&", ssid_end+1);
if amper1_start and amper1_end then
http_start, http_end =string.find(pl,"HTTP/1.1", ssid_end+1);
if http_start and http_end then
ssid=string.sub(pl,ssid_end+1, amper1_start-1);
password=string.sub(pl,amper1_end+10, http_start-2);
print("ESP8266 connecting to SSID: " .. ssid .. " with PASSWORD: " .. password);
if ssid and password then
sv:close();
-- close the server and set the module to STATION mode
wifi.setmode(wifi.STATIONAP);
print("ESP8266 mode now is: " .. wifi.getmode());
-- configure the module wso it can connect to the network using the received SSID and password
wifi.sta.config(ssid,password);
print("Setting up ESP8266 for station mode…Please wait.");
--tmr.delay(10000000);
--print("ESP8266 STATION IP now is: " .. wifi.sta.getip());
--print("ESP8266 AP IP now is: " .. wifi.ap.getip());
-- now the module is configured and connected to the network so lets start setting things up for the control logic
gpio.mode(8,gpio.OUTPUT);
gpio.mode(9,gpio.OUTPUT);
tmr.delay(10) ;
gpio.write(8,gpio.HIGH);
tmr.delay(10);
gpio.write(8,gpio.LOW);
sv=net.createServer(net.TCP, 30) ;
sv:listen(9999,function(c)
c:on("receive", function(c, pl)
if tonumber(pl) ~= nil then
if tonumber(pl) >= 1 and tonumber(pl) <= 16 then
print(tonumber(pl));
tmr.delay(10);
gpio.write(8,gpio.HIGH);
tmr.delay(10);
gpio.write(8,gpio.LOW);
for count =1,tonumber(pl) do
print(count);
tmr.delay(10) ;
gpio.write(9,gpio.LOW);
tmr.delay(10);
gpio.write(9,gpio.HIGH);
c:send("Sequence finished") ;
end;
end;
end;
--print("ESP8266 STATION IP now is: " .. new_ip);
--c:send("ESP8266 STATION IP now is: " .. new_ip) ;
c:send("Action completed") ;
end);
end);
end;
end;
end;
end;
-- this is the web page that requests the SSID and password from the user
c:send("<!DOCTYPE html> ")
c:send("<html> ")
c:send("<body> ")
c:send("<h1>ESP8266 Wireless control setup</h1>")
mac_mess1 = "The module MAC address is: " .. ap_mac
mac_mess2 = "You will need this MAC address to find the IP address of the module, please take note of it."
c:send("<h2>" .. mac_mess1 .. "</h2>")
c:send("<h2>" .. mac_mess2 .. "</h2>")
c:send("<h2>Enter SSID and Password for your WIFI router</h2>")
c:send("</form> </html>")
c:send("<form action='' method='get'>")
c:send("SSID:")
c:send("<input type='text' name='SSID' value='' maxlength='100'/>")
c:send("<br/>")
c:send("Password:")
c:send("<input type='text' name='Password' value='' maxlength='100'/>")
c:send("<input type='submit' value='Submit' />")
end);
end);
@Gerriko
Copy link

Gerriko commented Aug 20, 2015

Brilliant! Just what I was planning to do, so your code is potentially a great time saver... Cool, thanks.

@osamaelemam
Copy link

I tried it, I doesn't close the server and set the module to STATION mode
wifi.sta.getip() always gets "nil"
I am pretty sure if my network SSID and password

@vishalishere
Copy link

the code is not correct..

@hbouzas
Copy link

hbouzas commented Jul 2, 2016

Code works. Just add a close server on whatever event you want. You don't need to put the device in station mode, it can be AP and Station.

@nayivo
Copy link

nayivo commented Feb 12, 2017

how can be the port 80 changed for 88 port?
thanks

@nayivo
Copy link

nayivo commented Feb 12, 2017

sv:listen(80,function(c)
sv:listen(88,function(c)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment