具有433 MHz传输的触发倒计时

时间:2017-06-28 18:36:06

标签: time arduino

我想用arduino读取多个土壤湿度传感器的433 MHz传输。由于我无法确定所有传输都到达接收器,我想从收到第一次传输的那一刻起设置倒计时。如果收到另一个传输,则倒计时再次开始。 经过规定的时间(例如10分钟)而没有任何更多的信号或者如果已经接收到所有信号(例如4个传感器),接收单元应该停止并根据它到达该点的数据做出决定。

发送和接收我正在使用<RCSwitch.h>库。

接收单元和一个Sensor的循环如下所示:

#include <RCSwitch.h>
RCSwitch mySwitch = RCSwitch();
void Setup(){
Serial.begin(9600);
mySwitch.enableReceive(4);
} 
void loop() {
if (mySwitch.available()) {
int value = mySwitch.getReceivedValue();

if (value == 0) {
  lcd.clear();
  Serial.print("Unknown encoding");
  } 
  else {
  Serial.print(mySwitch.getReceivedValue());
  Serial.print("%");
}

完整的代码包括所有传感器的一些差异化机制,但我认为这可能与我的问题无关。

问题: 没有实时时钟模块,最好的方法是什么。据我所知,我迫不及待地使用delay(...),因为那时我不会在处理器等待时收到任何数据。

2 个答案:

答案 0 :(得分:1)

您可以使用millis()作为时钟。它返回自arduino启动以来的毫秒数。

#define MINUTES(x) ((x) * 60000UL)

unsigned long countStart = 0;

void loop()
{
    if (/*read from module ok*/)
    {
        countStart = millis();
        // sanity check, since millis() eventually rolls over
        if (countStart == 0)
            countStart = 1;
    }

    if (countStart && ((millis() - countStart) > MINUTES(10)))
    {
        countStart = 0;
        // trigger event
    }
}

答案 1 :(得分:1)

Arduino的内部计时器也适用于这种情况。如果需要很长的时间,最好在1024预分频器(最大可用)下使用16位计数器(通常是timer1)。如果计时器的最大时间间隔大于所需的时间,则必须添加计数器以跟踪1分钟的间隔。

例如,对于1分钟的间隔,将寄存器初始化为:

  TCCR1A = 0; //Initially setting every register as 0x0000
  TCCR1B = 0;
  TCNT1  = 0;

  OCR1A = 468750;             // compare match register 16MHz/1024/2/frequency(hz)
  TCCR1B |= (1 << WGM12);   // Timer compare mode
  TCCR1B |= (1 << CS10) | (1 << CS10); // 1024 prescaler
  TIMSK1 |= (1 << OCIE1A);  // enable timer compare interrupt 

这些定时器配置的中断时间为1分钟。在计时器完成后,将运行ISR TIMER1_COMPA_vect。您可以在不同的中断周期内使用OCR1A的值。

使用中断的主要优点是它们不会阻止任何任务,并且可以立即执行(如果未明确禁用中断)。