T-PICOC3(MICROPYTHON)으로 WIFI 를 연결해보자. (1)

 T-PICOC3(MICROPYTHON)으로 WIFI를 연결해보자. (1)


처음 T-PicoC3 를 받고 전원을 넣어보면 wifi 를 이용해 특정 ssid 에 연결하려는 시도가 보인다.

아무래도 초기 QC 에서 보드 테스트용으로 software를 올린듯 하다. 나도 이 와이파이를 이용해 현재 무선 인터넷을 사용해보자.

회로도를 보면  

t-picoc3 회로도
위는 RP2040 



t-picoc3 회로도

위는 ESP32-C3

TX , RX , CTS , RTS 가 연결되어 있는것을 알수 있다. 

그럼 바로 진행 하기 앞서 ESP32-C3의 UART 커맨드를 알기 위해 검색을 좀 해보니, User guide 사이트가 있다. ESP-AT User Guide 링크

저곳을 참고 하길 바란다. 기본 AT 커맨드로 진행 하고 wifi , bluetooth 관련 커맨드도 있다. 

내가 할건 WIFI 테스트를 할거니, 일단 기본으로 AT 라고 보내서 OK가 오는지 확인해 보자.

그러기 위해선 UART를 initialize 해줘야 한다. 

uart1 = UART(1, baudrate=115200, tx=Pin(8), rx=Pin(9))

Machine 라이브러리의 Uart 메소드를 uart1 이란 변수에 넣어주고 이녀석으로 사용한다.

맨앞은 스탑비트 1을 의미하고, 보레이트, tx, rx 핀등을 정의해준다.

그리고 나의경우 보통 통신 read는 스레드에서 처리하는데, micropython 의 스레드를 테스트 하던중, 너무 빡쳐서 포기하고 폴링방식으로 처리를 했다. 

한마디로 보내고 데이터 읽기 기다리고 데이터 수신 완료후 다음 순서로 진행하는 방식이다. 아직까진 테스트니깐 이러한 방식으로 일단 데이터 수신이 되는지 확인해봤다.

송신의 경우 앞에 만들어준 변수를 사용해 uart1.write("내용")

수신의 경우 buffer = uart1.read() 

방식인데. 처음에 

uart1.write("AT") 만 보냈는데 아무리해도 응답이 없어서, User Guide 를 한참 뒤지다가.. 아무리 해도 안되서 캐리지 리턴과 뉴라인피드 값을 같이 보내보니, 응답이 왔다. 

esp32-c3 test

그런데 내가 보낸 값을 같이 준다. ????  예전 이러한 블루투스나 와이파이 모듈등을 사용할 때 에코기능이라는 것이 있어서 (내가 보낸값을 포함해서 응답해주는 기능)  이녀석을 끄는 기능이 있을 것 같아 찾아 보니, 있다!! 

ATE0 or ATE1 이다.

그래서 처음에 ATE0 로 초기에 날려주고 그다음 AT 커맨드를 보내줘 보자, 그리고 지금은 테스트를 위해 while 문안에서 1초마다 uart1.read() 를 하고 있지만, 계속 멈춰있을수 없으니, 데이터를 취득하여 내가 원하는 데이터가 나오면 빠져나와 보자.

그리고 데이터가 바이트 형식이라 string 으로 decoding 후 str.find 로 찾을 문자열을 검색하여 데이터가 맞으면 while 문을 빠져나오게 진행 해봤다.

나중엔 타임아웃을 넣어서 일정 시간동안 데이터 수신이 안되면 빠져나오게 할예정.

아래엔 내가 보낸 값 및 응답값들에 대한 내용이다.


---> ATE0    // 에코 기능 off
OK

---> AT      // 그냥 AT 명령어 연결 확인용
OK

---> AT+CWMODE?   // 현재 모듈의 모드 확인 0(disabled) , 1(station) , 2(softap) , 3(both)  
+CWMODE:1

OK

---> AT+CWSTATE? // 현재 상태 2번은 현재 연결되있고 아이피 부여까지 받은것 같다. 
+CWSTATE:2,"MACLINE"

OK

