首页 文章

Arduino Ping)))在显示一些结果后,传感器突然停止

提问于
浏览
0

我有一个ping)))传感器(HC - SR04)正确连接 .

我启动它没有接地(否则它甚至不想启动)并且它一直写0到串行窗口(距离) . 一旦我将它插入接地引脚,我得到几行正确的距离读数,而不是它停止和挂起,在串行窗口中没有更多的结果,并且电路板本身似乎处于故障状态,我需要拔掉电源线它从USB,断开接地,然后重新插入USB .

可能是问题的原因是什么?

码:

#define echoPin 2 // Echo Pin
#define trigPin 4 // Trigger Pin
#define LEDPin 13 // Onboard LED

int maximumRange = 200;  // Maximum range needed
int minimumRange = 0;    // Minimum range needed
long duration, distance; // Duration used to calculate distance
int currentDistance = 0;

void setup() {
    Serial.begin (9600);
    pinMode(trigPin, OUTPUT);
    pinMode(echoPin, INPUT);
    pinMode(LEDPin, OUTPUT); // Use LED indicator (if required)
}

void loop() {
    /* The following trigPin/echoPin cycle is used to determine the
       distance of the nearest object by bouncing soundwaves off of it. */
    digitalWrite(trigPin, LOW);
    delayMicroseconds(2);

    digitalWrite(trigPin, HIGH);
    delayMicroseconds(10);

    digitalWrite(trigPin, LOW);
    duration = pulseIn(echoPin, HIGH);

    //Calculate the distance (in cm) based on the speed of sound.
    distance = duration/58.2;

    if (distance >= maximumRange || distance <= minimumRange){
        /* Send a negative number to computer and Turn LED ON
           to indicate "out of range" */
        Serial.println("-1");
        digitalWrite(LEDPin, HIGH);
    } else {
        /* Send the distance to the computer using Serial protocol, and
           turn LED OFF to indicate successful reading. */
        Serial.println(distance);
        digitalWrite(LEDPin, LOW);
    }

    //Delay of 50 ms before next reading.
    delay(50);
}

------------------------ UPDATE ------------------------- -----

似乎问题不在于传感器,而在于串行接口:我已将LED附加到电路板上,并根据距离为其提供模拟值 . 一旦Arduino得到"stuck",LED就能正常工作,所以我猜问题就是Arduino关闭了串行接口并停止通过USB传输数据 .

如何解决这个问题?

3 回答

  • 1

    传感器固定为零的解决方案是在此链接中 . 这是docdoc的第二篇文章 . 您将需要使用更好的NewPing库 .

    一个工作代码:

    #include <NewPing.h>
    #define TRIGGER_PIN 12
    #define ECHO_PIN 11
    #define MAX_DISTANCE 200
    
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE);
    
    void setup() {
        Serial.begin(9600);
    }
    
    void loop() {
        delay(50);
        unsigned int uS = sonar.ping();
        pinMode(ECHO_PIN,OUTPUT);
        digitalWrite(ECHO_PIN,LOW);
        pinMode(ECHO_PIN,INPUT);
        Serial.print("Ping: ");
        Serial.print(uS / US_ROUNDTRIP_CM);
        Serial.println("cm");
    }
    

    链接:http://forum.arduino.cc/index.php?topic=55119.15

    NewPing链接:http://playground.arduino.cc/Code/NewPing

  • 0

    根据你的说法,看起来地面与设备之间存在着一种间隙的捷径...或者可能是有一个有缺陷的部件在地面上发生故障 . 所以我的建议是:

    • Arduino是否正常工作?

    • 在未连接传感器的情况下测试Arduino本身是否完美无缺(上传回声sketch),

    • 传感器设备是否正常工作?

    • 测试所有焊接点的连续性(查找地面和信号之间的快捷桥接),

    • 使用其他传感器设备进行测试(如果您碰巧有备用设备)以查看问题是否仍然存在

    • 或者尝试与另一个Arduino使用相同的设备 .

    关于你的代码本身,据我所知,问题的来源不是,我建议你将全局常量的声明改为:

    const uint8_t maximumRange = 200; // Maximum range needed
    const uint8_t minimumRange = 0;   // Minimum range needed
    const uint8_t currentDistance = 0;
    

    或者使用预处理器:

    #define maximumRange 200  // Maximum range needed
    #define minimumRange 0    // Minimum range needed
    #define currentDistance = 0
    

    并移动:

    long duration, distance;   // Duration used to calculate distance
    

    loop() 函数中 . 尽可能避免使用非常量全局变量总是一个好主意(尽管Arduino对象并不总是可行) .

  • 0

    我能够找到问题的原因 . 似乎Arduino的串行监视器导致"crash",因为在使用允许Arduino输出在Flash(serproxy)中使用的服务器实用程序时,Arduino执行一致且没有问题 .

    该项目的视频是Arduino + Ping))) Sensor - Change display in application according to distance .

相关问题