정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

아두이노 출입인원카운팅
유깅 | 2022-11-29

아두이노와 적외선센서 2개를 이용해서 출입하는 인원수를 카운트하는 장치를 만들고있습니다.

센서로 인원 수를 세서 블루투스로 핸드폰에 인원수를 표시하려고합니다.
 
아두이노를 컴퓨터랑 연결하고 업로드를하면 센서와 무관하게 숫자가 1씩 계속해서 커지거나 줄어드는 오류가 발생합니다.
아두이노에 아무것도 연결하지않고 포트랑만 연결해서 업로드해도 시리얼모니터에 계속 숫자가 늘어납니다.
아두이노 우노 사용했고 입력한 코드는 다음과같습니다..
 
 
#include <SoftwareSerial.h>
 
 
//여기서 A3를 txd로 두고, 블루투스 센서에서는 rxd로 받음
 
#define BT_RXD A4
 
#define BT_TXD A3
 
SoftwareSerial bluetooth(BT_RXD, BT_TXD); // 블루투스 통신 선언
 
 
// 맨 처음 센서와 물체사이 거리를 배열로 저장
 
float initial_dstArray[2];
 
 
// 순간순간 센서와 물체사이 거리를 배열로 저장
 
float dstArray[2];
 
float triggerArray[2];
 
float new_triggerArray[2];
 
 
// 센서와 물체사이 거리가 몇 이하일때
 
// 물체가 지나갔다고 간주할 것인지 지정
 
// (여기서는 6cm)
 
int trigger_dst = 6;
 
 
// trigger 여부 (true:1, false:0)
 
int trigger = 0;
 
 
// 카운트 현황
 
int count = 0;
 
 
// 센서와 물체사이 거리 측정함수
 
void dist(){
 
  // 센서별로 3번 측정
 
  int volt_1_1 = map(analogRead(A0), 0, 1023, 0, 5000);
 
  int volt_2_1 = map(analogRead(A1), 0, 1023, 0, 5000);
 
  int volt_1_2 = map(analogRead(A0), 0, 1023, 0, 5000);
 
  int volt_2_2 = map(analogRead(A1), 0, 1023, 0, 5000);
 
  int volt_1_3 = map(analogRead(A0), 0, 1023, 0, 5000);
 
  int volt_2_3 = map(analogRead(A1), 0, 1023, 0, 5000);
 
 
  // 3번의 거리값을 평균냄
 
  float volt_1 = ( volt_1_1 + volt_1_2 + volt_1_3 ) / 3;
 
  float volt_2 = ( volt_2_1 + volt_2_2 + volt_2_3 ) / 3;
 
 
// 거리값을 cm단위로 바꿈
 
  float distance_1 = (27.61 / (volt_1 - 0.1696)) * 1000;
 
  float distance_2 = (27.61 / (volt_2 - 0.1696)) * 1000;
 
 
  // 거리측정 완료, dst배열의 0번, 1번값으로 할당해줌
 
  dstArray[0] = distance_1;
 
  dstArray[1] = distance_2;
 
}
 
 
void setup() {
 
  Serial.begin(9600);                     // 시리얼 통신
 
  bluetooth.begin(9600);                  // 블루투스 통신
 
  dist();                                 // 거리 측정
 
  initial_dstArray[0] = dstArray[0];      
 
  initial_dstArray[1] = dstArray[1];      // 센서와 벽 사이 초기 거리값 지정
 
}
 
 
void loop() {
 
  // trigger!=1 이라면 계속해서 거리 측정(while문)
 
  dist();
 
 
  // 거리 측정할때마다 trigger배열에 처음 거리값(initial dst array)과
 
  // 측정 거리값의(dst array) 차이를 저장
 
  triggerArray[0] = abs(dstArray[0] - initial_dstArray[0]);
 
  triggerArray[1] = abs(dstArray[1] - initial_dstArray[1]);
 
 
  // 두 측정 차이값(trigger array) 중 하나라도 trigger dst값(6cm)보다 크면 trigger시킴
 
  if ( triggerArray[0] >= trigger_dst || triggerArray[1] >= trigger_dst ) {
 
    trigger = 1;
 
  }
 
 
 
  while(trigger==1) {
 
    // 두번째 trigger가 발생할때까지 계속 while문 반복, 거리측정
 
    dist();
 
 
    // 다시 측정한 값으로 새로운 trigger array 생성
 
    new_triggerArray[0] = abs(dstArray[0] - initial_dstArray[0]);
 
    new_triggerArray[1] = abs(dstArray[1] - initial_dstArray[1]);
 
 
    // 아래부터는 두번째 trigger가 발생해야 진입
 
    if ( triggerArray[0] >= trigger_dst && new_triggerArray[1] >= trigger_dst ) {
 
      // 거리센서 두개를 각각 a, b라고 할때,
 
      // 첫번째 trigger는 a, 두번째 trigger가 b라면
 
      // 1명이 진입했다고 판단, count +1
 
      count += 1;
 
 
      // 블루투스 화면과 serial화면에 프린트
 
      bluetooth.print( count );
 
      Serial.print( count );
 
     
 
      // 카운트 후 1초의 쿨타임
 
      delay(1000);  
 
 
      // 전역변수 초기화                              
 
      trigger = 0;
 
      triggerArray[0] = initial_dstArray[0];
 
      triggerArray[1] = initial_dstArray[1];
 
      new_triggerArray[0] = initial_dstArray[0];
 
      new_triggerArray[1] = initial_dstArray[1];
 
 
      // 두번째 while문 탈출
 
      break;
 
    } else if ( triggerArray[1] >= trigger_dst && new_triggerArray[0] >= trigger_dst ) {
 
      // 반대로 첫번째 trigger는 b, 두번째 trigger가 a라면
 
      // 1명이 퇴실했다고 판단, count -1
 
      count -= 1;
 
      bluetooth.print( count );
 
      Serial.print( count );
 
      delay(1000);
 
      trigger = 0;
 
      triggerArray[0] = initial_dstArray[0];
 
      triggerArray[1] = initial_dstArray[1];
 
      new_triggerArray[0] = initial_dstArray[0];
 
      new_triggerArray[1] = initial_dstArray[1];
 
      break;
 
    }
 
  }
 
}
이전글   |    피에조 부저로 노래가 나오는 중간에 버튼으로 끄고 싶어요... 2022-11-28
다음글   |    아두이노 코딩 2022-11-30