2016-08-25 29 views
1

我是一名學生,剛剛成爲Arduino的新手。我試圖製作一個自動植物澆水系統,它應該每天爲植物澆水兩次。無論如何,要讓Arduino在每天所需的時間完全執行任務,然後將自己設置爲睡眠模式?如何讓Arduino在規定的時間每天執行一項任務?

+0

你爲什麼不看看http://playground.arduino.cc/Main/DS1302或任何其他RTC可用。 – Ouss4

+0

使用ds1302模塊,任務只能每天完成一次。 –

+0

你每天都做,而不是DS1302 ... – Ouss4

回答

1

正是在日常

  • 如果你的Arduino是同步於內部RC所需要的時間,你不會有足夠的精度(1%)。你的時鐘將從1個月後約7小時衍生而來。

  • 如果您需要非常好的精度,您可以使用RTC模塊(2ppm)。 你的時鐘將在1個月後從約5秒推導出來。

  • 或者您可以簡單地使用millis()函數,該函數在Xtal振盪器(200ppm)上應該足夠精確。 您的時鐘將在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

相關問題