T-PICOC3(MICROPYTHON)으로 온습도(SHT30) 테스트. (3)

 T-PICOC3(MICROPYTHON)으로 온습도(SHT30) 테스트. (3)


이전 포스트 에선 LCD 라이브러리를 이용해 예제 파일을 실행 시켜보았다.

일단 다른 main.py 파일을 만들어서 예제 소스를 복사 붙여넣기 한다음, 나에게 맞게 수정을 해봐야겠다. 그리고 나머지 출력 이나 버튼 입력등의 테스트를 진행해 볼생각이다.

아 그리고 파일을 main.py 로 생성후 pico 에 다운로드시 전원 입력되면 바로 실행이 된다.

자 일단 기본 LED 예제를 넣어서 테스트 해보자.

다운로드한 라이브러리 (1번째 포스트)폴더 내의 doc 폴더에 raspberry-pi-pico-python-sdk.pdf 파일이 있다. 

앞부분은 다 버리고 12page 부터 LED Blink 예제가 있다.

근데 그냥 키면 재미 없으니깐 타이머 예제를 활용해서 켜보자.

from machine import Pin, Timer 

led = Pin(25, Pin.OUT)
tim = Timer()
def tick(timer):
    global led
    led.toggle()

tim.init(freq=2.5, mode=Timer.PERIODIC, callback=tick)


machine 라이브러리는 마이크로 파이썬 에서 사용하는 하드웨어 제어 라이브러리다.

led 변수에 Pin 이란 인스턴스메소드를 할당시킨다. 그때 매개변수를 같이 넣고 led 란 변수는 machine.Pin(25,Pin.OUT) 으로 사용.

그리고 tim 변수에  Timer() 인스턴스메소드를 할당. 

def tick(timer): 로 메소드 정의후 아래에는 위에서 만든 led 를 글로벌변수로 사용하고 tick 이 불려질때마다 led.toggle() 로 LED 를 토글시킨다.


그리고 타이머 초기화는 맨아래 init 으로 초기화 하는데 , freq는 hz 로 위의 2.5hz 는 1초에 2.5번 이니 약 400ms, period 로도 시간을 설정 가능하고 period = 400 이런식으로 설정. 

근데 freq와 peroid 를 둘다 사용하면 freq 가 더 높은 우선순위를 갖는단다.

일단 난 ms 가 편하니. 1000ms 로 해서 1초 마다 키고 끄고를 해봐야겠다.

그리고 mode 는 Timer.ONE_SHOT / Timer.PERIODIC 2가지가 있는데 말그대로 한번만이냐 주기적으로 계속이냐의 차이인듯 싶다.

자세한내용은 여기 (마이크로 파이썬) 에서 확인 가능하다. 


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

tft = tft_config.config(1,0,0)
led = Pin(25,Pin.OUT)

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

def main():
    
    led.value(0)    
    tim = Timer()
    tim.init(mode=Timer.PERIODIC,period=1000, callback=tick)
   
    while(1): 
      
        utime.sleep(10)  
   
main()


전체 소스는 이렇고 다운로드 한후 실행 하거나 전원만 넣어줘도 동작한다.

아래는 영상


기본은 했으니 바로 i2c 로 sht 에 접근해보자.

접근전 sht 가 어떻게 동작하는지 알아야 한다.

datasheet를 확인해보자

인터넷에 많으니 확인해보고, i2c 도 사전에 동작방식이 어떻게 이루어 지는지도 같이 찾아서공부해보자.

일단 I2C 통신이 어떻다라고 다 설명하긴 힘드니 간단히 보자.

I2C 는 일단 2개의 선을 이용한 통신방식이다. 

원래는 I²C 가 맞다 Inter Intergrated Circut 으로 구글 번역기엔 상호 통합, 네이버 번역에선 일체화된 이라고 번역된다. 

이말은 즉슨 데이터 통신라인은 1개로 합쳐져 있다. 그런데 왜 2개의 선을 이용한 방식이냐,  하나는 데이터의 타이밍을 알기위한 동기화선으로 되어있다.

그래서 SDA (Serial Data) , SCL (Serial Clock) 로 나누어졌다.

뭐 여튼 저 2개의 선으로 한개의 마스터에 여러가지의 슬레이브들을 묶을수 있으며, 보통 슬레이브들은 주소값을 가지고 있어 마스터가 자료를 요청하거나 데이터를 입력할때 슬레이브의 주소를 포함한 통신데이터를 날려 그 주소를 가진 녀석만 반응하게 된다.

여튼 송수신을 동시에 할수 없고 이러한방식을 Half-duplex . 통신방식도 공부를 해두자 I2C를 atmel 에선 twi 라고 쓰기도 한다 two wire serial interface 였나?


여튼 i2c를 보면서 어떻게 동작하는지를 알았으니, 무슨 주소로 무슨값을 보내야 할지 알아보자.

일단 i2c address 값부터


어드레스 pin 에 vss ( - ) 연결되면 0x44 , vdd ( + ) 연결되면 0x45 란 주소값을 갖는단다.

일단 내 보드는 vss가 연결되어 있으니, 0x44

읽어야 할 곳의 레지스터 주소는 


위의 그림과 표를 보면 repeatability ( 반복성 ) , clock stretching 에 따라 레지스터 주소값이 달라진다.

일단 반복성에 따라 측정 오차가 줄어 들지만, 측정 시간이 길어지는것 같다.. 이러한 내용은  데이터 시트에 있다. 

여튼 난 높은 반복성과, clock stretching 을 사용 하는걸로 선택하고 일단 테스트 해봐야겠다.

clock stretching은 인터넷에 찾아 보자 . 공부 공부.

레지스터 msb 는 0x2c, lsb 는 0x06이다.

그리고 하드웨어가 잘 연결되어 있는지 확인 하기 위해 보통의 I2C 마스터 장치들은 연결되 있는 주변 기기들의 주소값을 확인할수 있다.

처음엔 주소값만 읽어보자.

i2c = I2C(0, scl=Pin(13), sda=Pin(12), freq=400000)
print(i2c.scan())

이전 소스에 이부분만 추가해서 돌려봤다. 

I2C 함수 원형은 classmachine.I2C(id*sclsdafreq=400000timeout=50000)

이녀석이다. 처음엔 아이디가 없어도 되겠지 하고 진행 했는데 안되더라. 그래서 ID 에 0값을 넣고 scl , sda 에 핀을 지정해 주고 freq 는 400khz 를 넣어주었다. 

그리고 실행하니


쉘 창에 68 이란 값이 나왔고. 이값은 10진수 값이고 16진수로 변환 하면 0x44 가 된다. 

이제 SHT30 과 연결이 잘되있다는걸 알았으니, 데이터를 읽어보자.


이번은 여기까지 하고 다음엔 위의 정보를 기반으로 온습도를 읽어 봐야겠다.

3탄 끝 다음글

댓글

이 블로그의 인기 게시물

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

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

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