ESP8266 annex multi alarm clock

Place your projects here
Post Reply
Zim
Posts: 280
Joined: Mon Feb 08, 2021 9:15 pm
Has thanked: 253 times
Been thanked: 128 times

ESP8266 annex multi alarm clock

Post by Zim »

w.jpg
Untitled-1.jpg






Code: [Local Link Removed for Guests]

' Zims annex 12 hour alarm clock with DST v9
ONHTMLRELOAD CREATE_PAGE 
ONHTMLCHANGE UPDATE
GOSUB CREATE_PAGE
TIMER0 1000, UPDATE
WAIT

CREATE_PAGE:
CLS
AUTOREFRESH 1000
I2C.SETUP 4, 5
GOSUB RTC2ESP                             ' sets ESP time and date from RTC at startup
INMEM$ = FILE.READ$("/alarms.txt")           'reads file and puts in ram
DSTCHK$ = RTC.DATE$(2) + " " + RTC.TIME$                                'Year/Month/Day Hours:Minutes:Seconds

ALR1H$ = LEFT$(WORD.GETPARAM$(INMEM$, "alarm1"), 2)
 ALR1M$ = MID$(WORD.GETPARAM$(INMEM$, "alarm1"), 4, 2)
  ALR1AP$ = RIGHT$(WORD.GETPARAM$(INMEM$, "alarm1"), 2)
ALR2H$ = LEFT$(WORD.GETPARAM$(INMEM$, "alarm2"), 2)
 ALR2M$ = MID$(WORD.GETPARAM$(INMEM$, "alarm2"), 4, 2)
  ALR2AP$ = RIGHT$(WORD.GETPARAM$(INMEM$, "alarm2"), 2)
ALR3H$ = LEFT$(WORD.GETPARAM$(INMEM$, "alarm3"), 2)
 ALR3M$ = MID$(WORD.GETPARAM$(INMEM$, "alarm3"), 4, 2)
  ALR3AP$ = RIGHT$(WORD.GETPARAM$(INMEM$, "alarm3"), 2)
ALR4H$ = LEFT$(WORD.GETPARAM$(INMEM$, "alarm4"), 2)
 ALR4M$ = MID$(WORD.GETPARAM$(INMEM$, "alarm4"), 4, 2)
  ALR4AP$ = RIGHT$(WORD.GETPARAM$(INMEM$, "alarm4"), 2)
ALR5H$ = LEFT$(WORD.GETPARAM$(INMEM$, "alarm5"), 2)
 ALR5M$ = MID$(WORD.GETPARAM$(INMEM$, "alarm5"), 4, 2)
  ALR5AP$ = RIGHT$(WORD.GETPARAM$(INMEM$, "alarm5"), 2)

ALR1MODE$ = LEFT$(WORD.GETPARAM$(INMEM$, "mode1"), 9)
 ALR2MODE$ = LEFT$(WORD.GETPARAM$(INMEM$, "mode2"), 9)
  ALR3MODE$ = LEFT$(WORD.GETPARAM$(INMEM$, "mode3"), 9)
   ALR4MODE$ = LEFT$(WORD.GETPARAM$(INMEM$, "mode4"), 9)
    ALR5MODE$ = LEFT$(WORD.GETPARAM$(INMEM$, "mode5"), 9)
