BASIC4MCU | 질문게시판 | 초음파 센서를 이용한 인원 카운팅
페이지 정보
작성자 초음파야 작성일2023-05-31 17:12 조회496회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=22761
본문
초음파 센서를 4개를 이용하여 두개씩 나구고 1-2로 넘어가면 +1 2-1로 넘어가면 -1 3-4로 넘어가면 +1 4-3으로 넘어가면 -1이 되도록 코딩하였습니다. 각 센서에서 모인 합이 +6이 되면 LED와 사이렌이 울리도록 코딩하였습니다. 각 각 실행 할 땐 오류없이 실행이되는데 모두 합쳐서 메인피씨로 보내서 합산하면 오류가 자꾸 발생합니다. 코딩 수정 좀 부탁드립니다 !
보내는 측 코드
#include <NewPing.h>
#include <SPI.h>
#include <RF24.h>
#define TRIGGER_PIN_1 2
#define ECHO_PIN_1 3
#define TRIGGER_PIN_2 4
#define ECHO_PIN_2 5
NewPing sonar1(TRIGGER_PIN_1, ECHO_PIN_1, 200);
NewPing sonar2(TRIGGER_PIN_2, ECHO_PIN_2, 200);
int peopleCount = 0;
int prevPeopleCount = 0;
bool sensor1Active = false;
bool sensor2Active = false;
RF24 radio(9, 10);
void setup() {
Serial.begin(9600);
radio.begin();
radio.openWritingPipe(0xF0F0F0F0E1LL);
}
void loop() {
if (!sensor1Active && peopleCount >= -1) {
int distance1 = sonar1.ping_cm();
if (distance1 > -1) {
sonar2.timer_stop();
sensor2Active = false;
if (peopleCount > -1 && distance1 < 50) {
peopleCount++;
sensor1Active = true;
delay(1000);
}
}
}
if (!sensor2Active && peopleCount > -1) {
int distance2 = sonar2.ping_cm();
if (distance2 > -1) {
sonar1.timer_stop();
sensor1Active = false;
if (distance2 < 50) {
peopleCount--;
sensor2Active = true;
delay(1000);
}
}
}
if (peopleCount == 0 && sensor2Active) {
sensor1Active = false;
sonar1.timer_stop();
}
if (!sensor2Active && peopleCount > 0) {
int distance2 = sonar2.ping_cm();
if (distance2 > 0) {
sonar1.timer_stop();
sensor1Active = false;
if (distance2 < 50) {
peopleCount--;
sensor2Active = true;
delay(3000);
}
}
}
if (peopleCount >= 0 && peopleCount != prevPeopleCount) {
Serial.print("인원 수: ");
Serial.println(peopleCount);
prevPeopleCount = peopleCount;
char countStr[10];
sprintf(countStr, "%d", peopleCount);
radio.write(&countStr, sizeof(countStr));
}
if (peopleCount < 0) {
peopleCount = 0;
}
delay(100);
}
받는측 코드
#include <SPI.h>
#include <RF24.h>
RF24 radio(7, 8); // CE 핀은 7번, CSN 핀은 8번에 연결됨
const int redPin = 6;
const int bluePin = 2;
const int piezoPin = 4;
int totalPersonCount = 0;
unsigned long previousMillis = 0;
const long interval = 20; // 50밀리초 주기로 동작
void setup() {
Serial.begin(9600);
radio.begin();
radio.openReadingPipe(1, 0xF0F0F0F0E1LL); // 전송기의 주소로 설정 (5바이트 주소 사용)
radio.startListening(); // 수신 시작
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
pinMode(piezoPin, OUTPUT);
}
void loop() {
if (radio.available()) { // 데이터 수신 확인
char text[32] = ""; // 수신할 메시지를 저장할 배열
radio.read(&text, sizeof(text)); // 메시지 수신
Serial.println(text); // 수신된 메시지를 시리얼 모니터에 출력
int receivedPersonCount = atoi(text); // 수신된 메시지를 정수형으로 변환하여 receivedPersonCount에 저장
totalPersonCount += receivedPersonCount; // 총 인원 값에 더해줌
Serial.print("Total Person Count: ");
Serial.println(totalPersonCount); // 전체 인원 수를 시리얼 모니터에 출력
if (totalPersonCount < 0) {
totalPersonCount = 0; // 음수 값이 들어올 경우 0으로 설정
}
}
if (totalPersonCount > 5) {
flashLED();
soundBuzzer();
} else {
turnOffLED();
noTone(piezoPin);
}
}
void flashLED() {
unsigned long currentMillis = millis();
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (currentMillis % 200 < 100) {
analogWrite(redPin, 255);
analogWrite(bluePin, 0);
} else {
analogWrite(redPin, 0);
analogWrite(bluePin, 255);
}
}
}
void soundBuzzer() {
unsigned long currentMillis = millis();
if (currentMillis % 400 < 200) {
tone(piezoPin, 3000); // 첫 번째 주파수
} else {
tone(piezoPin, 4000); // 두 번째 주파수
}
}
void turnOffLED() {
analogWrite(redPin, 0);
analogWrite(bluePin, 0);
}
댓글 1
조회수 496master님의 댓글
master 작성일
한 보드에서 초음파센서 4개를 순차적으로 구동 할 때만 거리값을 제대로 얻을 수 있습니다.
보드가 다르면 거리값을 제대로 얻기 어렵습니다.
또, 한개의 초음파를 측정한 후 적어도 50ms이상의 딜레이를 주는 것이 오차가 적으며
100ms 딜레이를 주면 거리오차가 상당히 줄어듭니다.