如何让Arduino在要求的时间每天执行任务?

如何让Arduino在要求的时间每天执行任务?,arduino,Arduino,我是一名学生,只是Arduino的新手。我正在尝试制作一个自动植物浇水系统,该系统应该每天给植物浇水两次。是否有办法让Arduino在每天规定的时间准确完成任务,然后将自己设置为睡眠模式 每天都在规定的时间 如果您的Arduino在内部RC上计时,您将没有足够的精度(1%)。您的时钟将在1个月后7小时左右开始工作 如果需要(非常)高的精度,可以使用RTC模块(2ppm)。 您的时钟将在1个月后从大约5秒开始计时 或者您可以简单地使用millis()函数,该函数在Xtal振荡器(200ppm)上

我是一名学生,只是Arduino的新手。我正在尝试制作一个自动植物浇水系统,该系统应该每天给植物浇水两次。是否有办法让Arduino在每天规定的时间准确完成任务,然后将自己设置为睡眠模式

每天都在规定的时间

  • 如果您的Arduino在内部RC上计时,您将没有足够的精度(1%)。您的时钟将在1个月后7小时左右开始工作

  • 如果需要(非常)高的精度,可以使用RTC模块(2ppm)。 您的时钟将在1个月后从大约5秒开始计时

  • 或者您可以简单地使用
    millis()
    函数,该函数在Xtal振荡器(200ppm)上应该足够精确。 您的时钟将在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
}
#定义时间间隔_1_天86400000//1天=>24*60*60*1000
无符号长下一天=间隔1天;
void循环()
{
unsigned long currentDate=millis();//大约50天后的毫秒翻转(溢出)
如果(currentDate>nextDate//time已过,请执行操作
&¤tDate<(下一个日期+间隔25天))//处理毫秒()和*日期溢出。。。
{
nextDate+=INTERVAL_1_DAY;//您必须在此处使用nextDate,而不是像某些示例中那样使用当前日期,才能不进行扫描(每天使用一些µs)
//你在这里做什么
}
//您可以在这里添加一些空闲睡眠
//10秒睡眠会导致执行日期出现问题,例如[下午3点到下午3点+10秒]
//但是一些代码可以解决这个问题
}

为什么不看一看或其他任何可用的RTC。使用ds1302模块,任务只能执行一次,而不是每天。您每天都执行任务,而不是ds1302…您能给出一个示例吗?使用millis()函数,我添加了一个应保持最佳精度的示例(未测试)。我阅读了其他处理溢出的方法