티스토리 뷰
개요
1) 기본적인 센서 측정 동작을 둘러보고, 개념을 이해한다.
2) interrupt 를 제대로 작동하는지, 놓치는 경우는 없는지 확인한다.
참고사항
- 이전 포스팅들과 중복되는 부분이 있겠지만 참고할 부분들을 적어본다.
참고1. 센서와 라즈베리파이 연결
PPD42NS 센서 |
라즈베리파이 3B |
1번 (GND) |
아래그림 6번 GND |
3번 (5V) |
아래그램 2번 또는 4번 5V |
2번 (Output PM25) |
아래그림 3번 GPIO 2 |
4번 (Output PM10) |
아래그림 7번 GPIO 4 |
참고2. Base code (GitHub)
- 링크: https://github.com/mauricecyril/pidustsensor/blob/master/pidustsensor.py
참고3. pigpio 실행시키기
$sudo pigpiod |
- 기본적인 GPIO 컨트롤을 위해서 pigpio demon 을 우선 실행해주어야 한다.
- 이후 Python program 은 localhost의 pigpio daemon 과 통신하며 GPIO 를 제어한다.
- 링크: https://www.raspberrypi.org/forums/viewtopic.php?t=103752
참고4. rmate 로 원격 프로그래밍을 하려 할때에 소스코드가 vscode 에 뜨지 않는다면?
1) netstat 찍어보기
sudo netstat -plant | grep 52698 |
2) 프로세스 12418 이 포트를 잡고 있다.
위 netstat 명령의 의미를 알아보는 것은 생략하고 아무튼 52698 포트를 12418 프로세스가 잡고 있는게 보인다.
3) 이것만 삭제해버리면 정상동작한다. 그리고 라즈베리파이에 재접속하면 된다.
sudo kill -9 12418 |
본격 코드 리뷰
하나씩 정리된 코드는 아래 링크의 깃헙에 올리겠음
- GitHub 링크: https://github.com/nicewook/dustsensor_public/blob/master/ds_test1.py
프로그램의 시작
|
1) 파일명은 ds_test1.py 이다. - ds 는 dust sensor 를 의미한다.
2) pigpio.pi('localhost') - pigpio deamon 과 연결하고 - 명령을 보내거나 노티를 받기위한 리소스를 리턴받아 놓는다.
3) sensor class 의 인스턴스를 생성한다. - 하나는 PM1.0 측정을 위한 GPIO 4 핀 - 또 하나는 PM2.5 측정을 위한 GPIO 2핀을 파라미터도 전달하여 생성한다. → 바로 아래에 클래스 생성시의 동작을 설명하겠음 |
||||||||||||
|
파이썬에서 class 의 인스턴스를 생성하면 __init__ 함수가 실행된다. - 생성자라고 생각하면 된다.
1) self.pi 와 self.gpio - pigpio 리소스를 계속 사용하도록 self.pi 에 저장해둔다 - gpio 핀 번호도 self.gpio 에 저장해둔다.
2) LPO Time 측정을 위한 변수들 - tick 은 32bit 의 microsecond 값이며, 대략 72 분마다 overflow 되어 다시 0이 된다. - level 은 센서의 출력값이 1인지 0인지를 말해준다.
3) 측정 및 측정시 참고 값들을 저장할 변수들
4) set_mode() 와 callback() - 센서로부터의 값을 읽어들이므로 해당 핀을 pigpio.INPUT 으로 모드설정 - 해당 핀이 Low to High, High to Low 로 바뀌는 경우 모두에 대해 (= pigpio.EITHER_EDGE) 이벤트 발생시 처리할 callback function 인 self._cbf 함수를 설정해둠 |
초기화가 되고 나면, 측정을 시작한다.
1) 측정 시작 - 30초 대기 - 측정 종료 - measureStart() - sleep() - measureStop()
2) 측정값 읽기 - read()
3) 측정값 출력으로 되어 있다.
참고1. 1114000.62 는 센서값의 오류가 발생시 나오는 값이다. 참고2. 30초만에 동시에 두 출력값을 측정하는 것과, 각각 30초씩 측정하는 값을 비교하는 코드가 더 있지만, 여기 설명에선 생략한다. |
|
측정 시작과 측정 종료
- base code 링크: https://github.com/mauricecyril/pidustsensor/blob/master/pidustsensor.py
|
베이스 코드는 두 가지 문제가 있다고 보았다.
1) 측정을 시작해도 첫번째 인터럽트가 발생해야 진짜 측정이 시작됨
2) 만약 마지막 인터럽트 후 측정 종료시까지 인터럽트가 없으면 반영이 안됨
이 부분을 개선하기 위해 measureStart(), measureStop() 함수를 추가하였음
1) 시작하자 마자 self._start_tick, self._last_tick 을 업데이트 하였고 self._last_level 도 업데이트 하였음
2) 종료시에에도 마찬가지 작업을 해주어서 self._low_ticks, self._high_ticks 에 마지막 상태의 tick 소요시간을 더해 주었다.
|
측정값 읽어오기
|
내용은 별 것이 없다.
1) 전체 소요시간인 interval 을 계산한 다음
2) LPO Time 을 퍼센티지로 계산하였다. (ratio)
3) 이를 바탕으로 공식에 따라 concentration 값을 계산하였는데 - 이는 LPO Time 을 통해 먼지개수/0.01 ft3 를 통계적으로 유추한 값이다. - 즉, LPO Time 이 ratio 만큼이면 0.01 ft3 공간에 몇 개의 먼지가 있을 것인가 계산
4) 그리고 전체 인터럽트 개수와, 잘못된 인터럽트 발생개수 까지 포함하여 리턴
|
실행 결과 참고
1) 잘못된 인터럽트는 전혀 없으며 (Pigpio 짱짱맨)
2) PM1.0 측정 개수는 PM2.5 의 개수까지 포함된 것이니 빼주는게 맞겠지만 큰 차이는 없어 보인다.
삽질의 기록
- 이 부분은 안 읽어도 됨
1) Base code 에서는 예를 들어 ds_test1.py 파일에 class sensor 가 있다 하면 2) main 에서 import app 을 해주고, s10 = ds_test1.sensor(pi, 4) 로 인스턴스를 생성하는 코드였음.
3) 이런 저런 테스트를 하다보니 복사해서 작업을 하는데 미처 이부분을 고치지 않았던게 삽질의 원인이었음 - 즉, ds_test1.sensor(pi, 4) 라고 해야 하는데 - ds.py 를 import 하여 ds.sensor(pi, 4) 라고 된 것 |
'embedded' 카테고리의 다른 글
미세먼지 토이 프로젝트 - Firestore 에 올리기 (0) | 2019.04.23 |
---|---|
미세먼지 토이 프로젝트 - ug/m3 와 aqi 계산 (0) | 2019.04.15 |
미세먼지 토이 프로젝트 - 센서 원리와 측정단위 변환법 (1) | 2019.04.04 |
미세먼지 토이 프로젝트 - 센서 선정 및 라즈베리파이 연결 (1) | 2019.04.03 |
Edit and Execute code in Raspberry Pi from Visual Studio Code in my computer (0) | 2019.03.20 |
- Total
- Today
- Yesterday
- go
- clean agile
- 티스토리챌린지
- Bug
- intellij
- 독서
- API
- 2023
- ChatGPT
- bun
- 영화
- 독서후기
- 잡학툰
- notion
- agile
- 오블완
- Gin
- 클린 애자일
- github
- folklore
- 2024년
- websocket
- 체호프
- solid
- 노션
- 인텔리제이
- 엉클 밥
- strange
- OpenAI
- golang
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |