개발제품에 센서는 빠지지 않는 요소 중 하나다. 단순 gpio로 이루어진 스위치나 온습도 센서, 거리센서 등 다양한 센서가 있다. 개발자는 센서값에 따라 계획한 동작을 처리하면 된다.
다만.. 센서의 성능과 노이즈에 따라 입력된, 수집된 값을 하나만 보고 즉각 동작하는 건 굉장히 위험하다. 비싸고 노이즈 없는 센서라면 괜찮지만 우리(?)가 마주하는 센서는 회사에 이익에 의해 도입된 저렴한 센서이기 때문이다. 그래서 하드웨어팀은 우리에게 소프트웨어로 뒤처리를 맡긴다. 저렴한 센서가 뭐가 문제냐하면 값이 튄다. 정말 튄다..
예를 들면 온도센서인 경우 온도가 현재온도에서 +-5도씩 나오는 경우도 있다.
이런 경우는 몇 개의 데이터를 수집한 뒤, 평균으로 처리한다. 그러면 마구 피크치는 데이터가 아닌 안정적인 값으로 계산할 수 있는 것이다.
여기까지가 일반적인, 정상적인 케이스이고...
진짜 테무에서 산 센서인 경우 갑자기 비정상 데이터가 나오는 경우도 있다. 일반적인 피트 범위를 넘는 100도 넘게 데이터가 갑자키 튀어나온다던가..
이런 경우는 평균을 구해도 어정쩡한 온도가 나온다. 9번 동안 10도가 나왔는데 100도가 나오면 평균 10도가 아닌 19도이다. 평균 약 2배의 값이 되는 것이다.
이런 경우에는 평균을 하면 안 되고 중앙값으로 처리해야 한다. 흔히 보던 그래프는 아래와 같다.
중앙값 처리를 하려면 머릿속으로
입력된 데이터를 배열에 넣고 값을 비교해서 큰 값을 빼고 평균을 해야 하나?
큰 값 기준은 어떻게 하지?
피크를 어떻게 구하지?
하고 복잡하게 생각하고 하는데 사실 저 그래프대로 정리만 하면 된다. 먼저 배열에 데이터를 저장을 하고 오름차순으로 정리를 진행한다. 그다음 배열 중간위치의 인덱스에 있는 값이 바로 중앙값이 된다. 배열이 홀수인덱스라면 중간값 좌우의 값을 평균해서 하면 된다.
아까 온도 10도 주변값이 9개 나오고 1개가 100도인 경우는 char array [10] ={10,11,12,10,9,10,100,9,10,9} 값을 오름차순으로 바꿔본다.
char array [10] ={9,9,9,10,10,10,10,11,12,100}이 된다. 여기서 areay [4]의 값 10이 중앙값이 된다. 이 배열을 그래프로 그리면 위처럼 나오니 확인해도 된다.
'개발이야기' 카테고리의 다른 글
Orange Pi 3B 기가 이더넷 동작 안함 !! (1) | 2024.10.14 |
---|---|
[QT] 개발하면서 팁 정리 (0) | 2024.08.28 |
[안드로이드] slf4j + logback로 로그파일과 logcat 출력하기 (0) | 2024.08.26 |
[MFC] 시리얼통신 간단하게 구현하기 (0) | 2024.08.18 |
[STM32+ADC+DMA] 정리 #1 (0) | 2024.08.17 |