Power Consumption Issue

  • Hi,

    I got my Gpy to do what it is supposed to on the network side of things (the LTE modem sometimes hangs at the lte.connect() but that's for another thread). I am running into some issues on the power consumption side. The GPy is consuming way power more than expected.

    The Gpy essentially does a GET HTTP request of a small file, using the LTE. It blinks for 2.5s (10 out of 255 on the RGB LED) when it has read the data, writes some info to the SD card such as the timestamp, the data itself and the raw ADC value for the battery voltage. This string of data that is appended to a file on the SD card is no longer than 50 characters.

    The LTE is then de-initialised and the SD card unmounted. After this, the GPy goes to deepsleep for 10 minutes and repeats the whole process.

    I use the WDT timer to reset the device if the modem gets stuck, see my other post: [https://forum.pycom.io/topic/3073/lte-analysis-of-connectivity](link url)

    Some other info:

    • I disable the WiFi on boot in boot.py
    • I have the GPy on the Expansion board (v2.1) and the LED, RTS and CTS jumpers are removed.

    I will upload a battery discharge graph in my next post, but here is the thing: the module is WARM the whole time. So something is definitely not going into deepsleep. Is there a special procedure for the Sequans modem? What am I missing?

    Any help is appreciated. Thanks!

  • I found the main issue.

    The WDT was resetting the board more often than it should, interrupting the process of saving data to the SD card. The WDT was resetting the board which lead to LTE connections being made every minute (or attempted...). The board was essentially ON most of the time.

    Now, there is a potential issue related to the modem. It could be the network but that would be quite surprising. You will find in the following discharge graph a drop in the voltage around the 11pm mark. This is due to a series of failed connection attempts conducted by the LTE modem. As per my current script (soon to be modified), nothing prevents the WDT from resetting the board until a connection has been established and the board has been put to (deep) sleep.


    To be more precise, between 10:25pm and 12:33am the board has been unable to talk to the internet. At a rate of roughly 1 min per attempt (between WDT resets + delays), that is a LOT of failed attempts.

    I will run another test with two boards in parallel to discard a network issue (which is highly unlikely). Maybe a higher delay between connection attempts would help but still...

    Any ideas?

    [@administrators If you would like me to keep this thread clean and start another one let me know]

  • @jmarcelino any plans to change that 5ma sleep consumption?

    It makes using the SD card impossible for low power use, which seems a bit odd compared to the rest of the pycom design principles

  • @jmarcelino @jcaron
    Thanks for getting back to me!

    Thanks for the specific number on the consumption of the SD card, it is a good thing to know. It still does not really explain why the modules get warm though...

    My Gpy board has the most recent firmware, as well as the Sequans modem (I upgraded both less than 10 days ago with the most recent versions : '1.17.3.b1' and 'FIPY_GPY_CATM1_33988.dup').
    The board is powered with a 2000mAh 3.7V LiPo connected to the Expansion board.

    Here is my boot.py:

    import pycom

    Here is main.py

    import time
    import socket
    import gc
    from network import LTE
    import ssl
    import urequest
    import pycom
    import machine
    import os
    from machine import ADC
    DEBUG = False
    #pycom.heartbeat(False) already in boot.py
    wdt = machine.WDT(timeout=20000)
    sleepminutes = 10
    def dprint(argument):
        if DEBUG == True:
            return print(argument)
    def contains_word(s, w):
        return (w) in (s)
    def send_at_cmd_pretty(cmd):
        response = lte.send_at_cmd(cmd).split('\r\n')
        for line in response:
    #Battery Voltage ADC
    adc = ADC()               
    bat_pin = adc.channel(pin='P16', attn=ADC.ATTN_11DB)   
    def getBatteryVoltage():
        bat_voltage = bat_pin()
        dprint("Voltage = %d " % (bat_voltage))
        return bat_voltage
    while True:
        dprint('Starting LTE...')
        lte = LTE() # instantiate LTE object
        dprint('LTE instantiated')
        if lte.isattached():
            #important, otherwise it can get stuck
            dprint("LTE was still attached. Disconnecting it.")
        # lte.reset()
        # dprint ('LTE has been reset')
        # time.sleep(5.0)
        # wdt.feed()
        send_at_cmd_pretty('AT+CGDCONT=1,"IP","telstra.internet"') # Telstra network
        dprint ('APN set') # used for debugging
        send_at_cmd_pretty('AT!="addscanfreq band=28 dl-earfcn=9410"') # lte frequency band - from forum
        dprint ('Chose frequency band') 
        send_at_cmd_pretty('AT+CFUN=1') # Set the full functionality mode with a complete software reset
        dprint ('Writing configuration...') 
        #Feed the watchdog if we made it
        dprint('LTE initialised')
        #show wireless parameters
        send_at_cmd_pretty('AT!="showphy"')     # get the PHY status
        send_at_cmd_pretty('AT!="fsm"')         # get the System FSM
        lte.attach() # attach the cellular modem to a base station
        while not lte.isattached():
        dprint ('Attached!')
        lte.connect() # start a data session and obtain an IP address
        while not lte.isconnected():
        dprint ('Connected!') 
        #LTE Connection established
        dprint("LTE is working")
        #Feed the watchdog if we made it
        rtc = machine.RTC()
        #sync time with ntp server
        while rtc.synced() is False:
        #adjust to Melbourne time (+3600 * number of hours)
        #Create HTTP request
        statusString = "iuhqiurfeqhierufhqiuh" #changed for posting on forum (originally a link to a .txt file)
        ms = str(time.ticks_ms())
        statusReq = statusString + '?ms=' + ms    
        rawPage = urequest.get(statusReq)
        #Declare status variable
        status = 'OFF'
        if contains_word(rawPage, 'ON') is True:
            status = 'ON'
        elif contains_word(rawPage, 'OFF') is True:
            status = 'OFF'
            status = "Undefined"
        newLine = str(time.localtime()) + '   ' + status + '   ' + str(getBatteryVoltage()) + '\r\n'
        sd = machine.SD()
        os.mount(sd, '/sd')
        f = open('/sd/LTE_failures.txt', 'a')
        # f = open('/sd/LTE_failures.txt', 'r')
        # f.readlines()
        # f.close()
        #Disconnect LTE, collect garbage
        #going into deep sleep
        dprint("Going to deep sleep")
        #Go to deep sleep for 10 mn aprox.
        machine.deepsleep(sleepminutes * 60000 - 35000)

  • @tealbrains
    The SD card is always consuming power even when idle (during deepsleep) about 5mA. For low power applications using the SD card is not recommended.

    How are you de-initiliasing the modem and going into deepsleep?

  • @tealbrains you should probably share the relevant parts of your code, as well as the current draw you see during sleep, and possibly console output.

    Also, do you have upgraded the FiPy to the latest firmware, and the modem as well?

    How are you powering the board?


Pycom on Twitter