2017-06-28 5 views
0

複数の土壌水分センサーから433 MHz伝送を読み取るのにarduinoを使用したいと思います。私はすべての送信が受信機に到達することは決してできないので、最初の送信が受信された瞬間からカウントダウンを設定したいと思います。別の送信が受信されると、カウントダウンが再び開始されます。それ以上の信号がない場合、またはすべての信号が受信された場合(例えば、4つのセンサ)、受信ユニットは停止し、そのポイントに到達したデータに基づいて決定する必要がある。433 MHz送信によるトリガーカウントダウン

私は<RCSwitch.h>ライブラリを使用して送受信しています。

受信部のループと1つのセンサは次のようになります。

#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(...)を使用して待つことはできません。それ以来、私はプロセッサが待機している間はデータを受信しません。

答えて

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

この状況では、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の値をさまざまな割り込み周期で使いこなすことができます。

割り込みを使用する主な利点は、割り込みを使用する主な利点は、割り込みを明示的に無効にしないと、タスクをブロックせず、瞬時に実行できることです。