Serial.print只有一次Arduino

时间:2014-04-30 12:15:56

标签: c arduino println arduino-ide arduino-uno

我有一个光传感器,可将其输入值打印到串行监视器。它几乎是一个跳闸线,但当一个物体挡住时,它每1毫秒打印一次。如果我加了一个延迟就赢了; t触发第二个传感器直到延迟完成。我怎么才能打印一次,没有任何干扰或干扰其他传感器?

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

3 个答案:

答案 0 :(得分:1)

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

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

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

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

例如:

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
}

答案 1 :(得分:0)

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

int i = 1;

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

while (i == 1) {
  Serial.println ("Start Time = 0");
  i++;
 }    
}

答案 2 :(得分: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;
        }
    }
}