I've had quite the headache trying to get this code to work. I do not come from a programming or ECE background, so I am requesting assistance in getting this code to work as intended as well as some programming pointers to improve the code. All critiques are welcome!
I really just want a sort of super basic alarm clock. I have hard coded the alarm time and when the time comes an LED turns on. All other times I just want it to deepsleep. Due to the lack of adequate clock on the esp8266 I am having it wake up periodically to re-check the time. After the alarm goes off, it's supposed to just go back into deepsleep and then begin waiting for the next day to "sound the alarm". After a hole bunch of research, trial and error and with an utter lack of debugging skills using hardware I have finally been able to get this thing to work two days in a row, but the third day the LED does not turn on. I'm not sure what's going on or how to approach debugging it further.
This code shows that every day I want the LED to turn on at 7am for 30 minutes, and then turn off again till the next morning. I have my LED hooked up to pin 5 (D1) and RST pin tied to pin 16 (D0). The following code is my main.py on the board.
Thanks in advance!
Code: Select all
import machine
import utime
import ntptime
import network
def snooze(milliseconds):
# To be able to use this feature
# configure RTC.ALARM0 to be able to wake the device
rtc = machine.RTC()
rtc.irq(trigger=rtc.ALARM0, wake=machine.DEEPSLEEP)
# set RTC.ALARM0 to fire after some milliseconds
rtc.alarm(rtc.ALARM0, milliseconds)
# put the device to sleep
machine.deepsleep()
def do_connect():
sta_if = network.WLAN(network.STA_IF)
if not sta_if.isconnected():
print('connecting to network...')
sta_if.active(True)
sta_if.connect('PinkWeasel', 'weslin 16 nicole home')
while not sta_if.isconnected():
print(".", end="")
utime.sleep(1)
# print('network config:', sta_if.ifconfig())
def getAZtime():
do_connect()
ntptime.settime()
(year, month, mday, hour, minute, second, weekday, yearday) = utime.localtime()
hour = hour - 7
if hour < 0:
hour += 24
mday -= 1
if mday < 0:
mday += 30 # this is clearly not handled correctly
month -= 1
if month < 1:
month += 12
year -= 1
azTime = (year, month, mday, hour, minute, second, weekday, yearday)
return azTime
def getDuration(wakeHour, wakeMin):
azTime = getAZtime()
(year, month, mday, hour, minute, second, weekday, yearday) = azTime
print('AZ Time:')
print(azTime)
hoursLeft = wakeHour - hour # hours
if hoursLeft < 0:
hoursLeft += 24
minLeft = wakeMin - minute # minutes
if minLeft < 0:
minLeft += 60
hoursLeft -= 1
if hoursLeft < 0:
hoursLeft += 24
secLeft = 0 - second # seconds
if secLeft < 0:
secLeft += 60
minLeft -= 1
if minLeft < 0:
minLeft += 60
hoursLeft -= 1
if hoursLeft < 0:
hoursLeft += 24
duration = hoursLeft + (minLeft/60) + (secLeft/3600) # hours
print('...')
print('Hours remaining: ' + str(hoursLeft))
print('Minutes remaining: ' + str(minLeft))
print('Seconds remaining: ' + str(secLeft))
print('Total duration in hours: ' + str(duration))
print('...')
return duration
def flashLED(pinLED, flashTime):
pinLED.on()
utime.sleep(flashTime)
pinLED.off()
utime.sleep(flashTime)
wakeHour = 7 # hour
wakeMin = 0 # minute
onDuration = 30 # minutes
pin = machine.Pin(5, machine.Pin.OUT)
duration = getDuration(wakeHour, wakeMin) # hour
print("Start Program")
# check if the device awoke from a deep sleep
if machine.reset_cause() != machine.DEEPSLEEP_RESET:
flashLED(pin, .1)
flashLED(pin, .1)
flashLED(pin, .5)
print("Start NOT from deepsleep. ")
print(str(duration) + " hours remaining. ")
else:
print("Awoke from a deep sleep. ")
print(str(duration) + " hours remaining. ")
if duration > 1:
print("Time is greater than an hour, snooze.")
print(str(duration) + " hours remaining. ")
snooze(int(3600*1000))
elif duration > 10/60:
print("Time is greater than 10 minutes. Snooze. ")
print(str(duration) + " hours remaining. ")
snooze(int(duration*3600*1000/2))
else:
print("Time is less than 10 minutes. Wait. ")
print(str(duration) + " hours remaining. ")
utime.sleep(duration*3600) # utime sleep is in seconds and can be decimal values
flashLED(pin, onDuration*60)
snooze(int(3600*1000))