我需要为一个项目编写一个Arduino,我想我会添加一些奇特的东西,一个LED颜色变化的东西。 LED有一种cyclus,它会改变颜色,这需要大约40秒。但是,蝙蝠传感器会使LED燃烧,记录整个时间并再次告诉LED每秒几次。 LED永远不会有时间改变颜色,只保留第一种颜色。
我不知道如何解决这个问题。我试图给LED一个延迟或什么,但显然我做错了。到目前为止的代码就是这个;
//Pin which triggers ultrasonic sound.
const int pingPin = 13;
//Pin which delivers time to receive echo using pulseIn().
int inPin = 12;
//Range in cm which is considered safe to enter, anything
//coming within less than 5 cm triggers the red LED.
int safeZone = 10;
//LED pin numbers
int redLed = 3, greenLed = 5;
void setup() {
//Initialize serial communication
Serial.begin(9600);
//Initializing the pin states
pinMode(pingPin, OUTPUT);
pinMode(redLed, OUTPUT);
pinMode(greenLed, OUTPUT);
}
void loop()
{
//Raw duration in milliseconds, cm is the
//converted amount into a distance.
long duration, cm;
//Sending the signal, starting with LOW for a clean signal 2 staat voor reactie.
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
//Setting up the input pin, and receiving the duration in
//microseconds for the sound to bounce off the object in front.
pinMode(inPin, INPUT);
duration = pulseIn(inPin, HIGH); //Documentation for pulseIn():
//http://www.arduino.cc/en/Reference/PulseIn
//Convert the time into a distance
cm = microsecondsToCentimeters(duration);
//Printing the current readings to the serial display
Serial.print(cm);
Serial.print("cm");
Serial.println();
//If het is groter dan 10 dan gaat het lichtje uit
//else het is binnen bepaalde cm dan gaat het aan van 0 naar 255.
if(cm>10)
{
analogWrite(redLed, 0);
}
else{
analogWrite(redLed, map(cm,0,10,255,0));
dela
}
if(cm>5)
{
analogWrite(greenLed, 0);
}
else{
analogWrite(greenLed, map(cm,0,5,255,0));
}
delay(100);
}
long microsecondsToCentimeters(long microseconds)
{
// The speed of sound is 340 m/s or 29 microseconds per centimeter.
// The ping travels out and back, so to find the distance of the
// object we take half of the distance travelled.
return microseconds / 29 / 2;
}
但我认为它仍然需要一些延迟的东西。我不确定我正在使用的传感器是什么,但它有两个传感器,一个发送一个接收,它测量接收声音需要多长时间,在我的代码中我将其转换为cm
我希望你能帮助并理解我的问题是什么,因为我对这门语言的了解很差。
答案 0 :(得分:0)
根据需要使用delay(ms)
延迟40毫秒。这将使Arduino关闭40 ms,然后才能处理来自超声波传感器的任何数据。
答案 1 :(得分:0)
设置pulseIn的超时值。否则程序卡在duration = pulseIn(inPin, HIGH);
行中,因为如果先前的超声波脉冲没有产生回声,你就没有机会发出另一个超声波脉冲。
在这种情况下,最大范围是10厘米(声音脉冲的行程距离为20厘米),因此可以相应地设置超时值(s是距离,v是速度,t是时间):
s = v * t => t = s / v = 2 * 0.1 m / 343.2 m/s = 582.8 µs
假设声速在20°C的干燥空气中。
允许输出脉冲的宽度为2μs,总时间为584.8μs。
而不是
duration = pulseIn(inPin, HIGH);
使用
duration = pulseIn(inPin, HIGH, 585);
其他说明:
输出脉冲非常短,意图为2μs。
digitalWrite() is quite slow,大约5μs,因此实际脉冲可能超过2μs。即便如此,超声波换能器也可能无法在如此短的时间内启动。
即使输出脉冲比你想象的要长,它也只是一个周期(如果超声波传感器工作在100 kHz,周期为10μs)
尝试尝试更长的范围和更长的输出脉冲,以确保这不是问题。