Om någon är nyfiken på koden:
Jag använder dessa bibliotek:
Kod: Markera allt
#include <LiquidCrystal_I2C.h>
#include <DS1302RTC.h>
#include <Time.h>
#include <Wire.h>
#include <TimeAlarms.h>
Detta är min huvudrutin:
Kod: Markera allt
void loop() // Huvudflöde
{
timeNow = millis(); // läs tiden varje varv
if (status == 0)
{
visaTid(); // visa klockan
keyAlarm(); // tangentrutin för snooze och stäng av
}
if (status == 1)
{
visaAlarm(); // visa väckningstid
keySetting(); // tangentrutin för ställa in väckning
}
if ((alarm == 0) && (hh == hhSet && mm == mmSet && ss == 0) && (setdag != 0)) // larm på tid
{
delay (1000); // setdag; avstängd = 0, vecka = 1, vardagar = 2, tredagars = 3
if(setdag == 1) alarm = 2;
if((setdag == 2) && (dd > 1) && (dd < 7)) alarm = 2;
if((setdag == 3) && (dd > 2) && (dd < 6)) alarm = 2;
}
larmrutin(); // hantera larm
if (timeNow > (timeKey + 60000)) lcd.noBacklight();
}
Vanlig tidvisning:
Kod: Markera allt
void visaTid() // rutin
{
if (timeNow > (timeDisp + 1000)) // har det gått 1 s?
{
timeDisp = timeNow;
// Display time centered on the upper line
lcd.setCursor(1, 0);
lcd.print("Time: ");
print2digits(hour());
lcd.print(":");
print2digits(minute());
lcd.print(":");
print2digits(second());
// Display abbreviated Day-of-Week in the lower left corner
lcd.setCursor(0, 1);
lcd.print(dayShortStr(weekday()));
// Display date in the lower right corner
lcd.setCursor(5, 1);
lcd.print(" ");
lcd.print(year());
lcd.print("-");
print2digits(month());
lcd.print("-");
print2digits(day());
// Read and save time (weekday, hour, minute)
dd = weekday(); // 1=söndag, 7=lördag
hh = hour();
mm = minute();
ss = second();
}
}
void print2digits(int number) // Output leading zero
{
if (number >= 0 && number < 10)
{
lcd.write('0');
}
lcd.print(number);
}
Larmrutinen:
Kod: Markera allt
void larmrutin()
{
if (alarm == 2)
{
digitalWrite(alarmPin, HIGH); // alarm
if (timeNow > (beepTime + 5000))
{
tone(tonePin , 800, 1000); // pin, frequency, duration
beepTime = timeNow;
}
}
if (alarm == 1) // snooze
{
if (timeNow > (snooze + 300000))
{
alarm = 2;
digitalWrite (alarmPin, LOW);
}
else digitalWrite (alarmPin, HIGH);
}
if (alarm == 0) digitalWrite (alarmPin, LOW); // off
}
Avkoda knapptryck:
Kod: Markera allt
void keyAlarm()
{
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) // knapp tryckt
{
delay (10);
lcd.backlight();
if (timeread == 0)
{
timeKey = timeNow;
timeread = 1;
}
}
if (timeread == 1)
{
if (buttonState == HIGH) // knapp uppe
{
delay (10);
timeread = 0;
if (timeNow > (timeKey + 5000)) // väckningstid
{
status = 1;
// timeread = 0;
lcd.clear();
}
else if (alarm > 0)
{
if (timeNow > (timeKey + 100)) // klick = snooze, dubbelklick = off
{
alarm = alarm - 1;
// timeread = 0;
snooze = timeNow;
}
}
}
}
}
Visa väckningstid på display:
Kod: Markera allt
void visaAlarm()
{
lcd.setCursor(0, 0);
lcd.print("Alarm: ");
lcd.print(hhSet);
lcd.print(":");
lcd.print(mmSet);
lcd.print(":");
lcd.print("00");
lcd.print(" ");
lcd.print(setdag);
lcd.setCursor(0, 1);
lcd.print("Change");
lcd.print(":");
}
Ställa in väckningstid:
Kod: Markera allt
void keySetting()
{
buttonState = digitalRead(buttonPin);
if (buttonState == LOW) // knapp tryckt
{
delay (10);
lcd.backlight();
if (timeread == 0)
{
timeKey = timeNow;
timeread = 1;
}
}
if (timeread == 1)
{
if (buttonState == HIGH) // knapp uppe
{
delay (10);
if (timeNow > (timeKey + 5000)) // normal tidvisning
{
status = 0;
timeread = 0;
lcd.clear();
}
else if (timeNow > (timeKey + 2000)) // nästa pos
{
timeread = 0;
setpos++;
if (setpos >= 3) setpos = 0;
// Display what to set
lcd.setCursor(9, 1);
if (setpos == 0) lcd.print("Day ");
if (setpos == 1) lcd.print("Hour ");
if (setpos == 2) lcd.print("Minute ");
}
else if (timeNow > (timeKey + 100)) // bläddra
{
timeread = 0;
if (setpos == 0) selectDay();
if (setpos == 1) selectHour();
if (setpos == 2) selectMinute();
}
}
}
}
void selectHour()
{
hhSet++;
if (hhSet >= 25) hhSet = 1;
}
void selectMinute()
{
mmSet = mmSet + 10;
if (mmSet >= 60) mmSet = 00;
}
void selectDay()
{
setdag;
lcd.print(setdag);
setdag ++;
if (setdag >= 4) setdag = 0;
lcd.setCursor(9, 1); // avstängd = 0, vecka = 1, vardagar = 2, tredagars = 3
if (setdag == 0) lcd.print("Off ");
if (setdag == 1) lcd.print("Alldays ");
if (setdag == 2) lcd.print("Weekdays");
if (setdag == 3) lcd.print("Midweek ");
}