Ya know I think I may have finally figured it out. Think I'll share in case someone else is trying to do the same. the DS3231 library is from rinkydink.
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DS3231.h>
#include <Sabertooth.h>
Sabertooth ST1[2] = { Sabertooth(128), Sabertooth(129) } ;
LiquidCrystal_I2C lcd(0x27,20,4) ;
DS3231 rtc(SDA, SCL) ;
Time t ;
unsigned long currentMillis;
unsigned long interval = 5000UL;
unsigned long startfun;
unsigned long startMillis;
boolean closed_state = 0 ;
boolean open_state = 1 ;
boolean opening_state = 0 ;
boolean closing_state = 0 ;
int Hor ;
int Min ;
int Sec ;
boolean relay_on = false ;
boolean relay_off = true ;
int induct = A0 ;
//int inductB = A1 ;
int Relay = 8 ;
int val = 0 ;
//....................................
void setup()
{ Serial.begin(9600) ;
Wire.begin() ;
rtc.begin() ;
SabertoothTXPinSerial.begin(9600) ;
Sabertooth::autobaud(SabertoothTXPinSerial) ;
lcd.init() ;
lcd.begin(20,4) ;
lcd.backlight() ;
pinMode(Relay,OUTPUT) ;
digitalWrite(Relay,HIGH) ;
startMillis = millis();
lcd.setCursor(0,0) ;
lcd.print("Flowers") ;
delay(2000) ;
lcd.clear() ; }
//....................................
void loop()
{ val = analogRead(induct) ;
currentMillis = millis() ;
t = rtc.getTime() ;
Hor = t.hour ;
Min = t.min ;
Sec = t.sec ;
if ((currentMillis - startMillis) >= 1000UL){
lcd.setCursor(0,0) ;
lcd.print("Time: ") ;
lcd.print(rtc.getTimeStr()) ;
lcd.setCursor(0,1) ;
lcd.print("Date: ") ;
lcd.print(rtc.getDateStr()) ;
startMillis = currentMillis ;}
//....................................
if( Hor == 7 && (Min == 30 || Min == 31))
{ OpenFunc () ; }
//....................................
if(Hor == 19 && (Min == 30 || Min == 31))
{ CloseFunc () ; }}
//....................................
void OpenFunc(){
if (relay_off and closed_state){
digitalWrite(Relay,LOW) ;
startfun = currentMillis;
relay_on = true ;
relay_off = false;
} else {
if((currentMillis - startfun)>= interval){
if (relay_on){
lcd.setCursor(0,3) ;
lcd.print("Opening...") ;
closed_state = false ;
opening_state = true ;
ST1[0].motor(1, 60) ;
ST1[1].motor(1, 60) ;
if (val <= 500 or (Hor == 7 && Min == 31 && Sec == 55)){
ST1[0].motor(1, 0) ;
ST1[1].motor(1, 0) ;
delay(3500) ;
opening_state = false ;
open_state = true ;
digitalWrite(Relay,HIGH) ;
relay_off = true ;
lcd.clear() ;
lcd.setCursor(8,3) ;
lcd.print("Open") ;
relay_on = false ;
}
}
}
}
}
//....................................
void CloseFunc(){
if (relay_off and open_state){
digitalWrite(Relay,LOW) ;
startfun = currentMillis ;
relay_on = true ;
relay_off = false;
} else {
if((currentMillis - startfun)>= interval){
if (relay_on){
lcd.setCursor(0,3) ;
lcd.print("Closing...") ;
open_state = false ;
closing_state = true ;
ST1[0].motor(1, -60) ;
ST1[1].motor(1, -60) ;
if (val <=500 or (Hor == 19 && Min == 31 && Sec == 55)){
ST1[0].motor(1, 0) ;
ST1[1].motor(1, 0) ;
delay(3500) ;
closing_state = false ;
closed_state = true ;
digitalWrite(Relay,HIGH) ;
relay_off = true ;
lcd.clear() ;
lcd.setCursor(7,3) ;
lcd.print("Closed.") ;
relay_on = false ;
}
}
}
}
}
thanks for your suggestions Paul