我有一个光传感器,可将其输入值打印到串行监视器。它几乎是一个跳闸线,但当一个物体挡住时,它每1毫秒打印一次。如果我加了一个延迟就赢了; t触发第二个传感器直到延迟完成。我怎么才能打印一次,没有任何干扰或干扰其他传感器?
void loop() {
if (analogRead(sensor1) == 0) {
timer.start ();
tStop = false;
//Serial.println (timer.elapsed());
Serial.println ("Start Time = 0");
}
答案 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;
}
}
}