2014-02-08 69 views
2

我正在为Raspberry Pi创建门锁系统。当用户刷卡后可自动车门解锁使用下面的代码:五秒暂停

piface.getRelay(PiFaceRelay.K0).open(); 

我试图创建一个5秒延迟之前的门锁住,然后用下面一行:

piface.getRelay(PiFaceRelay.K0).close(); 

这是我已经用于尝试并执行5秒的延迟,但目前它然后立即解锁代码再次锁定它并没有提供足够的时间一个人身体推开门:

piface.getRelay(PiFaceRelay.K0).open(); 

Timer autoLockTimer = new Timer(5000, new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     piface.getRelay(PiFaceRelay.K0).close(); 
    } 
}); 

autoLockTimer.setInitialDelay(5000); 
autoLockTimer.setRepeats(false); 
autoLockTimer.start(); 

我想我只是没有正确使用计时器。任何建议将不胜感激。

+0

您正在使用哪个Timer类?基于它如何构建,它看起来不像['java.util.Timer'](http://docs.oracle.com/javase/7/docs/api/java/util/Timer.html) – Krease

+0

这是一个摆动计时器: import javax.swing.Timer; – Suipaste

+0

这看起来像它应该从'Timer'观点工作 - 我不知道很多关于树莓PI虽然 - 你试过注释掉你的'actionPerformed'的内容(或添加一些日志记录),看看它是否确实是特别呼吁'关闭'是过早触发? – Krease

回答

0

事实证明,在原来的问题张贴代码块工作正常!

不过我也监测数据库,该数据库将自动触发一个锁定命令,如果在数据库锁定状态是真实的(它是),门被刷卡解锁后会立即执行。这也是在计时器上运行。

解决方案是当用户刷卡时停止监控命令,然后在门锁解锁5秒后恢复监控。

感谢您的建议,每个人!

1

为什么不简单(从零开始):

new Thread(new Runnable() { 
    public void run() { 
      piface.getRelay(PiFaceRelay.K0).open(); 
      Thread.sleep(5000); 
      piface.getRelay(PiFaceRelay.K0).close(); 
    } 
}).start(); 
+0

虽然有用的另一种方式做到这一点,这将仍然有相同的结果原代码... – Krease

+0

是的,我已经给这是一个尝试,同样的问题。我将深入挖掘我的代码,看看是否有其他地方导致这种情况发生。 – Suipaste

1

你确定你有继电器API吗? PiFacExample,java使用'close'来打开

+0

是啊,这一点的罚款,锁线连成“常开”(您可以通过包装它为“常闭”反转命令),它的物理解锁然后锁定,只要有5号第二次暂停。 – Suipaste

+0

你试过'脉冲(5000)'吗? –