본문 바로가기
Study/ESP8266(WIFI),ESP32(BLE,WIFI)

AP모드-STATION모드 전환(nodeMCU using Lua)

by Answer Choi 2015. 12. 17.
반응형

소스코드 다운받기


NodeMCU에서는 간단한 명령어로 AP모드와 STATION 모드를 전환할 수 있습니다.


먼저 결선도입니다.


<위 그림에서 버튼과 LED 가 서로 바뀌었습니다 ㅠ>



D6 : STA Btn

D7 : AP Btn

D1 : STA LED

D2 : AP LED


버튼을 누르면 모드가 변환되고 LED가 켜집니다.


소스코드를 모두 함수화 시켰습니다.


전원이 켜지면 


1
2
init()
readbutton()
cs


이 코드가 실행됩니다.


Line 1 : 초기화와 현재 모드의 상태를 읽어 동작을 시킵니다.


Line 2 : button을 읽는 작업을 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function init()    
 
    gpio.mode(1,gpio.OUTPUT,gpio.PULLUP)
    gpio.mode(2,gpio.OUTPUT,gpio.PULLUP)
    gpio.mode(6,gpio.INPUT,gpio.PULLUP)
    gpio.mode(7,gpio.INPUT,gpio.PULLUP)
    gpio.write(1,gpio.LOW)
    gpio.write(2,gpio.LOW)
    if(wifi.getmode()==wifi.STATION)then
        print("already station mode")
        wifistation()
    else 
         print("start ap mode")
         wifiap()    
    end
 
end
cs


초기화 함수입니다.


Line 3~6 : GPIO 1과 2는 LED이므로 output으로 GPIO 6과 7은 Btn이므로 input으로 설정했습니다.


Line 7~8 : LED 초기값은 Low로 꺼져있습니다.


Line 9~15 : 현재의 모드값을 읽어 Station mode이면 station mode 동작을 AP mode이면 AP mode로 동작 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function readbutton()
   
   tmr.alarm(0,1000,1,function()
       key1=gpio.read(6)
       if(key1==0)then
            if(wifi.getmode()~=wifi.STATION)then
                print("change station mode")
                wifistation()
            end
       end
       key2=gpio.read(7)
       if(key2==0)then
            if(wifi.getmode()~=wifi.SOFTAP)then
                print("change ap mode")
                wifiap()
            end
       end     
   end)
 
end
cs


버튼입력 함수 입니다.


버튼은 어떻게 처리할까 하다가 1초마다 한 포트씩 읽어서 실행하도록 했습니다.


어차피 빠르게 계속해서 읽는 것도 아니니...;;


Line 4~10 : 버튼 1이 읽어지면 STATION mode로 실행합니다.


Line 11~17 : 버튼 2가 읽어지면 AP mode를 실행합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
function wifistation()
    wifi.setmode(wifi.STATION)
    tmr.alarm(220001, function() 
         
        if(wifi.getmode()~=wifi.STATION)then
        print("waiting station mode")
        wifi.setmode(wifi.STATION)
        else
        connecting()
        
        end
    end )
end
cs


STA mode 함수


Line 2 : station mode로 설정합니다.


Line 3~12 : 곧바로 station mode로 전환이 안되어 타이머를 사용하여 기다리도록 했습니다.


Line 9 : station mode가 되면 AP에 접속합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function connecting()
    tmr.stop(2)
    wifi.sta.config("JEONGMIN2.4","jmc15201520")
    wifi.sta.connect()
    print("connecting ap")
    if(wifi.sta.status()~=5)then
        tmr.alarm(2,2000,1,function()
            print("fail to getting ip ")
            if(wifi.sta.status()==5)then
                connectserver()
                end
        end)
    else     
        connectserver()     
        
    end
 
end
cs


AP접속 함수입니다.


Line 2 : 이전 타이머를 종료합니다.


Line 3~4 : AP의 정보를 입력하고 접속을 시도합니다.


Line 6~12 : 만약 AP에 접속이 안되면 접속이 되기를 기다려 서버에 접속합니다. 약 5초정도 걸리는 것 같습니다.


Line 13~16 : 접속이 된다면 서버에 접속을 시도합니다.


1
2
3
4
5
6
7
8
9
10
11
function connectserver()
    tmr.stop(2)
    led(wifi.getmode())
    print("connecting server")
    socket=net.createConnection(net.TCP, 0)
    socket:connect(4000,"192.168.0.101")
    socket:on("receive",function(sck, c)  print(c) end)
    socket:send("hello world!!")
    print("connected")
 
end
cs


SERVER접속 함수 입니다.


Line 2 : 접속이 되면 마찬가지로 이전 타이머를 종료합니다.


Line 3 : STATION mode LED를 켜줍니다.


Line 5~8 : 서버정보를 넣어주고 접속합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function wifiap()
    wifi.setmode(wifi.SOFTAP)
    tmr.alarm(220001, function() 
         
        if(wifi.getmode()~=wifi.SOFTAP)then
            print("waiting AP mode")
            wifi.setmode(wifi.SOFTAP)
        else
            print("changed AP mode")
            wifibroadcasting()
            
        end
    end )
    
end
cs


AP모드 접속 함수입니다.


Line 2 : AP mode로 설정합니다.


Line 3~13 : 타이머로 AP모드로 설정 되기를 기다립니다.


Line 10 : AP모드로 설정이 되면 브로트캐스팅 준비를 합니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function wifibroadcasting()
    tmr.stop(2)
    mac=wifi.ap.getmac()
        
    cfg={}
    cfg.ssid=mac
    wifi.ap.config(cfg)
    
    cfg2 ={}
    cfg2.ip="10.10.1.1"
    cfg2.netmask="255.255.255.0"
    cfg2.gateway="10.10.1.1"
    
    wifi.ap.setip(cfg2)
   
    bc = wifi.ap.getbroadcast()
    print("broadcasting! "..bc)
    
    led(wifi.getmode())
 
end
cs


AP모드 브로드캐스팅 함수 입니다.


Line 2 : 이전 타이머를 종료시킵니다.


Line 3 : mac 주소 값을 읽어옵니다.


Line 5~7 : AP의 정보를 입력합니다.(SSID는 mac주소로)


Line 9~12 : AP의 IP주소등을 설정합니다.


Line 16 : 브로드캐스팅을 시작합니다.


Line 19 : AP모드 LED를 켜줍니다.




AP모드로 정상적으로 작동 하였습니다.










반응형

인기글