I build an Alarm Clock with my arduino with a rotary encoder to set the timer and a button to change between Sec, Min, H and days and to stop the alarm but when I turn the rotary encoder the led starts blinking but it should start only when the timer is over.please help me with this problem THANKS
Code:
#include <RTClib.h>
#include <LiquidCrystal_I2C.h>
#include <BasicEncoder.h>
#include <Wire.h>
#include <TimeLib.h>
#include <DS1307RTC.h>
const int8_t pinA = 3; // Rotary encoder CLK
const int8_t pinB = 4; // Rotary encoder DT
const int buttonPin = 6; // Button Pin
int buttonState = HIGH; // Initial button state (HIGH due to INPUT_PULLUP)
unsigned long previousMillis = 0;
const long interval = 500;
BasicEncoder encoder(pinA, pinB);
RTC_DS3231 rtc;
LiquidCrystal_I2C lcd(0x26, 16, 2);
long oldPosition = -999;
#define CLOCK_INTERRUPT_PIN 2
int Dalarm = 0;
int Halarm = 0;
int Malarm = 0;
int Salarm = 0;
bool isTimer = false;
bool isAlarm = false;
const int AlarmPin = 12;
int indicator = 0;
const int RTswitch = 5; // Rotary encoder switch
bool isAlarmTimeRunning = false;
void pciSetup(byte pin) // Setup pin change interrupt on pin
{
*digitalPinToPCMSK(pin) |= bit(digitalPinToPCMSKbit(pin)); // enable pin
PCIFR |= bit(digitalPinToPCICRbit(pin)); // clear outstanding interrupt
PCICR |= bit(digitalPinToPCICRbit(pin)); // enable interrupt for group
}
void setup_encoders(int a, int b) {
uint8_t old_sreg = SREG; // save the current interrupt enable flag
noInterrupts();
pciSetup(a);
pciSetup(b);
encoder.reset();
SREG = old_sreg; // restore the previous interrupt enable flag state
}
ISR(PCINT2_vect) // pin change interrupt for D0 to D7
{
encoder.service();
}
void setup() {
Serial.begin(115200);
pinMode(AlarmPin, OUTPUT); // LED
pinMode(buttonPin, INPUT);
pinMode(RTswitch, INPUT_PULLUP);
setup_encoders(pinA, pinB);
encoder.set_reverse();
lcd.init();
lcd.backlight();
lcd.clear();
if (!rtc.begin()) {
Serial.println("Couldn't find RTC!");
Serial.flush();
abort();
}
if (rtc.lostPower()) {
Serial.println("RTC lost power, set the time!");
}
rtc.disable32K();
// Making it so, that the alarm will trigger an interrupt
pinMode(CLOCK_INTERRUPT_PIN, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(CLOCK_INTERRUPT_PIN), onAlarm, FALLING);
// set alarm 1, 2 flag to false (so alarm 1, 2 didn't happen so far)
// if not done, this easily leads to problems, as both register aren't reset on reboot/recompile
rtc.clearAlarm(1);
rtc.clearAlarm(2);
// stop oscillating signals at SQW Pin
// otherwise setAlarm1 will fail
rtc.writeSqwPinMode(DS3231_OFF);
// turn off alarm 2 (in case it isn't off already)
// again, this isn't done at reboot, so a previously set alarm could easily go overlooked
rtc.disableAlarm(2);
}
void loop() {
DateTime now = rtc.now();
DateTime future(now + TimeSpan(0, Halarm, Malarm, Salarm)); //total seconds or // days,hrs,mins,secs
char timeNow[10] = "hh:mm:ss";
rtc.now().toString(timeNow);
int encoder_change = encoder.get_change();
if (encoder_change) {
Serial.println(encoder.get_count());
}
buttonState = digitalRead(buttonPin);
unsigned long currentMillis = millis();
// Entprellung des Buttons
static unsigned long lastButtonPress = 0;
if (buttonState == LOW && (currentMillis - lastButtonPress > 50)) {
lastButtonPress = currentMillis;
if (indicator < 3 && !isAlarmTimeRunning) {
indicator = indicator + 1;
} else {
if (!isAlarmTimeRunning) {
indicator = 0;
}
}
if (isAlarm) {
isAlarm = false;
isAlarmTimeRunning = false;
}
}
if (isAlarm) {
lcd.setCursor(0, 0);
lcd.clear();
Serial.print("timeNow:");
Serial.println(timeNow);
lcd.print(timeNow);
if (currentMillis - previousMillis >= interval) {
previousMillis = currentMillis;
if (digitalRead(AlarmPin) == LOW && isAlarm) {
digitalWrite(AlarmPin, HIGH);
} else {
digitalWrite(AlarmPin, LOW);
}
}
} else {
digitalWrite(AlarmPin, LOW);
}
if (digitalRead(RTswitch) == LOW) {
isTimer = true;
Serial.println("Start Timer");
}
if (Salarm > 60) {
Salarm = Salarm - 60;
}
if (Malarm > 60) {
Malarm = Malarm - 60;
}
if (Halarm > 24) {
Halarm = Halarm - 24;
}
if (isTimer) {
isAlarmTimeRunning = true;
isTimer = false;
Serial.println("...");
if (!rtc.setAlarm1(future, DS3231_A1_Hour)) {
Serial.println("Error, alarm wasn't set!");
} else {
Serial.print("Alarm will occur at: ");
}
Serial.print(future.year(), DEC);
Serial.print('/');
Serial.print(future.month(), DEC);
Serial.print('/');
Serial.print(future.day(), DEC);
Serial.print(' ');
Serial.print(future.hour(), DEC);
Serial.print(':');
Serial.print(future.minute(), DEC);
Serial.print(':');
Serial.print(future.second(), DEC);
Serial.println();
}
if (indicator == 0) {
Salarm = encoder.get_count();
}
if (indicator == 1) {
Malarm = encoder.get_count();
}
if (indicator == 2) {
Halarm = encoder.get_count();
}
if (indicator == 3) {
Dalarm = encoder.get_count();
}
if (!isAlarm && !isAlarmTimeRunning) {
lcd.setCursor(0, 0);
lcd.clear();
lcd.print(timeNow);
lcd.setCursor(0, 1);
lcd.print(Dalarm);
lcd.print(":");
lcd.print(Halarm);
lcd.print(":");
lcd.print(Malarm);
lcd.print(":");
lcd.print(Salarm);
}
if (rtc.alarmFired(1)) {
rtc.clearAlarm(1);
Serial.println("Alarm cleared");
Serial.print("Temperature: ");
Serial.print(rtc.getTemperature());
Serial.println(" C");
}
if (isAlarmTimeRunning) {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(timeNow);
lcd.print(" ");
lcd.print("x");
lcd.setCursor(0, 1);
lcd.print(Dalarm);
lcd.print(":");
lcd.print(Halarm);
lcd.print(":");
lcd.print(Malarm);
lcd.print(":");
lcd.print(Salarm);
} else {
lcd.clear();
lcd.setCursor(0, 0);
lcd.print(timeNow);
lcd.print(" ");
lcd.print("o");
if (indicator == 0) {
lcd.print(" S");
}
if (indicator == 1) {
lcd.print(" M");
}
if (indicator == 2) {
lcd.print(" H");
}
if (indicator == 3) {
lcd.print(" D");
}
lcd.setCursor(0, 1);
lcd.print(Dalarm);
lcd.print(":");
lcd.print(Halarm);
lcd.print(":");
lcd.print(Malarm);
lcd.print(":");
lcd.print(Salarm);
}
delay(1000);
}
void onAlarm() {
isAlarm = true;
Serial.println("Alarm occurred!");
}


