首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >超声波传感器

超声波传感器
EN

Stack Overflow用户
提问于 2020-05-08 10:34:29
回答 1查看 237关注 0票数 0

现在我正在使用两个超声波传感器,但我发现它们在室外变得不稳定,给出随机读数,.....although,它们在房间内正常工作,.....how,我能解决这个问题吗?这就是代码,似乎关闭传感器总是在读取,我检查了线路,它是好的,所以我不知道问题在哪里??

代码语言:javascript
复制
    #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;
}
EN

回答 1

Stack Overflow用户

发布于 2020-05-10 01:06:49

我认为这里有两个问题

  1. 您使用2传感器
  2. 列表项

在户外使用

根据我的经验,超音波可以在物体周围弹跳很多次。根据您的设置,第二个传感器可能会读取回波表单第一个传感器。按照以下步骤1。尝试每次使用1个传感器来查看它是否有错误2。如果单个传感器工作正常,则应在传感器读取3之后添加更多延迟。绘制数据以查看是否需要数字滤波器来改进第3步的读取,如果您按阈值关闭传感器,您可以看到我的示例代码。此代码的工作方式与按钮脱弹相同,因此需要连续触发10次,以防止虚警(此代码用于单个传感器)。

代码语言:javascript
复制
#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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61677161

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档