the problem before it is caused by enable/disable the timer.
the another problem shows up: clearing the previously set alarms, so from this post:
Noch:
When set Timer get their AlarmID_t like this:
AlarmID_t aTimer = Alarm.timerRepeat(10, RepeatTest);
and then when you want to unschedule just disable/free (I am not test what is happening if you not disable before free it but for safe just disable and free) like this:
Alarm.disable(aTimer);
Alarm.free(aTimer);
we have to disable and set the alarm free.
hope this code below works for you
#include <Time.h>
#include <TimeAlarms.h>
//Serial data parsing RTC Function
#define TIME_MSG_LEN 11
#define TIME_HEADER 'T'
//===========end============
//Serial data parsing for ALARM
#define PJG_DATA 25
#define INT_SLAVE 'I'
//===========end============
//==Serial Variable for ROOM 1==
byte hourStart1 = 0;
byte minuteStart1 = 0;
byte hourStop1 = 0;
byte minuteStop1 = 0;
byte hourInterval1 = 0;
byte minuteInterval1 = 0;
//==Serial Variable for ROOM 2==
byte hourStart2 = 0;
byte minuteStart2 = 0;
byte hourStop2 = 0;
byte minuteStop2 = 0;
byte hourInterval2 = 0;
byte minuteInterval2 = 0;
//===========end===========
//==================ALARM ID==================
AlarmID_t alarmStart1, alarmStop1, alarmTimer1; //ID for interval Slave 1
AlarmID_t alarmStart2, alarmStop2, alarmTimer2; //ID for interval Slave 2
//====================end=====================
//error when I send I174117430001174217440002 --FIxed
// I174117430001174217440002
// I083008320001083108330002
// I082708300001083108330002
// I083508380001083608400002
void setup()
{
Serial.begin(9600);
// setSyncProvider(RTC.get); // the function to get the time from the RTC
// setSyncInterval(600);
// setTime(8,29,40,1,1,10); // set time to 8:29:40am Jan 1 2010
setTime(8,26,40,1,1,10);
if(timeStatus()!= timeSet)
Serial.println("Time isn't synced! ");
else
Serial.println(" time is synced! ");
delay(1000);
//ROOM 1
alarmStart1 = Alarm.alarmRepeat(8, 27, 00, Start1); //==start alarm mode interval slave 1
alarmStop1 = Alarm.alarmRepeat(8, 29, 30, Stop1); //==stop alarm mode interval slave 1
alarmTimer1 = Alarm.timerRepeat( 1 * SECS_PER_MIN, doRing1 );
Alarm.disable(alarmTimer1);
//ROOM 2
alarmStart2 = Alarm.alarmRepeat(8, 27, 10, Start2); //==start alarm mode interval slave 2
alarmStop2 = Alarm.alarmRepeat(8, 29, 30, Stop2); //==stop alarm mode interval slave 2
alarmTimer2 = Alarm.timerRepeat( 2 * SECS_PER_MIN, doRing2 );
Alarm.disable(alarmTimer2);
}
void loop(){
if(Serial.available())
{
char header = Serial.read();
if (header == TIME_HEADER)
{
showAlarmTime(alarmStart1);
showAlarmTime(alarmStop1);
showAlarmTime(alarmTimer1);
showAlarmTime(alarmStart2);
showAlarmTime(alarmStop2);
showAlarmTime(alarmTimer2);
//processSyncMessage();
}
else if (header == INT_SLAVE)
getNewAlarmTimesl();
}
time_t t = now();
digitalClockDisplay(t);
Alarm.delay(1000); // wait one second between clock display
}
void digitalClockDisplay(time_t t)
{
// digital clock display of the time
Serial.print(hour(t));
printDigits(minute(t));
printDigits(second(t));
Serial.println();
}
void printDigits(int digits)
{
Serial.print(":");
if(digits < 10)
Serial.print('0');
Serial.print(digits);
}
//========================reading UNIX TIME==========================//
void processSyncMessage()
{
time_t pctime = 0;
while (Serial.available() > TIME_MSG_LEN);
for(int i=0; i < TIME_MSG_LEN -1; i++)
{
char c = Serial.read();
if( c >= '0' && c <= '9'){
pctime = (10 * pctime) + (c - '0') ;
}
}
time_t t = pctime;
// RTC.set(t);
//setTime(t);
}
//=========CHANGE ALARM data from SERIAL MESSAGE =========//
void setAlarm( time_t alarmNumber, time_t start, time_t stop, time_t interval)
{
if(alarmNumber == 1)
{
Alarm.disable (alarmStart1);
Alarm.disable (alarmStop1);
Alarm.disable (alarmTimer1);
Alarm.free (alarmStart1);
Alarm.free (alarmStop1);
Alarm.free (alarmTimer1);
alarmStart1 = Alarm.alarmRepeat(start, Start1);
alarmStop1 = Alarm.alarmRepeat(stop, Stop1);
alarmTimer1 = Alarm.timerRepeat( interval, doRing1);
Alarm.disable (alarmTimer1);
}
else if(alarmNumber == 2)
{
Alarm.disable (alarmStart2);
Alarm.disable (alarmStop2);
Alarm.disable (alarmTimer2);
Alarm.free (alarmStart2);
Alarm.free (alarmStop2);
Alarm.free (alarmTimer2);
alarmStart2 = Alarm.alarmRepeat(start, Start2);
alarmStop2 = Alarm.alarmRepeat(stop, Stop2);
alarmTimer1 = Alarm.timerRepeat( interval, doRing2);
Alarm.disable (alarmTimer2);
}
Serial.print("Seting alarm ");
Serial.println(alarmNumber);
Serial.print("Start: ");
digitalClockDisplay(start);
Serial.print("Stop: ");
digitalClockDisplay(stop);
Serial.print("Interval : ");
digitalClockDisplay(interval);
}
void getNewAlarmTimesl()
{
unsigned long startTime = millis();
while(Serial.available() < 24)
{
if(millis() - startTime > 1000)
{
Serial.println("got header but timed out waiting for 24 bytes");
return;
}
}
//===========for ROOM 1===========
hourStart1 = getIntFromAscii(2);
minuteStart1 = getIntFromAscii(2);
hourStop1 = getIntFromAscii(2);
minuteStop1 = getIntFromAscii(2);
hourInterval1 = getIntFromAscii(2);
minuteInterval1 = getIntFromAscii(2);
//===========for ROOM 2===========
hourStart2 = getIntFromAscii(2);
minuteStart2 = getIntFromAscii(2);
hourStop2 = getIntFromAscii(2);
minuteStop2 = getIntFromAscii(2);
hourInterval2 = getIntFromAscii(2);
minuteInterval2 = getIntFromAscii(2);
//================================================================room 1
time_t newStart,newStop,newInterval;
newStart = AlarmHMS (hourStart1, minuteStart1, 0);
newStop = AlarmHMS (hourStop1, minuteStop1, 30);
newInterval = AlarmHMS (hourInterval1, minuteInterval1, 0);
setAlarm(1, newStart, newStop, newInterval);
Serial.println (hourStart1);
Serial.println (minuteStart1);
Serial.println (hourStart2);
Serial.println (minuteStart2);
//================================================================room 2
newStart = AlarmHMS (hourStart2, minuteStart2, 0);
newStop = AlarmHMS (hourStop2, minuteStop2, 30);
newInterval = AlarmHMS (hourInterval2, minuteInterval2, 0);
setAlarm(2, newStart, newStop, newInterval);
Serial.println (hourStart1);
Serial.println (minuteStart1);
Serial.println (hourStart2);
Serial.println (minuteStart2);
//setup();
}
int getIntFromAscii(int nbrDigits)
{
int val = 0;
for(int i=0; i < nbrDigits; i++) {
val = (val *10) + Serial.read()- '0';
}
return val;
}
/*==================== ALARM ROOM 1, START and STOP =================*/
//==================================================================================
void Start1(){
Alarm.enable(alarmTimer1);
Serial.println("ROOM 1111111 START");
delay(1000);
}
void Stop1(){
Alarm.disable(alarmTimer1);
Serial.println("ROOM 1111111 STOP");
delay(1000);
}
void doRing1(){
Serial.println("^^^^^^one^^^^^^");
delay(1000);
}
/*==================== ALARM ROOM 2, START and STOP =================*/
//==================================================================================
void Start2(){
Alarm.enable(alarmTimer2);
Serial.println("ROOM 2222222 START");
delay(1000);
}
void Stop2(){
Alarm.disable(alarmTimer2);
Serial.println("ROOM 2222222 STOP");
delay(1000);
}
void doRing2(){
Serial.println("2222~t w o~2222 ");
delay(1000);
}
void showAlarmTime(AlarmID_t id)
{
time_t alarmTime = Alarm.read(id);
if(alarmTime!= 0)
{
if( alarmTime <= SECS_PER_DAY)
Serial.print(" repeat alarm with ID ");
else
Serial.print(" once only alarm with ID ");
Serial.print(id, DEC);
Serial.print(" set for ");
digitalClockDisplay(alarmTime);
}
}
plant do not take up water via rootsystem when its dark. so when the lichts are on from 12:00 tot 00:00
i wat the pump to be on for 15 minutes en then turn it off for 45 minutes. that means i have 12 cycles when lights are on.
you can use many alarm IDs to enable/disable your pin. here's the idea (use Alarm.alarmRepeat):
alarm_ID_1: 12.01 - 12.15 --> enable pin D3
alarm_ID_2: 12.16 - 13.00 --> disable pin D3
alarm_ID_3: 13.01 - 13.15 --> enable pin D3
alarm_ID_4: 13.16 - 14.00 --> disable pin D3
....
...
alarm_ID_XX: 23.01 - 23.15 --> enable pin D3
alarm_ID_XX: 23.16 - 00.00 --> disable pin D3
to make the alarm ID more that 6, mem's said
You can change the number of alarms by changing the value of dtNbr_ALARMS in TimeAlarms.h as follows:
#define dtNBR_ALARMS XX
XX=number of alarms you need
maybe other member can help to make it simpler.