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))