我有一个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 回答
传感器固定为零的解决方案是在此链接中 . 这是docdoc的第二篇文章 . 您将需要使用更好的NewPing库 .
一个工作代码:
链接:http://forum.arduino.cc/index.php?topic=55119.15
NewPing链接:http://playground.arduino.cc/Code/NewPing
根据你的说法,看起来地面与设备之间存在着一种间隙的捷径...或者可能是有一个有缺陷的部件在地面上发生故障 . 所以我的建议是:
Arduino是否正常工作?
在未连接传感器的情况下测试Arduino本身是否完美无缺(上传回声sketch),
传感器设备是否正常工作?
测试所有焊接点的连续性(查找地面和信号之间的快捷桥接),
使用其他传感器设备进行测试(如果您碰巧有备用设备)以查看问题是否仍然存在
或者尝试与另一个Arduino使用相同的设备 .
关于你的代码本身,据我所知,问题的来源不是,我建议你将全局常量的声明改为:
或者使用预处理器:
并移动:
在
loop()
函数中 . 尽可能避免使用非常量全局变量总是一个好主意(尽管Arduino对象并不总是可行) .我能够找到问题的原因 . 似乎Arduino的串行监视器导致"crash",因为在使用允许Arduino输出在Flash(serproxy)中使用的服务器实用程序时,Arduino执行一致且没有问题 .
该项目的视频是Arduino + Ping))) Sensor - Change display in application according to distance .