프로그래밍/Python

[python] LM73 TI 온도센서에서 온도값 읽어오기

채윤아빠 2024. 6. 10. 10:48
728x90
반응형

개요

LM73CIM 칩은 Texas Instruments에서 제조한 디지털 온도 센서입니다. I2C 인터페이스를 사용하여 Raspberry Pi나 다른 마이크로컨트롤러와 통신할 수 있습니다. 본 글에서는 라즈베리 파이에서 I2C로 LM73CIM 칩으로부터 온도값을 읽어오는 방법에 대하여 설명합니다.


라즈베리 파이 I2C 활성화하기

"raspi-config"를 이용하여 I2C를 활성화하거나, "/boot/firmware/config.txt" 파일에서 다음 설정 부분의 주석을 해제해 주어야 합니다.

dtparam=i2c_arm=on


"/boot/firmware/config.txt" 파일의 설정을 변경한 후, 라즈베리 파이를 재부팅 합니다.

재부팅한 이후에 "/dev" 폴더에 i2c 관련 장치가 표시됩니다.

$ ls /dev/i2c*
/dev/i2c-1  /dev/i2c-20  /dev/i2c-21


/etc/udev/rules.d/20-gpiomem.rules 파일을 다음과 같이 작성합니다.

SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660" 


I2C를 다루기 위하여 "i2c-tools" 패키지를 설치합니다. (참고 자료; https://hbesthee.tistory.com/2058)

$ sudo apt install i2c-tools


I2C 장비를 다음과 같이 검색합니다.

$ i2cdetect -y 1

     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- 4c -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- --                         


"4C"가 온도센서 입니다. 일반적으로 "48"이지만, LM73 칩의 address 선의 상태에 따라 주소 값은 달라질 수 있습니다.
참고로 "68"은 RTC입니다.


실제로 온도값을 읽어올 수 있는지 "i2cget" 명령을 이용하여 다음과 같이 시험해 볼 수 있습니다.

$ i2cget -y 1 0x4c 0 w
0x800f

파이썬으로 온도센서의 값 읽어오기

파이썬에서 I2C로 통신하기 위해서는 먼저 "smbus" 패키지를 설치해야만 합니다.

$ pip install -U smbus


아래는 Python을 사용하여 LM73 온도센서로부터 온도를 읽는 간단한 예제 코드입니다.

import smbus
import time

bus = smbus.SMBus(1) # I2C 버스 초기화
LM73_ADDR = 0x4C # LM73 I2C 주소

def read_temperature():
    # LM73칩의 온도 레지스터 읽기 (2바이트)
    temperatures = bus.read_i2c_block_data(LM73_ADDR, 0x00, 2)

    # 온도로 변환
    temp = ((temperatures[0] << 8)temperatures[1]) >> 3
    if temp & 0x1000: # 2의 보수 처리 (음수 온도)
        temp = temp - 8192

    # 온도 스케일 조정 (0.0625°C 단위)
    return temp * 0.0625

try:
    while True:
        temperature = read_temperature()
        print(f"Temperature: {temperature:.2f}°C")
        time.sleep(1)

except KeyboardInterrupt:
    print("Measurement stopped by user")
except Exception as e:
    print(f"An error occurred: {e}")
finally:
    bus.close()