Page 1 of 1

ESP8266 Deepsleep/code problems

Posted: Tue Feb 12, 2019 5:02 am
by Mustela125
Hello all,

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