제한된 화면에 온도, 습도를 어떻게 표시할까 고민하다, 디바이스를 2개를 만들로 했다. 사용자가 디바이스 개수를 제한 없이 만들 수 있는 점이 좋다. 2개를 만들어 온도로 한 개, 습도로 한 개를 할당 했다.
위 그림에서 사용자가 rs-tmpre1를 읽어(read) module이 저장한 HTS221 온도 관련 레지스터 값을 얻는다. 사용자가 받은 값으로 온도를 계산한 후 LED Matrix를 빨강으로 설정하고, 커널로 쓴다(write). 사용자가 rs-tempre2를 읽어(read) module이 저장한 HTS221 습도 관련 레지스터 값을 얻는다. 역시 받은 값으로 습도를 계산하고, LED Matrix를 녹색으로 설정, 커널로 쓴다(write). 사용자 프로그램이 일정 주기로 계속한다.
LED Matrix가 숫자를 보여주는 방식이 너무 촌스럽다. 좀 개선해야 겠다.
- 부팅
- 내가 만든 모듈 로딩
- 사용자 프로그램 실행
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]
참조 사이트