1

我有一个光传感器,可以将其输入值打印到串行监视器。它几乎是一条绊线,但是当一个物体挡住它的路时,它每 1 毫秒打印一次该值。如果我添加延迟,它将不会触发第二个传感器,直到延迟完成。我怎样才能让它只打印一次,而不会对其他传感器造成任何干扰或干扰?

void loop() {
  if (analogRead(sensor1) == 0) {     
    timer.start ();
    tStop = false;
    //Serial.println (timer.elapsed());
    Serial.println ("Start Time = 0");
  }
4

3 回答 3

1

这是一个非常有趣的问题,在正常的计算机世界中,我们会通过线程来解决这个问题。但是,当您在没有操作系统的情况下运行时,我们必须做两件事之一,实现协程(没有操作系统的假线程)或使用异步代码和中断。

我的理解是,当一个物体第一次进入你的传感器时,你会打印一些东西,因为 arduino uno 而不是由于它不容易实现协同程序,我们将尝试中断路由。

首先,您可能会对这个库感兴趣http://playground.arduino.cc/Code/Timer1 它允许您添加一个中断服务例程以在计时器上运行。为此,请使用库中的 attachInterrupt(function, period) 函数。

在您的中断服务例程中,您将要检查传感器,设置一个变量来说明自上次触发以来的时间,并在适当的情况下打印消息。这意味着您的主循环可以完全自由地运行其他代码,并且不会阻塞您的其他传感器。

例如:

void TimFun()
{
    static int LastRead;
    if(LastRead && (0 == analogRead(sensor1))
    {
        Serial.println("SensorTrip");
    }
    LastRead = analogRead(sensor1);
}

void loop()
{
    // Do other stuff here
}

void setup()
{
    Timer1.initialize(100000);
    Timer1.attachInterrupt(TimFun);
    // Rest of setup Here
}
于 2014-04-30T13:51:48.180 回答
0

我设法在 void 设置之前创建了一个 int ,然后使用了一个 while 循环。with 在 if 语句中。

int i = 1;

if (analogRead(sensor1) == 0) {     
  timer.start ();
  tStop = false;

while (i == 1) {
  Serial.println ("Start Time = 0");
  i++;
 }    
}
于 2014-05-01T10:39:04.740 回答
0

您可能应该使用一个if而不是一个while永远不会执行超过一次的循环。

bool tripped = false;

void setup(){
    //setup stuff here
}

void loop() {
    if ( analogRead(sensor1) == 0 ) 
    {     
        timer.start ();
        tStop = false;

        if ( tripped == false ) 
        {
            Serial.println ("Start Time = 0");
            tripped = true;
        }
    }
}
于 2014-05-01T18:59:26.713 回答