Hello all, I am working on a project that takes an arduino nano, relay and ds3231 and turns on and off a water pump at a certain time each day to water my garden. I'm having trouble as my code was working a few days ago, but now wont work and my relay turns on and off in a loop. my code is as follows.
#include "Arduino.h"
#include <avr/sleep.h>
#include <Wire.h>
#include <DS3231.h>
DS3231 myRTC;
byte alarmDay;
byte alarmHour;
byte alarmMinute;
byte alarmSecond;
byte alarmBits;
bool alarmDayIsDay;
bool alarmH12;
bool alarmPM;
#define wakePin 3 // when low, makes 328P wake up, must be an interrupt pin (2 or 3 on ATMEGA328P)
#define relayPin 4
void setup() {
Wire.begin();
Serial.begin(9600);
pinMode(wakePin, INPUT_PULLUP);
pinMode(relayPin, HIGH);
digitalWrite(relayPin, HIGH);
reset_alarm();
}
void loop() {
if (digitalRead(wakePin) == LOW){
Serial.println("ALARM WORKED");
digitalWrite(relayPin, LOW);
delay(60000);
digitalWrite(relayPin, HIGH);
// set new alarm interupt
reset_alarm();
// go back to sleep
set_sleep_mode(SLEEP_MODE_PWR_DOWN);
sleep_enable();
MCUCR = bit (BODS) | bit (BODSE);
MCUCR = bit (BODS);
noInterrupts();
attachInterrupt(digitalPinToInterrupt(wakePin), sleepISR, LOW);
interrupts();
sleep_cpu();
}
}
void reset_alarm(){
alarmDay = 0;
alarmHour = 21;
alarmMinute = 43;
alarmSecond = 30;
alarmBits = 0b00001000; // Alarm 1 every day
alarmDayIsDay = false;
alarmH12 = false;
alarmPM = false;
myRTC.turnOffAlarm(1);
myRTC.setA1Time(
alarmDay, alarmHour, alarmMinute, alarmSecond,
alarmBits, alarmDayIsDay, alarmH12, alarmPM);
// enable Alarm 1 interrupts
myRTC.turnOnAlarm(1);
// clear Alarm 1 flag
myRTC.checkIfAlarm(1);
alarmMinute = 0xFF; // a value that will never match the time
alarmBits = 0b01100000; // Alarm 2 when minutes match, i.e., never
// Upload the parameters to prevent Alarm 2 entirely
myRTC.setA2Time(
alarmDay, alarmHour, alarmMinute,
alarmBits, alarmDayIsDay, alarmH12, alarmPM);
// disable Alarm 2 interrupt
myRTC.turnOffAlarm(2);
// clear Alarm 2 flag
myRTC.checkIfAlarm(2);
}
// When wakePin is brought LOW this interrupt is triggered FIRST (even in PWR_DOWN sleep)
void sleepISR() {
// Prevent sleep mode, so we don't enter it again, except deliberately, by code
sleep_disable();
// Detach the interrupt that brought us out of sleep
detachInterrupt(digitalPinToInterrupt(wakePin));
// Now we continue running the main Loop() just after we went to sleep
}
any help would be appreciated.