我有一个光传感器,它将输入的值打印到串行监视器。这几乎是一条跳线,但当一个物体挡住它的路时,它每1毫秒就打印一次这个值。如果我加一个延迟,它将不会触发第二个传感器,直到延迟完成。我如何才能使它只打印一次,而不受任何干扰或干扰其他传感器?
void loop() {
if (analogRead(sensor1) == 0) {
timer.start ();
tStop = false;
//Serial.println (timer.elapsed());
Serial.println ("Start Time = 0");
}发布于 2014-05-01 10:39:04
我设法在void设置之前创建了一个int,然后使用了while循环。在if语句中。
int i = 1;if (analogRead(sensor1) == 0) {
timer.start ();
tStop = false;
while (i == 1) {
Serial.println ("Start Time = 0");
i++;
}
}发布于 2014-04-30 13:51:48
这是一个非常有趣的问题,在计算机的正常世界里,我们会通过线程来解决这个问题。然而,当您在没有操作系统的情况下运行时,我们必须做两件事之一,实现协同(没有操作系统的假线程)或使用异步代码和中断。
我的理解是,当一个物体第一次进入你的传感器时,你会打印一些东西,因为arduino uno (相对于原来的)并不容易实现coroutines,我们将尝试中断路由。
首先,您可能对这个库http://playground.arduino.cc/Code/Timer1感兴趣,它允许您添加一个中断服务例程,以便在计时器上运行。为此,请使用库中的attachInterrupt(function )函数。
在您的中断服务例程中,您需要检查传感器,设置一个变量,说明上次触发它是多久以前,并在适当的情况下打印消息。这意味着主循环完全可以自由运行其他代码,不会阻塞其他传感器。
例如:
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-05-01 18:59:26
您可能应该使用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;
}
}
}https://stackoverflow.com/questions/23387848
复制相似问题