---> AT_CWLAP // 현재 검색 된 내용, 각 수치들은 guide 에서 참조
+CWLAP:(3,"MACLINE",-42,"58:86:94:c4:e4:5a",1,-1,-1,4,4,7,0)
+CWLAP:(2,"MACLINE",-43,"00:26:66:be:0a:f4",1,-1,-1,4,4,7,1)
+CWLAP:(3,"AT_401_CST_570004_WW_3a8a",-63,"1c:39:29:49:3a:8a",11,-1,-1,4,4,7,1)
+CWLAP:(3,"AT_401_CST_570004_WW_3a53",-65,"1c:39:29:49:3a:53",11,-1,-1,4,4,7,1)
+CWLAP:(3,"홀프레츠",-66,"58:86:94:64:d0:ba",7,-1,-1,4,4,7,1)
+CWLAP:(3,"DAESEO",-67,"90:9f:33:66:a1:96",2,-1,-1,4,4,7,1)
+CWLAP:(3,"DIRECT-BC M208x Series",-68,"86:25:19:c5:2f:bc",1,-1,-1,4,4,6,0)
+CWLAP:(3,"",-69,"e2:ba:ad:40:5a:cd",8,-1,-1,4,4,3,0)
+CWLAP:(3,"[LG_CeilingCassette A/C]996c",-69,"1e:39:29:62:99:6c",11,-1,-1,4,4,7,1)
+CWLAP:(3,"L.gabe",-71,"58:86:94:64:f7:ce",3,-1,-1,4,4,7,1)
+CWLAP:(0,"iptime_setup",-72,"5a:86:94:65:f7:ce",3,-1,-1,0,0,7,0)
+CWLAP:(2,"",-75,"5a:86:94:64:f7:ce",3,-1,-1,4,4,7,0)
+CWLAP:(3,"enb",-77,"92:9f:33:c1:2f:f4",8,-1,-1,4,4,7,1)
+CWLAP:(3,"AT_401_CST_570004_WW_9a0e",-77,"1c:39:29:39:9a:0e",11,-1,-1,4,4,7,1)
+CWLAP:(3,"AT_401_CST_570004_WW_5813",-77,"1c:39:29:49:58:13",11,-1,-1,4,4,7,1)
+CWLAP:(3,"AT_401_CST_570004_WW_2ed6",-78,"1c:39:29:24:2e:d6",11,-1,-1,4,4,7,1)
+CWLAP:(3,"[LG_CeilingCassette A/C]7c75",-80,"1e:39:29:62:7c:75",11,-1,-1,4,4,7,1)
+CWLAP:(3,"[LG_CeilingCassette A/C]7c70",-80,"1e:39:29:62:7c:70",11,-1,-1,4,4,7,1)
+CWLAP:(3,"[LG_CeilingCassette A/C]ccfe",-81,"1e:39:29:62:cc:fe",11,-1,-1,4,4,7,1)
+CWLAP:(3,"[LG_CeilingCassette A/C]cf08",-82,"1e:39:29:62:cf:08",11,-1,-1,4,4,7,1)
+CWLAP:(3,"easyon",-85,"58:86:94:16:cc:d0",3,-1,-1,4,4,7,0)
+CWLAP:(4,"SK_WiFiGIGA692E_2.4G",-87,"0c:96:cd:bb:69:31",7,-1,-1,5,3,7,1)
+CWLAP:(3,"",-88,"12:96:cd:bb:69:31",7,-1,-1,4,4,7,0)
+CWLAP:(3,"bravity",-89,"72:5d:cc:ce:f8:10",8,-1,-1,4,4,7,0)

OK


5ghz지원이 안되다 보니 5ghz (ac , ax 등..) 쪽은 검색이 안되고 2.4ghz 대역만 검색하는것 같다. rssi 감도는 나쁘지 않은것 같다. 확실하진 않지만 대략 -50~60dbm 정도만 나와도 감도는 좋은 것으로 보인다.

아 그리고 한번 연결을 진행 하였더니, 전원 ON 시 자동으로 wifi가 연결된다.

autoconnection 이 활성화 되있는걸로 보인다. AT+CWAUTOCONN 명령어로 disalbe 가능한걸로 보인다. 일단 default 값이 1인 자동연결로 되어있다.

위의 AT 커맨드중 연결은 보여주지 않았지만, 

명령어는 AT+CWJAP="ssid","password" 로 연결이 가능하다. 

wifi 연결은 성공했으니, 다음엔 http get 명령어를 알아보고 현재 시간을 웹상에서 가져와봐야겠다~

여기까지의 소스내용은 아래와 같다.

import random
import utime
import st7789
import tft_config
import vga1_bold_16x32 as font1
import vga2_8x16 as font2
import machine
from machine import UART,Pin,Timer,ADC,I2C,PWM

tft = tft_config.config(1,0,0)
led = Pin(25,Pin.OUT)
i2c = I2C(0,scl=Pin(13), sda=Pin(12), freq=400000)
print(i2c.scan())
uart1 = UART(1, baudrate=115200, tx=Pin(8), rx=Pin(9))

def tick(timer):
    global buf           
    led.toggle()

def sht30_1():
    global i2c
    i2c.writeto(0x44,b'\x2C\x06')    
    data=i2c.readfrom(0x44,6)    
    c_temp = -45 + (175 * ((int(data[0]) * 256 + int(data[1])) / 65535.0))
    c_temp = "%.2f" % c_temp
    hum = 100 * ((int(data[3]) * 256 + int(data[4])) / 65535.0)
    hum = "%.2f" % hum
    #print(str(c_temp)+' '+str(hum))
    return c_temp, hum    

def text_write(text,line): 
    
    tft.text(
        font2,
        text,
        0,
        1+line*(font2.HEIGHT+1),
        st7789.WHITE,
        st7789.BLACK)

def Wifi_test():
    uart1.write("ATE0\r\n")
    AT_read()
    uart1.write("AT\r\n")
    AT_read()
    uart1.write("AT+CWMODE?\r\n")
    AT_read()
    uart1.write("AT+CWSTATE?\r\n")        
    AT_read()
    uart1.write("AT+CWLAP\r\n")
    AT_read()

def AT_read():
    
    ok_flag=True
    buf=""
    while ok_flag:
        
        try:
            buf += (uart1.read()).decode()            
        except Exception as e:
            pass
        
        if buf.find('OK') != -1:
            ok_flag= False
            print(buf)   
    
    
def main():
    
    led.value(0)    
    tim = Timer()
    tim.init(mode=Timer.PERIODIC,period=1000, callback=tick)
    
    tft.init()
    tft.fill(st7789.BLACK)
    
    Wifi_test()    
    
    while(1):
        
        C_temp, Hum = sht30_1()
        buffer_str = "Temp= "+str(C_temp)+", Hum= "+str(Hum)+" "
        text_write(buffer_str,0)
        utime.sleep(1)
   
   
main()


1탄 끝  다음글

댓글

이 블로그의 인기 게시물

Raspberry Pi pico W 로 시계 및 날씨 확인 제품을 만들어 보자. (1) 구상 단계

Raspberry Pi Pico W로 시계 및 날씨 확인 제품을 만들어 보자. (4) ws2812 test 및 WIFI 시간 테스트