티스토리 뷰

(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, 11);
  }
 
  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. 마무리


일을 계속 미루다보니 마감에 쫓기게 되었다....

이번 실험은 센서 값이 너무 예상과 다르게 나와서 당황스럽다.

찜찜하지만 다음 단계를 구현한 다음 다시 고쳐야 할 듯 하다.


조금만 더 공부하자!




















댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
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
글 보관함