2016-08-25 8 views
1

私は学生ですが、Arduinoの初心者です。私は自動プラント給水システムを植物に1日2回給水するようにしています。毎日所要時間に正確に作業を実行するためにArduinoを作成してスリープモードにしていますか?必要な時に正確にArduinoに必要な時間に毎日タスクを実行させる方法を教えてください。

+0

は、なぜあなたはhttp://playground.arduino.cc/Main/DS1302見たり利用可能な他のRTCを取ることはありません。 – Ouss4

+0

ds1302モジュールでは、タスクは毎日ではなく1回だけ実行できます。 –

+0

あなたはDS1302ではなく、毎日します... – Ouss4

答えて

1

毎日

  • あなたのArduinoは内部RCにクロックされている場合は、十分な精度(1%)を持っていません。あなたの時計は1ヶ月後に約7時間から派生します。

  • 非常に良い精度が必要な場合は、RTCモジュール(2ppm)を使用することができます。 時計は1ヶ月後約5秒から派生します。

  • Xtal発振器(200ppm)で十分に正確なmillis()関数を使用するだけでもかまいません。 時計は1ヶ月後に約10分から派生します。

追加のコンポーネントを必要とせず、RTCで改善する必要があるため、最後の解決策から始めます。

、その後AVRコアが睡眠の異なったレベルを有し、いくつかはクロックを維持する(アイドル)とmillis()溶液で使用されるべきであり、いくつかはクロックを維持しないであろうだろうスリープモードに

に自身を設定します(パワーダウン)、より電力効率が高く、RTCで使用することができます。解決方法は、必要な低消費電力に依存します。電源レギュレータやその他のコンポーネントのために、ArduinoボードとIDEで最大の低消費電力を達成できないことに注意してください。 Atmega328のデータシートに記載されている200nAのスリープを達成するには、いくつかの作業が必要です。

ミリ()の例

#define INTERVAL_1_DAY 86400000 // 1day => 24*60*60*1000 

unsigned long nextDate = INTERVAL_1_DAY; 

void loop() 
{ 
    unsigned long currentDate = millis(); //millis rollover (overflow) after about 50 days 

    if(currentDate > nextDate // time elapsed, do action 
     && currentDate < (nextDate + INTERVAL_25_DAY)) //treatement of the overflow of millis() and *Dates ... 
    { 
     nextDate += INTERVAL_1_DAY; //you have to use nextDate here and not current date like in some examples to have no sweep (some µs each day) 

     // do your action here 
    } 

    // you may add some idle sleep here 
    // 10s sleep would give a execution date glitch e.g. [3pm to 3pm+10s] 
    // but some code can fix this 
} 
+0

millis()関数を使用しています –

+0

最高の精度を維持する必要がある(テストされていない)サンプルを追加しました – Julien

関連する問題