How to make Arduino perform a task daily at the required time?

不羁的心 提交于 2019-12-11 05:10:03

问题


I am a student, and just newbie to Arduino. I am trying to make an automatic plant watering system which should water the plants twice a day.Is there anyway to make the Arduino to perform the task exactly at the required time daily, and then set itself to sleep mode?


回答1:


exactly at the required time daily

  • If your Arduino is clocked on internal RC, you won't have enough precision (1%). Your clock will derivate from about 7hours after 1 month.

  • If you need to have a (very) good precision you may use a RTC module (2ppm). Your clock will derivate from about 5 seconds after 1 month.

  • Or you may simply use the millis() function that should be precise enough on Xtal oscillator (200ppm). Your clock will derivate from about 10 minutes after 1 month.

I would start with the last solution as it requires no additional components and improve with RTC is needed.

and then set itself to sleep mode

The AVR core has different level of sleep, some will maintain the clock (idle) and should be used with the millis() solution and some will not maintain clock (power down) but are more power efficient and could be used with RTC. The solution depends on how low power you need to be. Note that maximum low power won't be achieved with an Arduino board and IDE because of the power regulator and other components. To achieve the 200nA sleep described in Atmega328 datasheet it will require some work.

millis() example

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


来源:https://stackoverflow.com/questions/39148633/how-to-make-arduino-perform-a-task-daily-at-the-required-time

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!