D5=14:D6=12
PIN.MODE D5, OUTPUT    'is feed to buzzer
PIN.MODE D6, OUTPUT     'is feed to blue LED
PIN(D5) = 0              'buzzer off
PIN(D6) = 0               'blue LED off
HTMLEVENTVAR$ = ""      ' needed for auto invoke alarm selections
MODE$ = "Alarm Off,Alarm On ,Bell Only,Lite Only"
HLIST$ = "01,02,03,04,05,06,07,08,09,10,11,12"
MLIST$ = "00,01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59"
APLIST$ = "AM,PM"
HOUR$ = "0"
MIN$ = "0"
HOUR = VAL(HOUR$)
MIN = VAL(MIN$)
T24$ = RTC.TIME$   '24hr time
T12$ = ""           '12hr time
CNT = 0     'timer for led
CNT2 = 0     'timer for buzzer
CLCKAP$ = ""         'AM/PM for clock setting
DROPDM$ = "background-color:white;text-align:center;width:100px;height:40px;font-size:15;font-weight:bold"
DROPD1$ = "background-color:white;text-align:center;width:60px;height:40px;font-size:20;font-weight:bold"
DROPD$ = "background-color:white;text-align:center;width:55px;height:40px;font-size:20;font-weight:bold"
CSET$ = "background-color:red;text-align:center;width:55px;height:40px;font-size:14;font-weight:bold"
CLKDISP$ = "background-color:white;text-align:center;display:block;width:200px;height:42px;font-size:30;font-weight:bold"

A$ = ""  '                                      CLOCK DISPLAY
A$ = A$ + |<!DOCTYPE html><html><body><style>|
A$ = A$ + |body {background-color: black;}|
A$ = A$ + |p {font-size:20px;}|
A$ = A$ + |</style>|
A$ = A$ + |<table align='center' width='300' height='60' bgcolor='lightgreen' border='1'>| 
A$ = A$ + |<th>|
A$ = A$ + |<p>Time</p></th></center>|
A$ = A$ + |<th><center>|
A$ = A$ + TEXTBOX$(T12$, "txt1")
A$ = A$ + |</th></center>|
A$ = A$ + CSSID$("txt1", CLKDISP$)
A$ = A$ + |</table>|
HTML A$

