我正在Arduino UNO中进行基本项目连接Ultra Sonic传感器(HC-SR04),该传感器应在串行监视器中打印最近物体的距离,但始终打印0.
这是我的代码:
long distance;
long time;
void setup(){
Serial.begin(9600);
pinMode(4, OUTPUT);
pinMode(2, INPUT);
}
void loop(){
digitalWrite(2,LOW);
delayMicroseconds(5);
digitalWrite(2, HIGH);
delayMicroseconds(10);
time = pulseIn(4, HIGH);
distance = int(0.017*time);
Serial.print("Distance: ");
Serial.print(distance);
Serial.println(" cm.");
delay(1000);
}
这是面包板:
最佳答案 我看到的主要问题是您的代码与您的接线图不匹配.
例如,您的图表显示Trig连接到引脚4.Tri应该是Arduino的输出,但您将其定义为输入.
Echo连接到引脚2,它应该是一个输入,但你将它定义为输出.
最后,在你的循环()中,你甚至不使用引脚2或引脚4,而是引脚9和8.另一个问题是你在设置触发脉冲时使用的时序 – 它与数据表不匹配.我会做这样的事情(假设你实际连接到图中显示的引脚):
#define sensorTrigPin 4
#define sensorEchoPin 2
void setup()
{
Serial.begin(9600);
pinMode(sensorTrigPin, OUTPUT);
pinMode(sensorEchoPin, INPUT);
}
void loop()
{
int pulseWidth = 0;
digitalWrite(sensorTrigPin, HIGH);
delayMicroseconds(10);
digitalWrite(sensorTrigPin, LOW);
pulseWidth = pulseIn(sensorEchoPin, HIGH);
Serial.print("Pulse Width: ");
Serial.print(pulseWidth);
delay(1000);
}
请注意,pulseWidth只是从回波脉冲开始变为高电平到相同脉冲结束(变为低电平)时所需的时间.您仍然需要根据pulseWidth的值计算距离.
基于最新编辑的更新问题
如果你将loop()代码的一部分更改为this,它应该工作:
void loop(){
digitalWrite(4, HIGH); //was (2, LOW)
delayMicroseconds(10); //was (5)
digitalWrite(4, LOW); //was (2, HIGH)
//REMOVED EXTRA DELAY
time = pulseIn(2, HIGH); //was (4,HIGH);
... //Keep the rest of your code the same.
}