Planning + understanding RTC project. Throw me a rope please?

Hi Guys,

been trying to read as much as I can about using the DS3231 RTC, but my middle-aged brain is struggling tbh.

Quick outline:

I want a very simple code to read the time from DS3231 and then "do stuff" at a particular time of day for a particular length of time, then stop until the same time next day.

So far Ive just been getting lost in code and libraries and fuctionality that I dont need/want...atm Im using this to set and read time;

[code]
/*----------------------------------------------------------------------*
 * Display the date and time from a DS3231 or DS3232 RTC every second.  *
 * Display the temperature once per minute. (The DS3231 does a          *
 * temperature conversion once every 64 seconds. This is also the       *
 * default for the DS3232.)                                             *
 *                                                                      *
 * Set the date and time by entering the following on the Arduino       *
 * serial monitor:                                                      *
 *    year,month,day,hour,minute,second,                                *
 *                                                                      *
 * Where                                                                *
 *    year can be two or four digits,                                   *
 *    month is 1-12,                                                    *
 *    day is 1-31,                                                      *
 *    hour is 0-23, and                                                 *
 *    minute and second are 0-59.                                       *
 *                                                                      *
 * Entering the final comma delimiter (after "second") will avoid a     *
 * one-second timeout and will allow the RTC to be set more accurately. *
 *                                                                      *
 * No validity checking is done, invalid values or incomplete syntax    *
 * in the input will result in an incorrect RTC setting.                *
 *                                                                      *
 * Jack Christensen 08Aug2013                                           *
 *                                                                      *
 * Tested with Arduino 1.0.5, Arduino Uno, DS3231/Chronodot, DS3232.    *
 *                                                                      *
 * This work is licensed under the Creative Commons Attribution-        *
 * ShareAlike 3.0 Unported License. To view a copy of this license,     *
 * visit http://creativecommons.org/licenses/by-sa/3.0/ or send a       *
 * letter to Creative Commons, 171 Second Street, Suite 300,            *
 * San Francisco, California, 94105, USA.                               *
 *----------------------------------------------------------------------*/ 
 
#include <DS3232RTC.h>        //http://github.com/JChristensen/DS3232RTC
#include <Streaming.h>        //http://arduiniana.org/libraries/streaming/
#include <Time.h>             //http://playground.arduino.cc/Code/Time
#include <Wire.h>             //http://arduino.cc/en/Reference/Wire

void setup(void)
{
    Serial.begin(115200);
    
    //setSyncProvider() causes the Time library to synchronize with the
    //external RTC by calling RTC.get() every five minutes by default.
    setSyncProvider(RTC.get);
    Serial << F("RTC Sync");
    if (timeStatus() != timeSet) Serial << F(" FAIL!");
    Serial << endl;
}

void loop(void)
{
    static time_t tLast;
    time_t t;
    tmElements_t tm;

    //check for input to set the RTC, minimum length is 12, i.e. yy,m,d,h,m,s
    if (Serial.available() >= 12) {
        //note that the tmElements_t Year member is an offset from 1970,
        //but the RTC wants the last two digits of the calendar year.
        //use the convenience macros from Time.h to do the conversions.
        int y = Serial.parseInt();
        if (y >= 100 && y < 1000)
            Serial << F("Error: Year must be two digits or four digits!") << endl;
        else {
            if (y >= 1000)
                tm.Year = CalendarYrToTm(y);
            else    //(y < 100)
                tm.Year = y2kYearToTm(y);
            tm.Month = Serial.parseInt();
            tm.Day = Serial.parseInt();
            tm.Hour = Serial.parseInt();
            tm.Minute = Serial.parseInt();
            tm.Second = Serial.parseInt();
            t = makeTime(tm);
            RTC.set(t);        //use the time_t value to ensure correct weekday is set
            setTime(t);        
            Serial << F("RTC set to: ");
            printDateTime(t);
            Serial << endl;
            //dump any extraneous input
            while (Serial.available() > 0) Serial.read();
        }
    }
    
    t = now();
    if (t != tLast) {
        tLast = t;
        printDateTime(t);
        if (second(t) == 0) {
            float c = RTC.temperature() / 4.;
            float f = c * 9. / 5. + 32.;
            Serial << F("  ") << c << F(" C  ") << f << F(" F");
        }
        Serial << endl;
    }
}

//print date and time to Serial
void printDateTime(time_t t)
{
    printDate(t);
    Serial << ' ';
    printTime(t);
}

//print time to Serial
void printTime(time_t t)
{
    printI00(hour(t), ':');
    printI00(minute(t), ':');
    printI00(second(t), ' ');
}

//print date to Serial
void printDate(time_t t)
{
    printI00(day(t), 0);
    Serial << monthShortStr(month(t)) << _DEC(year(t));
}

//Print an integer in "00" format (with leading zero),
//followed by a delimiter character to Serial.
//Input value assumed to be between 0 and 99.
void printI00(int val, char delim)
{
    if (val < 10) Serial << '0';
    Serial << _DEC(val);
    if (delim > 0) Serial << delim;
    return;
}

Is this the minimal amount of code I can get away with? How would I go about using Arduino to say, start a water pump to water my tomatoes for 15 minutes at 7.30pm everyday?

Please try to keep your help confined to baby talk(for now) until I get up to speed...I am a relatively quick learner though.

Thank you all for your time.

Instructables are notoriously bad for Arduino projects, but this one is so simple it may at least give you some ideas:

int motorPin = A0;
int blinkPin = 13;

int watertime = 5000; // how long to water in miliseconds
int waittime = 3600000; // how long to wait between watering

void setup()
{
	pinMode(motorPin, OUTPUT);
	pinMode(blinkPin, OUTPUT);
}

void loop()
{
	digitalWrite(motorPin, HIGH);
	digitalWrite(blinkPin, HIGH);
	delay(watertime);
	digitalWrite(motorPin, LOW);
	digitalWrite(blinkPin, LOW);
	delay(waittime);
}

Cheers for that, but I have been lead to believe that relying on the Arduinos internal timer is not a good idea for a few reasons. I certainly do appreciate your input tho, thank you.

Just google "Arduino DS3231 water pump" and start reading. Then pull out the parts you need for maintaining the RTC and its associated timing. I found this one interesting:

http://fishtankprojects.com/diy-aquarium-projects/arduino-controlled-dosing-pumps.html

Since, I assume, you already have a 3231, You might find the TimeAlarms library useful. It goes with the Time library you already have. There should be suitable examples therein. Note that there is not so much written about the 3231 but it runs the same code as the DS1307 unchanged.

The simple time code I use is at
http://bildr.org/2011/03/ds1307-arduino/
no libraries.

Here is a snippet for getting an event at the start of a loop. I only have one event per day and this is all that is needed.

 GetClock();
  if (hour == 0 && minute == 0 && second <2)
  {
    getFileName();
  }

That instructables code is about par for the course for instructables. Using a delay is not unreasonable, but using them like that is really stupid. It is wasting the capabilities of the Arduino by tying it up to just serve a trivial purpose. It also presupposes you will never have a power failure.

Thank you Nick, that looks like it may be what Im after...gonna have a nose now and see if I can make sense of it.

Im sure I'll be back if I cant :slight_smile: