Go Down

Topic: Do action at certain time using RTC (Read 8 times) previous topic - next topic

majenko


Quote
i am struggling to find any readup on how to program an RTC


The simplest would be to use your arduino to keep time: presumably the arduino is running all the time.



... and the least accurate.

Your 8pm light switch-on will end up at 4am after a while ;)

The Arduino isn't great at timing, chiefly because the resonator used for it isn't that accurate.  Plus the millis() function isn't all that accurate - it relies on a timer interrupt, and that can be delayed by other things happening when interrupts are disabled, or other interrupts are happening.

Not a good idea.
Get 10% off all 4D Systems TFT screens this month: use discount code MAJENKO10

MattHadfield


Quote
i am struggling to find any readup on how to program an RTC


The simplest would be to use your arduino to keep time: presumably the arduino is running all the time.



It is, however i may be away from my arduino for extended periods of time, so therefore would rather use an RTC so that even if the power drops once the power comes back on the whole thing restarts itself.


Quote
I have been considering the DS1307 RTC, do you think this will be suitable ?

Yes this is a good choice.
The Time library contains examples for the DS1307 RTC. http://playground.arduino.cc/Code/time
It also contains TimeAlarms which can be used to do things on a timed basis.


Thanks for that Larry, id been reading the library but had missed a very obvious link in there, reading through some of the examples this should be fairly easy to do.
Matthew Hadfield

Current Project (s) - Fishtank Controller - Arduino Uno

I maybe new, but i learn fast ;)

Nick_Pyner

I use the DS1307 and it is fine for this. You can simply use the standard time display procedure to do something specific. I use the snippet below to change a file name after midnight.

Code: [Select]

void loop() {
 GetClock();
 if (hour == 0 && minute == 0 && second <2)
 {
   getFileName();
 }
myFile = SD.open(filename, FILE_WRITE);//<<<<<<<<<<<<< OPEN

tra la la.....


LarryD

Using TimeAlarms you can:

Code: [Select]
#include <TimeAlarms.h>    //Changed Number of  alarms dtNBR_ALARMS to 30 max 255

void setup()
{
Alarm.alarmRepeat(12,15,0, Feed);              //  Lunch                      hh,mm,ss
Alarm.alarmRepeat(8,15,0, LightOn);           //  Turn on the light
//other alarm events

}
void loop()
{
}

//***********************************************
//Lunch
void Feed()
{
  // Put Lunch code here
}
//***********************************************
//Turn on the light
void LightOn()
{
  // Put LightOn code here
}
//***********************************************


The way you have it in your schematic isn't the same as how you have it wired up!

MattHadfield

Ok guys, got my DS1307 today, wired her up and shes working fine, however got one problem, the alarms wont trigger ! - any idea where im going wrong here as ive been reading the examples etc and cant see anything obvious -

Code: [Select]
#include <Wire.h>
#include "RTClib.h"
#include <Time.h>
#include <TimeAlarms.h>

RTC_DS1307 RTC;


// RELAYS

int pumprelay = 3;
int filterrelay = 4;
int lightsrelay = 5;
int heaterrelay = 6;

//BUTTONS

int FeedingButton = 7;
int HeaterButton = 18;

//LEDS

int lightsled = 8;
int pumpled = 9;
int filterled = 10;
int FeedingLED = 11;
int heaterled = 12;


// variables will change:
int buttonState = 0;         // variable for reading the pushbutton status

// the setup routine runs once when you press reset:
void setup() {
    Serial.begin(9600);
    Wire.begin();
    RTC.begin();

  if (! RTC.isrunning()) {
    Serial.println("RTC is NOT running!");
    // following line sets the RTC to the date & time this sketch was compiled
   
  }
 
  // initialize the digital pin as an output.
  pinMode(lightsrelay, OUTPUT);
  pinMode(lightsled, OUTPUT);   
  pinMode(heaterrelay, OUTPUT);
  pinMode(heaterled, OUTPUT);   
  pinMode(pumprelay, OUTPUT);
  pinMode(pumpled, OUTPUT); 
  pinMode(filterrelay, OUTPUT);
  pinMode(filterled, OUTPUT);   
  pinMode(FeedingButton, INPUT);
  pinMode(FeedingLED, OUTPUT);
  Serial.println("Startup Completed"); 
  FilterOn();
    Alarm.alarmRepeat(23,00,0, Night);  // 8:30am every day
    Alarm.alarmRepeat(06,00,0, Day);  // 8:30am every day
    Alarm.alarmRepeat(21,55,30, Feeding);  // 8:30am every day
}

// the loop routine runs over and over again forever:
void loop() {

  DateTime now = RTC.now();

    Serial.print(now.hour(), DEC);
    Serial.print(':');
    Serial.print(now.minute(), DEC);
    Serial.print(':');
    Serial.print(now.second(), DEC);
    Serial.println();

 
    // read the state of the pushbutton value:
  buttonState = digitalRead(FeedingButton);

  // check if the pushbutton is pressed.
  // if it is, the buttonState is HIGH:
  if (buttonState == HIGH) {     
    // Start Feeding Cyle   
      Feeding();
  }
  else {
    // Continue Normal Program

}

Alarm.delay(1000); // wait one second between clock display
}

void Feeding() {
   digitalWrite(FeedingLED, HIGH); // Set Feeding LED On
     Serial.println("Feeding Cycle Started"); 
  LightsOn();
  PumpOff();
  FilterOff();
  delay(6000);
  digitalWrite(FeedingLED, LOW); // Set Feeding LED Off
    Serial.println("Feeding Cycle Ended"); 
  LightsOff();
  PumpOn();
  FilterOn();
  delay(6000);

}

void Night () {
  LightsOff();
  PumpOff();
}

void Day () {
  LightsOn();
  PumpOn();
}

void LightsOn() {
digitalWrite(lightsrelay, HIGH); // Set Lights On
digitalWrite(lightsled, HIGH); // Set LED On
   Serial.println("Lights On"); 
}

void LightsOff() {
digitalWrite(lightsrelay, LOW); // Set Lights Off
digitalWrite(lightsled, LOW); // Set LED Off
   Serial.println("Lights Off"); 
}

void PumpOn() {
digitalWrite(pumprelay, HIGH); // Set Pump On
digitalWrite(pumpled, HIGH); // Set LED On
   Serial.println("Pump On"); 
}

void PumpOff() {
digitalWrite(pumprelay, LOW); // Set Pump Off
digitalWrite(pumpled, LOW); // Set LED Off
   Serial.println("Pump Off"); 
}

void FilterOn() {
digitalWrite(filterrelay, HIGH); // Set Filter On
digitalWrite(filterled, HIGH); // Set LED On
   Serial.println("Filter On"); 
}

void FilterOff() {
digitalWrite(filterrelay, LOW); // Set Filter Off
digitalWrite(filterled, LOW); // Set LED Off
   Serial.println("Filter Off"); 
}
Matthew Hadfield

Current Project (s) - Fishtank Controller - Arduino Uno

I maybe new, but i learn fast ;)

Go Up