1

我需要为一个项目编写一个 Arduino,我想我会添加一些花哨的东西,一个 LED 变色的东西。LED 有一种循环,可以在其中改变颜色,这需要大约 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 .

我希望你能帮助理解我的问题,因为我对这门语言的了解很差。

4

2 回答 2

0

根据需要使用delay(ms)延迟 40 毫秒。这将在处理来自超声波传感器的任何数据之前将 Arduino 关闭 40 毫秒。

于 2012-11-06T03:07:53.057 回答
0

为pulseIn设置超时值。否则,如果前一个超声波脉冲没有产生回声,程序就会卡在这条线上duration = pulseIn(inPin, HIGH);,因为您没有机会发送另一个超声波脉冲。

在这种情况下,最大范围为 10 cm(声脉冲的行进距离为 20 cm),因此可以相应地设置超时值(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);

其他注意事项:

  1. 输出脉冲非常短,预计为 2 µs。

  2. digitalWrite() 非常慢,大约为 5 µs,因此实际脉冲可能长于 2 µs。即便如此,超声波换能器也可能无法在这么短的时间内启动。

  3. 即使输出脉冲比您想象的要长,它也是一个周期的数量级(如果超声波换能器以 100 kHz 运行,则周期为 10 µs)

尝试使用更长的范围和更长的输出脉冲来确保这不是问题。

于 2012-11-06T03:50:30.060 回答