Set up scheduled program cycles #24

Merged
W1CDN merged 41 commits from program-cycle into main 2023-09-15 16:51:45 -05:00
Showing only changes of commit cbdc7ec939 - Show all commits

View File

@ -116,7 +116,7 @@ const char index_html[] PROGMEM = R"rawliteral(
<select name="inputSend" id="send-program"> <select name="inputSend" id="send-program">
<option value="0" >0 - Off</option> <option value="0" >0 - Off</option>
<option value="1">1 - Continuous</option> <option value="1">1 - Continuous</option>
<option value="2">2 - Cycle Program</option> <option value="2">2 - Cycle</option>
</select><br> </select><br>
Message (current value <b>%inputMsg%</b>): Message (current value <b>%inputMsg%</b>):
@ -129,8 +129,10 @@ const char index_html[] PROGMEM = R"rawliteral(
<option value="5">5 - MO5</option> <option value="5">5 - MO5</option>
</select></p> </select></p>
<p>Program start time <input type="datetime-local" id="js_start_time_unix_entry" /><br> <p>Cycle start time <input type="datetime-local" id="js_start_time_unix_entry" /><br>
Current value: <b><span id=current-start></span></b> Current value: <b><span id=current-start></span></b>, but only day-of-month HH:MM:SS are used.
Only applies when <em>Sending Program</em> is set to "2 - Cycle".
You cannot set a cycle start date more than a month in advance.
<!-- JS converts the entered start time to a unix timestamp, and copies that value <!-- JS converts the entered start time to a unix timestamp, and copies that value
to this hidden field so the user doesn't have to see it. --> to this hidden field so the user doesn't have to see it. -->
<input type="hidden" name="inputStartTimeUnix" id="js_start_time_unix" /></p> <input type="hidden" name="inputStartTimeUnix" id="js_start_time_unix" /></p>
@ -437,10 +439,10 @@ void setup() {
} }
// Are there any RTC alarms set? // Are there any RTC alarms set?
DateTime alarm_two = rtc.getAlarm2(); // Get the current time DateTime alarm_one = rtc.getAlarm1(); // Get the current time
char buff[] = "Alarm 2 set for at hh:mm:ss DDD, DD MMM YYYY"; char buff[] = "Alarm 1 set for at hh:mm:ss DDD, DD MMM YYYY";
Serial.print(alarm_two.toString(buff)); Serial.print(alarm_one.toString(buff));
Serial.println(" (only accurate to day of month)"); Serial.println(" (only HH:MM:SS day-of-month are accurate)");
// Timer example, blink main LED // Timer example, blink main LED
pinMode(LED_BUILTIN, OUTPUT); // set LED pin to OUTPUT pinMode(LED_BUILTIN, OUTPUT); // set LED pin to OUTPUT
@ -575,14 +577,17 @@ void setup() {
Serial.println(yourInputTime); Serial.println(yourInputTime);
// update the RTC time // update the RTC time
rtc.adjust(DateTime(yourInputTime)); rtc.adjust(DateTime(yourInputTime));
DateTime now = rtc.now();
// Might work to fix random errors? If date is far in the future, // Might work to fix random errors? If date is far in the future,
// try to update again. // try to update again.
while(rtc.now().year() > 2040){ // replace if with while if you want it to try a bunch...
if(now.year() > 2040){
Serial.print("Year is ");
Serial.println(now.year());
Serial.println("RTC can't set time. Trying again."); Serial.println("RTC can't set time. Trying again.");
rtc.adjust(DateTime(yourInputTime)); rtc.adjust(DateTime(yourInputTime));
} }
;
DateTime now = rtc.now();
Serial.print("UTC time from browser: "); Serial.print("UTC time from browser: ");
Serial.print(now.year(), DEC); Serial.print(now.year(), DEC);
Serial.print('/'); Serial.print('/');
@ -627,12 +632,12 @@ void setup() {
// Serial.println(active_tasks); // Serial.println(active_tasks);
// Use alarm built into RTC // Use alarm built into RTC
rtc.setAlarm2(DateTime(yourInputStartTimeUnix), DS3231_A2_Date); rtc.setAlarm1(DateTime(yourInputStartTimeUnix), DS3231_A1_Date);
//rtc.setAlarm1(DateTime(2020, 6, 25, 15, 34, 0), DS3231_A2_Date); //rtc.setAlarm1(DateTime(2020, 6, 25, 15, 34, 0), DS3231_A2_Date);
DateTime alarm_two = rtc.getAlarm2(); // Get the current time DateTime alarm_one = rtc.getAlarm1(); // Get the current alarm time
char buff[] = "Alarm 2 set for at hh:mm:ss DDD, DD MMM YYYY"; char buff[] = "Alarm 1 set for at hh:mm:ss DDD, DD MMM YYYY";
Serial.print(alarm_two.toString(buff)); Serial.print(alarm_one.toString(buff));
Serial.println(" (only accurate to day of month)"); Serial.println(" (only HH:MM:SS day-of-month are accurate)");
} }
// else { // else {
// inputMessage = "No message sent"; // inputMessage = "No message sent";
@ -659,20 +664,17 @@ void loop() {
// Timers // Timers
timer.tick(); timer.tick();
// This function from https://github.com/garrysblog/DS3231-Alarm-With-Adafruit-RTClib-Library/blob/master/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired.ino // This statement from https://github.com/garrysblog/DS3231-Alarm-With-Adafruit-RTClib-Library/blob/master/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired/DS3231-RTClib-Adafruit-Alarm-Poll-alarmFired.ino
// Check if alarm by polling by using alarmFired // Check if alarm by polling SQW alarm pin
// We don't want old alarms, though. if (yourInputSend == 2 & digitalRead(alarmPin) == LOW) {
//& (rtc.getAlarm2() >= rtc.now())
// if ((rtc.alarmFired(2) == 1) ){
if (digitalRead(alarmPin) == LOW) {
// Print current time and date // Print current time and date
DateTime now = rtc.now(); // Get the current time DateTime now = rtc.now(); // Get the current time
char buff[] = "Alarm triggered at hh:mm:ss DDD, DD MMM YYYY"; char buff[] = "Alarm triggered at hh:mm:ss DDD, DD MMM YYYY";
Serial.println(now.toString(buff)); Serial.println(now.toString(buff));
// Disable and clear alarm // Disable and clear alarm
rtc.clearAlarm(2); rtc.clearAlarm(1);
rtc.clearAlarm(2); // clear the other one just in case
} }
// DateTime now = rtc.now(); // DateTime now = rtc.now();
@ -742,7 +744,7 @@ void loop() {
morseToSend_blink.Update(); morseToSend_blink.Update();
// if you want to send cycle code and it's not sending, then start it up // if you want to send cycle code and it's not sending, then start it up
} else if((yourInputSend == 2) & (morseToSend.IsRunning() == true)){ } else if((yourInputSend == 2) & (morseToSend.IsRunning() == false)){
morseToSend.Reset().Update(); morseToSend.Reset().Update();
morseToSend_blink.Reset().Update(); morseToSend_blink.Reset().Update();