Ультразвуковые c датчики - PullRequest
0 голосов
/ 08 мая 2020

Теперь я использую 2 ультразвуковых датчика c, но я обнаружил, что они становятся нестабильными на открытом воздухе и дают случайные показания ... хотя они обычно работают внутри комнаты ... как я могу решить эту проблему проблема ??? Это код, похоже, что датчик выключения всегда читает, и я проверил проводку, и это хорошо, поэтому я действительно не знаю, в чем проблема ??

    #define trig 2
    #define echo 3
    #define led 7
    #define relay 4
    #define trig2 10
    #define echo2 9
    #define led2 8

  long duration,distance,OnSensor,OffSensor;
void setup() {
  // put your setup code here, to run once:
  pinMode(echo,INPUT);
  pinMode(echo2,INPUT);
  Serial.begin(9600);
  pinMode(led,OUTPUT);
  pinMode(led2,OUTPUT);
  pinMode(relay,OUTPUT);
  pinMode(trig,OUTPUT);
  pinMode(trig2,OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(led,LOW);
  digitalWrite(led2,LOW);
  digitalWrite(relay,LOW);
  SonarSensor(trig2, echo2);
  OffSensor = distance;
  delay(50);
  SonarSensor(trig, echo);
  OnSensor=distance;

  if(OnSensor<80&&OffSensor>=80){//sensor 1 activated
    digitalWrite(led,HIGH);
    digitalWrite(relay,HIGH);
    delay(150);
    digitalWrite(led,LOW);
    digitalWrite(relay,LOW);
    delay(1000);
    digitalWrite(led,HIGH);
    digitalWrite(relay,HIGH);
    delay(150);
    digitalWrite(led,LOW);
    digitalWrite(relay,LOW);

  }
  else if(OnSensor>80&&OffSensor>80){//No sensor activated
    digitalWrite(led,LOW);
    digitalWrite(relay,LOW);
  }
  else if(OnSensor>80&&OffSensor<80){//sensor2 activated
        digitalWrite(led2,HIGH);
        digitalWrite(relay,LOW);
        delay(5000);
  }
  else if(OnSensor<80&&OffSensor<80){//Both sensors activated
       digitalWrite(led2,HIGH);
       digitalWrite(led,HIGH);
       digitalWrite(relay,LOW);
       delay(3000);
  }
}
void SonarSensor(int trigPin,int echoPin)
{
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH);
delayMicroseconds(10);
digitalWrite(trigPin, LOW);
duration = pulseIn(echoPin, HIGH);
distance = duration*0.034/2;
}

1 Ответ

0 голосов
/ 10 мая 2020

Я думаю, здесь есть 2 проблемы

  1. Вы используете 2 датчика
  2. Элемент списка

Используйте его на улице

По моему опыту, ультразвуковая волна c может много раз прыгать вокруг объекта. В зависимости от вашей настройки, второй датчик может считывать эхо от первого датчика. выполните следующие действия. 1. Попробуйте использовать по одному датчику каждый раз, чтобы проверить, не возникает ли ошибка 2. Если один датчик работает, вам следует добавить больше задержки после считывания датчика 3. Постройте данные, чтобы увидеть, как они выглядят, вам может понадобиться цифровой фильтр для улучшения чтения Для шага 3, если вы используете датчик как On Off по порогу, вы можете увидеть мой пример кода. Этот код работает так же, как отключение кнопки, поэтому необходимо непрерывно срабатывать в течение 10 раз, чтобы предотвратить ложную тревогу (этот код для одного датчика)

#define  ULTRASONIC_TRIG_PIN  8
#define  ULTRASONIC_ECHO_PIN 7

#define RELAY_PIN 4
/**/
#define ULTRASONIC_INTERVAL_MS 100//50
#define ULTRASONIC_TRIG_COUNT_THRESH 10
#define ULTRASONIC_DISTACE_THRESH_CM 50
/**/
#define RELAY_TRIG__INTERVAL_MS 5000
#define RELAY_TRIG_LOGIC HIGH



void setup()


{

  pinMode (RELAY_PIN, OUTPUT);
  pinMode (ULTRASONIC_TRIG_PIN, OUTPUT);
  pinMode (ULTRASONIC_ECHO_PIN, INPUT);
  Serial.begin(115200);
}
void loop()
{
  static unsigned long ultrasonic_timer = millis();
  static unsigned long relay_trig_timer = millis();
  static float us_distance_cm = 0;
  static int us_trig_count = 0;
  static byte relay_state = !RELAY_TRIG_LOGIC; // initial value as off;
  if (millis() - ultrasonic_timer >= ULTRASONIC_INTERVAL_MS) {
    ultrasonic_timer += ULTRASONIC_INTERVAL_MS;
    us_distance_cm = getDistanceCM();

    if (us_distance_cm <= ULTRASONIC_DISTACE_THRESH_CM) {
      if (us_trig_count >= ULTRASONIC_TRIG_COUNT_THRESH) {
        digitalWrite(RELAY_PIN, RELAY_TRIG_LOGIC);
        relay_state = RELAY_TRIG_LOGIC;
        relay_trig_timer = millis();
      }
      else {
        us_trig_count++;
      }

    }
    else {
      us_trig_count = 0;

    }
    Serial.print("distance = ");
    Serial.print(us_distance_cm);
    Serial.print("cm, relay = ");
    Serial.print(relay_state);
    Serial.print(", count = ");
    Serial.println(us_trig_count);
  }
  if (relay_state == RELAY_TRIG_LOGIC) {
    if (millis() - relay_trig_timer > RELAY_TRIG__INTERVAL_MS) {
      relay_state = !RELAY_TRIG_LOGIC;
      digitalWrite(RELAY_PIN, !RELAY_TRIG_LOGIC);
    }
  }


}

float getDistanceCM() {
  digitalWrite(ULTRASONIC_TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(ULTRASONIC_TRIG_PIN, LOW);
  unsigned long duration = pulseIn(ULTRASONIC_ECHO_PIN, HIGH, 50000);
  float distance = float(duration * 343) / 20000.0;
  delay(5);
  return distance;
}
...