A$ = "" '           
A$ = A$ + |<table align='center' width='300' height='100' bgcolor='lightgreen' border='1' cellpadding='4'>|
A$ = A$ + |<tr><th>Apply</th><th>Hours</th><th>Minutes</th><th>AM/PM</th></tr>|
A$ = A$ + |<td>|
A$ = A$ + BUTTON$("Set Clock", SETCLOCK, "but0")
A$ = A$ + CSSID$("but0" , CSET$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(HOUR$, HLIST$, "lboxa")
A$ = A$ + CSSID$("lboxa" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(MIN$, MLIST$, "lboxb")
A$ = A$ + CSSID$("lboxb" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(CLCKAP$, "AM,PM", "lboxc")
A$ = A$ + CSSID$("lboxc" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '""
HTML A$

A$ = "" '                                      ALARM 1
A$ = A$ + |<table align='center' width='300' height='50' bgcolor='lightgreen' border='1' cellpadding='1'>|
A$ = A$ + |<tr><th>Mode</th><th>Hours</th><th>Minutes</th><th>AM/PM</th></tr>|
A$ = A$ + |<td>|
A$ = A$ + LISTBOX$(ALR1MODE$, MODE$, "mde")
A$ = A$ + CSSID$("mde" , DROPDM$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR1H$, HLIST$, "lbox1")
A$ = A$ + CSSID$("lbox1" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR1M$, MLIST$, "lbox2")
A$ = A$ + CSSID$("lbox2" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR1AP$, APLIST$, "lbox3")
A$ = A$ + CSSID$("lbox3" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '"?"
HTML A$

A$ = "" '                                      ALARM 2
A$ = A$ + |<table align='center' width='300' height='50' bgcolor='lightgreen' border='1' cellpadding='1'>|
A$ = A$ + |<td>|
A$ = A$ + LISTBOX$(ALR2MODE$, MODE$, "mde")
A$ = A$ + CSSID$("mde" , DROPDM$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR2H$, HLIST$, "lbox4")
A$ = A$ + CSSID$("lbox4" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR2M$, MLIST$, "lbox5")
A$ = A$ + CSSID$("lbox5" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR2AP$, APLIST$, "lbox6")
A$ = A$ + CSSID$("lbox6" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '"?"
HTML A$

A$ = "" '                                      ALARM 3
A$ = A$ + |<table align='center' width='300' height='50' bgcolor='lightgreen' border='1' cellpadding='1'>|
A$ = A$ + |<td>|
A$ = A$ + LISTBOX$(ALR3MODE$, MODE$, "mde")
A$ = A$ + CSSID$("mde" , DROPDM$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR3H$, HLIST$, "lbox7")
A$ = A$ + CSSID$("lbox7" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR3M$, MLIST$, "lbox8")
A$ = A$ + CSSID$("lbox8" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR3AP$, APLIST$, "lbox9")
A$ = A$ + CSSID$("lbox9" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '"?"
HTML A$

A$ = "" '                                      ALARM 4
A$ = A$ + |<table align='center' width='300' height='50' bgcolor='lightgreen' border='1' cellpadding='1'>|
A$ = A$ + |<td>|
A$ = A$ + LISTBOX$(ALR4MODE$, MODE$, "mde")
A$ = A$ + CSSID$("mde" , DROPDM$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR4H$, HLIST$, "lbox10")
A$ = A$ + CSSID$("lbox10" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR4M$, MLIST$, "lbox11")
A$ = A$ + CSSID$("lbox11" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR4AP$, APLIST$, "lbox12")
A$ = A$ + CSSID$("lbox12" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '"?"
HTML A$

A$ = "" '                                      ALARM 5
A$ = A$ + |<table align='center' width='300' height='50' bgcolor='lightgreen' border='1' cellpadding='1'>|
A$ = A$ + |<td>|
A$ = A$ + LISTBOX$(ALR5MODE$, MODE$, "mde")
A$ = A$ + CSSID$("mde" , DROPDM$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR5H$, HLIST$, "lbox7")
A$ = A$ + CSSID$("lbox7" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR5M$, MLIST$, "lbox8")
A$ = A$ + CSSID$("lbox8" , DROPD$)
A$ = A$ + |</td><td>|
A$ = A$ + LISTBOX$(ALR5AP$, APLIST$, "lbox9")
A$ = A$ + CSSID$("lbox9" , DROPD1$)
A$ = A$ + |</td>|
A$ = A$ + |</center>|
A$ = REPLACE$(A$, "Choose here", "")  ' change all the "Choose here" instances with '"?"
HTML A$
A$ = ""
RETURN

SETCLOCK:
IF CLCKAP$ = "PM" THEN HOUR = VAL(HOUR$) + 12 ELSE HOUR = VAL(HOUR$)
IF HOUR = 24 THEN LET HOUR = 00
IF HOUR = 12 AND CLCKAP$ = "AM" THEN LET HOUR = 00
MIN = VAL(MIN$)
T$ = RTC.TIME$
D$ = RTC.DATE$(2)            'Year, Month, Day,
D = VAL(WORD$(D$,3,"/"))
M = VAL(WORD$(D$,2,"/"))
Y = VAL(WORD$(D$,1,"/"))
S = VAL(WORD$(T$,3,":"))
RTC.SETTIME Y, M, D, HOUR, MIN, S  ' Year, Month, Day, Hours, Minutes, Seconds
SETTIME Y, M, D, HOUR, MIN, S      ' Year, Month, Day, Hours, Minutes, Seconds
RETURN

UPDATE:                                 '<<<<<<<UPDATE>>>>>>>
T$ = RTC.TIME$
D$ = RTC.DATE$(2) 
DSTCHK$ = RTC.DATE$(2) +" "+ RTC.TIME$
IF (DSTCHK$ = "21/03/14 02:00:00") OR (DSTCHK$ = "22/03/13 02:00:00") GOSUB ADDHOUR
IF (DSTCHK$ = "20/11/1 02:00:00") OR (DSTCHK$ = "21/11/7 02:00:00") OR (DSTCHK$ = "22/11/6 02:00:00") GOSUB CUTHOUR

IF CNT > 0 THEN CNT = CNT - 1 ELSE CNT = 0
IF CNT2 > 0 THEN CNT2 = CNT2 - 1 ELSE CNT2 = 0
IF CNT = 1 THEN PIN.TONE D6, 0
IF (CNT2 = 8) OR (CNT2 = 5) OR (CNT2 = 2) THEN PIN(D5) = 1
IF (CNT2 = 7) OR (CNT2 = 4) OR (CNT2 = 1) THEN PIN(D5) = 0

T24$ = RTC.TIME$
IF VAL(T24$) > 12 THEN T12 = VAL(T24$)-12 ELSE T12 = VAL(T24$)
IF VAL(T24$) = 0 THEN T12 = 12
IF VAL(T24$) >= 12 THEN PORAC$ = " PM" ELSE PORAC$ = " AM"
T12$ = STR$(T12) + RIGHT$(T24$, 6) + PORAC$
IF T12 > 0 AND T12 < 10 THEN LET T12$ = "0" + T12$
IF T12$ = WORD.GETPARAM$(INMEM$, "alarm1") AND WORD.GETPARAM$(INMEM$, "mode1") <> "Alarm Off" THEN
     IF WORD.GETPARAM$(INMEM$, "mode1") = "Alarm On" GOSUB ALARMON
     IF WORD.GETPARAM$(INMEM$, "mode1") = "Bell Only" GOSUB BELLONLY
     IF WORD.GETPARAM$(INMEM$, "mode1") = "Lite Only" GOSUB LITEONLY
ENDIF
IF T12$ = WORD.GETPARAM$(INMEM$, "alarm2") AND WORD.GETPARAM$(INMEM$, "mode2") <> "Alarm Off" THEN
     IF WORD.GETPARAM$(INMEM$, "mode2") = "Alarm On" GOSUB ALARMON
     IF WORD.GETPARAM$(INMEM$, "mode2") = "Bell Only" GOSUB BELLONLY
     IF WORD.GETPARAM$(INMEM$, "mode2") = "Lite Only" GOSUB LITEONLY
ENDIF
IF T12$ = WORD.GETPARAM$(INMEM$, "alarm3") AND WORD.GETPARAM$(INMEM$, "mode3") <> "Alarm Off" THEN
     IF WORD.GETPARAM$(INMEM$, "mode3") = "Alarm On" GOSUB ALARMON
     IF WORD.GETPARAM$(INMEM$, "mode3") = "Bell Only" GOSUB BELLONLY
     IF WORD.GETPARAM$(INMEM$, "mode3") = "Lite Only" GOSUB LITEONLY
ENDIF
IF T12$ = WORD.GETPARAM$(INMEM$, "alarm4") AND WORD.GETPARAM$(INMEM$, "mode4") <> "Alarm Off" THEN
     IF WORD.GETPARAM$(INMEM$, "mode4") = "Alarm On" GOSUB ALARMON
     IF WORD.GETPARAM$(INMEM$, "mode4") = "Bell Only" GOSUB BELLONLY
     IF WORD.GETPARAM$(INMEM$, "mode4") = "Lite Only" GOSUB LITEONLY
ENDIF
IF T12$ = WORD.GETPARAM$(INMEM$, "alarm5") AND WORD.GETPARAM$(INMEM$, "mode5") <> "Alarm Off" THEN
     IF WORD.GETPARAM$(INMEM$, "mode5") = "Alarm On" GOSUB ALARMON
     IF WORD.GETPARAM$(INMEM$, "mode5") = "Bell Only" GOSUB BELLONLY
     IF WORD.GETPARAM$(INMEM$, "mode5") = "Lite Only" GOSUB LITEONLY
ENDIF

IF HTMLEVENTVAR$ = "" RETURN 
GOSUB MEM2FILE
RETURN

RTC2ESP:                     ' Synch RTC to ESP
T$ = RTC.TIME$          ' Hours, Minutes, Seconds
D$ = RTC.DATE$(2)            'Year, Month, Day,
D = VAL(WORD$(D$,3,"/"))
M = VAL(WORD$(D$,2,"/"))
Y = VAL(WORD$(D$,1,"/"))
H = VAL(WORD$(T$,1,":"))
MN = VAL(WORD$(T$,2,":"))
S = VAL(WORD$(T$,3,":"))
SETTIME Y, M, D, H, MN, S     'Year, Month, Day, Hours, Minutes, Seconds
RETURN

MEM2FILE:
WORD.SETPARAM INMEM$, "alarm1", ALR1H$ + ":" + ALR1M$ + ":" + "00 " + ALR1AP$
WORD.SETPARAM INMEM$, "alarm2", ALR2H$ + ":" + ALR2M$ + ":" + "00 " + ALR2AP$
WORD.SETPARAM INMEM$, "alarm3", ALR3H$ + ":" + ALR3M$ + ":" + "00 " + ALR3AP$
WORD.SETPARAM INMEM$, "alarm4", ALR4H$ + ":" + ALR4M$ + ":" + "00 " + ALR4AP$
WORD.SETPARAM INMEM$, "alarm5", ALR5H$ + ":" + ALR5M$ + ":" + "00 " + ALR5AP$

WORD.SETPARAM INMEM$, "mode1", ALR1MODE$
WORD.SETPARAM INMEM$, "mode2", ALR2MODE$
WORD.SETPARAM INMEM$, "mode3", ALR3MODE$
WORD.SETPARAM INMEM$, "mode4", ALR4MODE$
WORD.SETPARAM INMEM$, "mode5", ALR5MODE$


FILE.SAVE "/alarms.txt", INMEM$
HTMLEVENTVAR$ = ""
RETURN

ALARMON:
CNT = 30
CNT2 = 9
PIN.TONE D6,1 
GOSUB RTC2ESP
RETURN

BELLONLY:
CNT2 = 9
GOSUB RTC2ESP
RETURN

LITEONLY:
CNT = 30
PIN.TONE D6,1   
GOSUB RTC2ESP
RETURN

CUTHOUR:   '              DST set back 1 hour
T$ = RTC.TIME$
D$ = RTC.DATE$(2)            'Year, Month, Day,
D = VAL(WORD$(D$,3,"/"))
M = VAL(WORD$(D$,2,"/"))
Y = VAL(WORD$(D$,1,"/"))
H = VAL(WORD$(T$,1,":"))
MN = VAL(WORD$(T$,2,":"))
S = VAL(WORD$(T$,3,":"))
RTC.SETTIME Y, M, D, H-1, MN, S  ' Year, Month, Day, Hours, Minutes, Seconds
SETTIME Y, M, D, H-1, MN, S      ' Year, Month, Day, Hours, Minutes, Seconds
RETURN

ADDHOUR:      '                DST set ahead 1 hour
T$ = RTC.TIME$
D$ = RTC.DATE$(2)            'Year, Month, Day,
D = VAL(WORD$(D$,3,"/"))
M = VAL(WORD$(D$,2,"/"))
Y = VAL(WORD$(D$,1,"/"))
H = VAL(WORD$(T$,1,":"))
MN = VAL(WORD$(T$,2,":"))
S = VAL(WORD$(T$,3,":"))
RTC.SETTIME Y, M, D, H+1, MN, S  ' Year, Month, Day, Hours, Minutes, Seconds
SETTIME Y, M, D, H+1, MN, S      ' Year, Month, Day, Hours, Minutes, Seconds
RETURN
Make up a "/alarms.txt" file with below:

alarm1=11:10:00 PM
alarm2=10:00:00 AM
alarm3=12:00:00 PM
alarm4=01:00:00 PM
alarm5=01:15:00 PM
mode1=Alarm On
mode2=Lite Only
mode3=Alarm On
mode4=Bell Only
mode5=Alarm On
You do not have the required permissions to view the files attached to this post.
Post Reply