BASIC4MCU | 질문게시판 | 아두이노 센서 코딩 오류
페이지 정보
작성자 dnjsjj 작성일2023-11-01 18:57 조회493회 댓글0건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=23341
본문
초음파센서 3개와 틸트기울기센서를 이용한코딩입니다.
초음파센서 3개중 하나라도 30cm이하의 거리가 감지되고 동시에 틸트 기울기센서에 기울기가 감지되는 상태가 5초이상 지속되면 LED가 작동되도록 하는 코드인데
회로를 구성해 시험해보면 작동이 잘 될때도 있고, 5초이상이아니라 바로 작동이 될때도 있고, 필터링 코드를 작성했는데도 값이 튀는 것 같습니다.
1. 코딩 개선점이 있을까요? 2. 조건이 만족되면 LED 1개가 아니라 2개를 사용하여 LED 두 개가 번갈아가며 경광등처럼 작동하게 하려면 어떻게 해야 할까요..
const int tiltPin = 2; // 기울기 센서 핀을 2번으로const int ledPin = 5; // LED를 5번 핀으로const int trigPins[] = {9, 10, 11}; // 초음파 센서의 Trig 핀const int echoPins[] = {A0, A1, A2}; // 초음파 센서의 Echo 핀const int numSensors = 3; // 사용할 초음파 센서 개수const unsigned long tiltDuration = 5000; // 기울기 감지를 위한 시간 (5초)const int maxDistance = 30; // 최대 허용 거리 (30cm)unsigned long tiltStartTime = 0;bool tiltTriggered = false;const int numReadings = 5; // 필터링에 사용할 측정값의 개수int readings[numSensors][numReadings]; // 측정값을 저장할 배열int readIndex = 0; // 배열에 저장된 측정값의 인덱스int averageDistance[numSensors]; // 평균 거리를 저장할 배열void setup() {Serial.begin(9600);pinMode(ledPin, OUTPUT);pinMode(tiltPin, INPUT);for (int i = 0; i < numSensors; i++) {pinMode(trigPins[i], OUTPUT);pinMode(echoPins[i], INPUT);for (int j = 0; j < numReadings; j++) {readings[i][j] = 0;}averageDistance[i] = 0;}}void loop() {bool triggerLed = false;int tiltValue = digitalRead(tiltPin);for (int i = 0; i < numSensors; i++) {digitalWrite(trigPins[i], LOW);delayMicroseconds(2);digitalWrite(trigPins[i], HIGH);delayMicroseconds(10);digitalWrite(trigPins[i], LOW);long duration = pulseIn(echoPins[i], HIGH);int distance = duration / 29 / 2;// 측정값을 필터링하여 평균 거리 계산readings[i][readIndex] = distance;int total = 0;for (int j = 0; j < numReadings; j++) {total += readings[i][j];}averageDistance[i] = total / numReadings;if (averageDistance[i] < maxDistance) {triggerLed = true;break; // 하나라도 30cm 미만의 거리를 측정한 경우 루프 종료}}// 기울기 센서 감지 시간 측정if (tiltValue == HIGH) {if (!tiltTriggered) {tiltStartTime = millis();tiltTriggered = true;} else if (millis() - tiltStartTime >= tiltDuration) {triggerLed = true;}} else {tiltTriggered = false;}// 하나라도 30cm 미만의 거리를 측정하며 동시에 기울기가 5초 이상 감지되면 LED 켜기if (triggerLed) {digitalWrite(ledPin, HIGH);} else {digitalWrite(ledPin, LOW);}readIndex = (readIndex + 1) % numReadings; // 배열 인덱스 업데이트delay(1000); // 측정 주기를 조절할 수 있습니다.}
댓글 0
조회수 493등록된 댓글이 없습니다.