티스토리 뷰
(1) 계획
현재 문의 개폐 상태를 알기 위해선 어떻게 해야 할 지 고민을 해보았다.
1. 자이로센서를 통해 문의 흔들림이 감지되면 열린 것으로 간주한다!
2. 초음파/적외선 센서를 통해 거리를 측정하여 감지한다!
3. 조도센서를 통해 문 앞 센서등의 불빛을 감지한다!
이 정도 생각을 해보았다.
그 중 2번 아이디어로 진행하기로 하였고!
비교적 단거리 측정에 정확한 초음파 센서를 이용하기로 했다.
이렇게 생긴 센서인데, 2개의 동그란 부분 중 한 곳에서 초음파를 쏘고, 다른 한 곳에서 초음파를 감지하는 역할을 한다.
쏘고 받는데 걸리는 시간으로 거리를 측정하는 방식이다.
일단 거리가 10cm 이상이 될 시 문이 열렸다고 판단한다.
단, 1000cm가 넘어가는 값이 나오면 무의미한 값으로 인식하고 값을 갱신하지 않는다.
이런 방식으로 구현할 계획이다.
2. 구현
일단 센서 값이 잘 반응하는 지 확인해야 한다.
센서 값에 따라 측정된 거리가 10cm이상이 되면 앱의 LED가 점등되어 열림을 알린다.
일단 모드링크에 연결을 하고 간단하게 센서 값 체크를 해봤는데, 값이 많이 튀고 무의미한 값이 많이 나오는 것 같다.
방법을 모색하던 중...
모드링크의 와이파이 모듈의 통신 interval이 200으로 설정되어있다는 점을 고려했을 때
내 코드는 센서 값을 1ms마다 측정하는데, 이러한 과정이 의미가 없다는 생각이 들었다.
그래서 1ms * 100 = 100ms 임을 이용하여 100개의 표본 센서값을 누적한 다음, 평균값을 내어 갱신하는 방식을 생각해봤다.
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 29 30 31 32 33 34 | void isOpen(){ float duration, dist; if( check[1].sts == LOW ){ check[1].sts == HIGH; digitalWrite(trig,HIGH); myDelay(check[1].sts, 1, 1); } if( check[1].sts == HIGH ) return; // 아직 딜레이 중 digitalWrite(trig,LOW); duration = pulseIn(echo,HIGH); dist = ( (float)(340*duration)/10000 ) / 2; if( dist > 1000 || dist < 1 ) return; // 무의미한 센서 값 distanceData += dist; dataCounter++; if( dataCounter >= HOW_MANY_DATA){ distanceData /= HOW_MANY_DATA; if( dist >= 10 ) doorStatus.Set(HIGH); else doorStatus.Set(LOW); distance.Set(distanceData); dataCounter = distanceData = 0; } } | cs |
위와 같이 코드를 짰는데, 모드링크에서는 delay를 쓰지 못해서 millis함수를 사용해야 했어서
myDelay라는 함수를 만들어 비슷하게 구현했다.
(코드에 대한 내용은 다음에 자세!히! 설명)
테스트 결과 조금 더 나아지긴 했지만 만족스럽지는 못했다.
이 부분이 중요한 만큼 대책을 계속 강구해봐야 될 듯 하다.
3. 마무리
일을 계속 미루다보니 마감에 쫓기게 되었다....
이번 실험은 센서 값이 너무 예상과 다르게 나와서 당황스럽다.
찜찜하지만 다음 단계를 구현한 다음 다시 고쳐야 할 듯 하다.
조금만 더 공부하자!
'IOT-MODLINK' 카테고리의 다른 글
[IoT-MODLINK] 웹/앱 UI를 더 이쁘게 꾸미자! (0) | 2017.12.19 |
---|---|
[Project – 스마트 도어락] 4. 조명 효과 & 외부 전원 공급하기 (0) | 2017.12.17 |
[Project – 스마트 도어락] 2. 도어락 제어하기 (0) | 2017.12.14 |
[Project - 스마트 도어락] 1. 주제 및 기획 (0) | 2017.12.07 |
[IoT-MODLINK] MODELINK 개봉기 & 리뷰 (0) | 2017.12.07 |