Arduino 超声波传感器总是 returns 0
Arduino Ultra Sonic Sensor always returns 0
我正在 Arduino UNO 中做一个基本项目,连接一个 超声波传感器 (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。Trig 应该是 Arduino 的输出,但您有它定义为输入。
Echo 连接到引脚 2,它应该是输入,但您将其定义为输出。
最后,在你的 loop()
中,你甚至没有使用引脚 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
只是从 Echo 脉冲开始变高到同一脉冲结束所花费的时间(当它变低)。您仍然需要根据 pulseWidth
.
的值计算距离
根据最近对问题的编辑更新
如果您将 loop()
代码的一部分更改为此,它应该可以工作:
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.
}
尝试将传感器的 VCC 连接到 3V3 而不是 5V。这听起来可能很奇怪,但我试过了并且效果很好。另外,请确保您的 echo 和 trig pin 与代码匹配。
我正在 Arduino UNO 中做一个基本项目,连接一个 超声波传感器 (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。Trig 应该是 Arduino 的输出,但您有它定义为输入。
Echo 连接到引脚 2,它应该是输入,但您将其定义为输出。
最后,在你的 loop()
中,你甚至没有使用引脚 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
只是从 Echo 脉冲开始变高到同一脉冲结束所花费的时间(当它变低)。您仍然需要根据 pulseWidth
.
根据最近对问题的编辑更新
如果您将 loop()
代码的一部分更改为此,它应该可以工作:
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.
}
尝试将传感器的 VCC 连接到 3V3 而不是 5V。这听起来可能很奇怪,但我试过了并且效果很好。另外,请确保您的 echo 和 trig pin 与代码匹配。