如何让Arduino每天在所需的时间执行任务?

时间:2016-08-25 14:59:07

标签: arduino

我是学生,只是Arduino的新手。我正在尝试制作一个自动植物浇水系统,它应该每天给植物浇水两次。无论如何,要让Arduino在每天所需的时间完成任务,然后让自己睡觉模式?

1 个答案:

答案 0 :(得分:1)

  

正好在每天所需的时间

  • 如果您的Arduino使用内部RC,您将无法获得足够的精度(1%)。你的时钟将在1个月后的7小时内推出。

  • 如果您需要(非常)良好的精度,您可以使用RTC模块(2ppm)。 你的时钟将在1个月后大约5秒钟推出。

  • 或者您可以简单地使用{X}振荡器(200ppm)上应该足够精确的millis()函数。 你的时钟将在1个月后的大约10分钟内推出。

我将从最后一个解决方案开始,因为它不需要额外的组件,并且需要使用RTC进行改进。

  

然后将自己设置为睡眠模式

AVR内核具有不同的睡眠级别,有些会保持时钟(空闲),应该与millis()解决方案一起使用,有些不会保持时钟(掉电)但功率效率更高,可能是与RTC一起使用。解决方案取决于您需要的低功耗。请注意,由于功率调节器和其他组件,使用Arduino板和IDE无法实现最大低功耗。要实现Atmega328数据表中描述的200nA睡眠,需要做一些工作。

millis()示例

#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
}