[태그:] hts221

  • sensehat 온도 + LED matrix(2)

    sensehat 온도 + LED matrix(2)

    제한된 화면에 온도, 습도를 어떻게 표시할까 고민하다, 디바이스를 2개를 만들로 했다. 사용자가 디바이스 개수를 제한 없이 만들 수 있는 점이 좋다. 2개를 만들어 온도로 한 개, 습도로 한 개를 할당 했다.

    위 그림에서 사용자가 rs-tmpre1를 읽어(read) module이 저장한 HTS221 온도 관련 레지스터 값을 얻는다. 사용자가 받은 값으로 온도를 계산한 후 LED Matrix를 빨강으로 설정하고, 커널로 쓴다(write). 사용자가 rs-tempre2를 읽어(read) module이 저장한 HTS221 습도 관련 레지스터 값을 얻는다. 역시 받은 값으로 습도를 계산하고, LED Matrix를 녹색으로 설정, 커널로 쓴다(write). 사용자 프로그램이 일정 주기로 계속한다.

    LED Matrix가 숫자를 보여주는 방식이 너무 촌스럽다. 좀 개선해야 겠다.

    1. 부팅
    2. 내가 만든 모듈 로딩
    3. 사용자 프로그램 실행

    1 ~ 3번을 자동으로 하고 싶었다. 이게 좀 까다롭다. 처음에는 간단하게 crontab으로 @reboot로 설정했으나, 실패했다. 모듈이 올라가기 전에 사용자 프로그램이 실행된다. 찾던 중 udev가 이벤트를 감지(디바이스 추가, 삭제)하여 사용자 정의 행동을 한다고 알았다.

    udev에 등록하려면 디바이스 정보를 알아야 된다. 왜 class로 추가하는지 느꼈다. 인터넷 검색으로 다음과 같이 알아냈다.

    pi@raspberrypi:~ $ udevadm info /dev/rs-tmpre1
    P: /devices/virtual/rpi-sensehat/rs-tmpre1
    N: rs-tmpre1
    L: 0
    E: DEVPATH=/devices/virtual/rpi-sensehat/rs-tmpre1
    E: DEVNAME=/dev/rs-tmpre1
    E: DEVMODE=0666
    E: MAJOR=235
    E: MINOR=0
    E: SUBSYSTEM=rpi-sensehat
    
    pi@raspberrypi:~ $ udevadm info /dev/rs-tmpre2
    P: /devices/virtual/rpi-sensehat/rs-tmpre2
    N: rs-tmpre2
    L: 0
    E: DEVPATH=/devices/virtual/rpi-sensehat/rs-tmpre2
    E: DEVNAME=/dev/rs-tmpre2
    E: DEVMODE=0666
    E: MAJOR=235
    E: MINOR=1
    E: SUBSYSTEM=rpi-sensehat
    
    pi@raspberrypi:/dev $ udevadm info -a -n /dev/rs-tmpre1
    
    Udevadm info starts with the device specified by the devpath and then
    walks up the chain of parent devices. It prints for every device
    found, all possible attributes in the udev rules key format.
    A rule to match, can be composed by the attributes of the device
    and the attributes from one single parent device.
    
      looking at device '/devices/virtual/rpi-sensehat/rs-tmpre1':
        KERNEL=="rs-tmpre1"
        SUBSYSTEM=="rpi-sensehat"
        DRIVER==""
        ATTR{power/control}=="auto"
        ATTR{power/runtime_active_time}=="0"
        ATTR{power/runtime_status}=="unsupported"
        ATTR{power/runtime_suspended_time}=="0"

    아래 스크립트와 같이 사용자 정의 rules를 만들면 전원이 들어가면서 실행됨을 확인 했다.

    pi@raspberrypi:/etc/udev/rules.d $ pwd
    /etc/udev/rules.d
    pi@raspberrypi:/etc/udev/rules.d $ cat 100-sensehat.rules 
    ACTION=="add", SUBSYSTEM=="rpi-sense-tmpre", KERNEL=="rs-tmpre2", RUN+="/bin/sensehat_display"

    아쉽게도 udev로 등록한 프로세가 오래 못산다. 이벤트가 끝나면 process가 죽는다. systemctl로 서비스 형식으로 등록해야 한다. 참조하여 아래와 같이 설정했다. 잘 된다. 이제 LED matrix를 어떻게 해 봐야겠다.

    pi@raspberrypi:/etc/systemd/system $ cat sensehat_display.service 
    [Unit]
    Description=SenseHat Temperatur & Humidity Monitor
    
    [Service]
    Type=simple
    ExecStart=/usr/bin/sensehat_display
    
    [Install]
    https://github.com/now0930/sensehat_toy

    참조 사이트

  • sensehat 온도 + LED matrix(1)

    sensehat 온도 + LED matrix(1)

    온도를 LED Matrix에 표시하기

    나름 쓸만한 디바이스를 만들기 위해 온도계를 구상해 봤다. 지마켓에서 온도, 습도, 시각을 측정하는 디바이스를 5,400원에 구매할 수 있다. 라즈베리 파이 + sensehat = 120,000원 정도 하려나? 약 20배 비싸지만 인터넷에 연결되어 싸다고 세뇌시키고 있다. ^^! 그런데, sensehat에 있는 hts221이 보드에 붙어 있다. 실내 온도를 측정하지 않고 보드 온도를 측정 하고 있다.

    HTS221로 받은 온도를 LED matrix에 표시했다. 숫자를 바로 LED matrix에 표시할 수 없어, 각 숫자에 맞춰 8 * 8 * 3가지 색을 정의 해야 한다. 이게 참 시간을 잡아먹는다. 왜 frame buffer를 써야 되는지 알 만했다.

    기본 설정으로는 온도를 바로바로 측정할 수 없다. 02h 레지스터 ODR을 1Hz로 설정해야 바로 측정할 수 있다. 12.5Hz로 측정하면 왜 안되는지 잘 모르겠다.

    kernel에서 float 형식을 사용할 수 없다. 모든 데이터를 받아 사용자 영역에서 float 형식으로 온도를 계산해야 할 듯 하다. 지금은 user program이 led matrix를 써 주면 바로 표시하지만, timer나 workqueue를 추가하여 필요할 때 표시하게 수정할 것 이다. 아니면 습도도 받아 그래프로 표시하던가. 온도, 습도를 표시하려면 그래프가 좋아 보인다.

    코드

    참조 사이트

    https://github.com/ControlEverythingCommunity/HTS221/blob/master/C/HTS221.c

  • sensehat i2c hts221

    HTS221 temperature conversion

    데이터 시트에 수식을 정확하게 써야지, linear interpolation을 머 이리 어렵게 썼는지.. U가 or 같은데, 정확하게 어떤 의미로 썼는지 모르겠다.

    하. T0_DegC, T_DegC, T1_DegC, T0_OUT, T_OUT, T1_OUT을 모두 확인 한 후에 위 그래프로 알아서 구하라는 말이었다. 미친!!!

    위 식대로 하면 172도를 볼 수 있다. stack overflow에 있듯이 T0_degC, T1_degC가 10비트임을 인식해야 한다. T0T1MSB에 있는 나머지 2비트를 읽어 내야 한다. datasheet를 보통 이렇게 쓰는지, 너무 불친절하다.

    위 그림 Step1은 결국 10비트를 만들어서 8로 나누란 말이다. 두 값으로 interpolation 하여 구하란 의미다. 이걸 누가 알아 듣냐고!! 대략 아래 코드로 온도를 알아낼 수 있다. 대략 25도 나오는데, 맞는 듯 하다.

    https://github.com/now0930/sensehat_toy

    참조 사이트