Raspberry Pi로 온도 센서 모듈 ADT7410에서 데이터 획득

필요한 것


  • Raspberry Pi
  • Raspberry Pi 3 모델 B +를 사용하고 있습니다

  • 온도 센서 모듈 ADT7410
  • 아키즈키 전자에서 구입 가능 htp // 아키즈키덴시. 코 m/분 g/g/gM-06675/

  • 브레드 보드 및 점퍼 와이어
  • 땜납과 납땜 인두

  • 온도 센서 모듈 ADT7410 정보


  • 아날로그 디바이스의 온도를 얻을 수 있는 모듈
  • 동작/측정 온도는 -55~120℃
  • I2C 버스에 측정 온도 데이터 출력
  • 자세한 정보는 데이터시트를 참조
  • 영어: htps //w w. 아나 g. 코 m/메아아/엔/테 ch에인가 pdf
  • 한국어: htps //w w. 아나 g. 코 m/메아아/jp/테 ch에인가 l-도쿠멘들 온/다타-시에 ts/아 DT7420_jp. pdf


  • Raspberry Pi 준비



    사용중인 Raspberry Pi의 OS 버전은 다음과 같습니다.
    $ lsb_release -a
    No LSB modules are available.
    Distributor ID: Raspbian
    Description:    Raspbian GNU/Linux 10 (buster)
    Release:    10
    Codename:   buster
    

    I2C를 활성화합니다.
    $ sudo raspi-config
    -> 5 Interfacing Options
    --> P5 I2C
    

    위와 같이 CUI에서 configration에서 I2C를 활성화합니다.
    GUI에서 활성화하는 방법도 있습니다. 알고 싶은 분은 조사해 주세요.

    필요한 패키지를 설치합니다.
    $ sudo apt-get install i2c-tools libi2c-dev python-smbus
    

    온도 센서 모듈 준비와 Raspberry Pi와의 연결



    구입한 온도 센서 모듈 ADT7410은 핀이 없는 상태이므로 납땜합니다.




    브레드보드를 ​​사용하여 다음과 같이 GPIO와 모듈을 연결합니다.
    연결할 때 Raspberry Pi의 전원을 끄십시오.
  • ADT7410 (VDD) ⇔ GPIO2 (3.3V)
  • ADT7410 (SCL) ⇔ GPIO5 (SCL)
  • ADT7410 (SDA) ⇔ GPIO3 (SDA)
  • ADT7410 (GND) ⇔ GPIO6 (Ground)

  • (Raspberry Pi의 GPIO 핀아웃은 htps: // 피노우 t. xy · 등 참조)



    fritzing으로 배선도를 써 보았습니다.



    배선이 끝나면 Raspberry Pi를 시작하여 연결을 확인합니다.
    $ i2cdetect -y 1
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
    00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
    10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    40: -- -- -- -- -- -- -- -- 48 -- -- -- -- -- -- -- 
    50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
    70: -- -- -- -- -- -- -- -- 
    

    이런 식으로 "48"이 보이면 연결은 문제 없습니다.

    덧붙여 주소를 48에서 변경하고 싶은 경우는 ADT7410의 A0, A1을 납땜으로 쇼트 시키면 바꿀 수 있습니다.
    0이 오픈, 1을 쇼트한 상태로 하면,
  • A1-A0: 0-0 (0x48) 이번 상태
  • A1-A0: 0-1 (0x49)
  • A1-A0: 1-0 (0x4A)
  • A1-A0: 1-1 (0x4B)

  • 됩니다.
    여러 개 사용하는 경우 주소를 변경하여 사용합시다.

    그럼 접속을 할 수 있었으므로, 온도를 취득합시다.
    $ i2cget -y 1 0x48 0x00 w
    0xd00c
    

    0xd00c가 온도입니다, 라고 해도 의미를 모르겠네요.
    계산 방법은,
  • 0xd00c의 2바이트 전후를 바꾸어 0x0cd0
  • 0x0cd0 (0b110011010000)을 3 비트 오른쪽 시프트하여 0b110011010
  • 0b110011010을 16으로 나누고 10 진수로 나타내면 25.625.

    에서 구해, 25.625℃는 온도입니다.

    파이썬으로 프로그래밍하면 다음과 같이 보입니다.

    adt7410_13bit.py
    # -*- coding: utf-8 -*-
    import smbus
    
    bus = smbus.SMBus(1)
    address_adt7410 = 0x48
    register_adt7410 = 0x00
    configration_adt7410 = 0x03
    
    # 13bitに設定して読み出し
    bus.write_word_data(address_adt7410, configration_adt7410, 0x00)
    word_data = bus.read_word_data(address_adt7410, register_adt7410)
    
    # 2バイトの入れ替え
    data = (word_data & 0xff00) >> 8 | (word_data & 0xff) << 8
    
    # 3ビットの右シフト
    data = data >> 3
    
    # 16で割って温度に
    print(data/16.)
    

    16 비트로 읽으려면 레지스터의 구성 주소 0x03에 0x80을 씁니다.

    adt7410_16bit.py
    # -*- coding: utf-8 -*-
    import smbus
    
    bus = smbus.SMBus(1)
    address_adt7410 = 0x48
    register_adt7410 = 0x00
    configration_adt7410 = 0x03
    
    # 16bitに設定して読み出し
    bus.write_word_data(address_adt7410, configration_adt7410, 0x80)
    word_data = bus.read_word_data(address_adt7410, register_adt7410)
    
    # 2バイトの入れ替え
    data = (word_data & 0xff00) >> 8 | (word_data & 0xff) << 8
    
    # 128で割って温度に
    print(data/128.)
    

    각각 실행하면 온도를 얻을 수 있습니다.
    $ python adt7410_13bit.py
    27.125
    $ python adt7410_16bit.py
    26.7109375
    

    수치상은 13bit라면 0.0625℃, 16bit라면 0.0078℃의 resolution이 있다고 하는 것입니다만, 원래의 정밀도가 그렇게 있다고는 생각하지 않기 때문에, 개인적으로는 13bit로 충분하다고 생각합니다.
  • 좋은 웹페이지 즐겨찾기