Page 2 of 3

Re: ESP8266 goes down after sometime

Posted: Tue May 07, 2019 10:05 am
by pythoncoder
Given that your main loop runs every 180s I think you need to change the WDT time from 120s to (say) 300s. You should then be able to place the feed() statement in your main loop. I'd suggest after the while(True) statement.

The way a WDT works is that it resets the board if it is not fed during its timeout period. So, with the above change, the main loop should always feed it within five minutes. If the code stops running this won't occur and the board will be reset.

Re: ESP8266 goes down after sometime

Posted: Thu May 16, 2019 6:19 pm
by navy
pythoncoder wrote:
Tue May 07, 2019 10:05 am
Given that your main loop runs every 180s I think you need to change the WDT time from 120s to (say) 300s. You should then be able to place the feed() statement in your main loop. I'd suggest after the while(True) statement.

The way a WDT works is that it resets the board if it is not fed during its timeout period. So, with the above change, the main loop should always feed it within five minutes. If the code stops running this won't occur and the board will be reset.
Now i get it, i need to feed in the loop, ok.

btw, esp8266 still getting down after i've changed a power source. So it's a software problem or mcu hardware problem.
Meanwhile, i am rewriting new python code on my esp32 and after i finished it, i will upload new code with your correction on esp32 and esp8266 both. Thank you, pythoncoder!

P.S. I've recheck, that esp8266 get into work after i pushed reset button. So, i believe mcu.reset should work.

Re: ESP8266 goes down after sometime

Posted: Sat May 18, 2019 9:15 am
by navy
damn. its still go to sleep. Even with your WDT.
Uptime was 1 day. Any ideas what it may be?
I will put it on notebook and will see whats happening on terminal, maybe i will see some debug.

Code: Select all

import machine
import time
from machine import Pin
import bme280_float
import network
import micropython
from umqtt.simple import MQTTClient

class WDT:
    def __init__(self, id=0, timeout=300):
        self._timeout = timeout / 10
        self._counter = 0
        self._timer = machine.Timer(id)
        self.init()

    def _wdt(self, t):
        self._counter += self._timeout
        if self._counter >= self._timeout * 10:
            print("WDT timeout")
            machine.reset()

    def feed(self):
        self._counter = 0

    def init(self, timeout=None):
        timeout = timeout or self._timeout
        self._timeout = timeout
        self._timer.init(period=int(self._timeout * 1000), mode=machine.Timer.PERIODIC, callback=self._wdt)

    def deinit(self):  # will not stop coroutine
        self._timer.deinit()
wdt=WDT()

WiFi_SSID = "ssid"
WiFi_PASS = "pass"


SERVER = "mqtt.thingspeak.com"
CHANNEL_ID = "77"
WRITE_API_KEY = "xxx"
led = Pin(2, Pin.OUT)

# Exception in an ISR should be handled, reserve memory for that
micropython.alloc_emergency_exception_buf(100)


def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network... ')
        wlan.connect(WiFi_SSID, WiFi_PASS)
        print
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())
    print('SSID: ', WiFi_SSID)

def collectData():
    temp1, pas1, hum1 = bme.values
    #temp1 = result[0]
    #hum1 = result[2]
    hum1 = hum1.replace("%", "")
    temp1 = temp1.replace("C", "")
    led.on()
    return temp1, hum1

try:

    # esp8266 scl pin 5, sda pin 4
    # esp32 scl pin 22 (gpio 22), sda pin 21 (gpio 21)
    i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
    #bme= BME280(i2c=i2c, mode=BME280_OSAMPLE_8, address=BME280_I2CADDR)
    bme = bme280_float.BME280(i2c=i2c)
    client = MQTTClient("umqtt_client", SERVER)
    topic = "channels/" + CHANNEL_ID + "/publish/" + WRITE_API_KEY

    wlan = network.WLAN(network.STA_IF)
    ap_if = network.WLAN(network.AP_IF)
    ap_if.active(False)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network... ')
        wlan.connect(WiFi_SSID, WiFi_PASS)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())
    print('SSID: ', WiFi_SSID)


    while True:
        wdt.feed() # feeding a reset timer
        temp1, hum1 = collectData()
        #esp8266 bme code: payload = "field1="+str(hum1)+"&field2="+str(temp1)
        payload = "field1="+str(hum1)+"&field2="+str(temp1)
        print(payload)
        try:
            client.connect()
            client.publish(topic, payload)
            client.disconnect()
        except:
            continue
        led.off()
        time.sleep(180)
except:
    print('Catched Exception in main. Reset.')
    machine.reset()

Re: ESP8266 goes down after sometime

Posted: Sat May 18, 2019 10:01 am
by navy
Image

I think i found a bug. I have a poor connection on pins between esp and bme280, so when it import a library it cant found a bme, gives me error and crashes.
Should WDT works meanwhile or it crashes too?

can i use except on import?

Code: Select all

try:
    import bme280_float
except:
    print('Catched Exception in lib. Reset.')
    machine.reset()

Re: ESP8266 goes down after sometime

Posted: Sat May 18, 2019 10:58 am
by pythoncoder
I'd fix the electrical connections first.

Re: ESP8266 goes down after sometime

Posted: Sat May 18, 2019 4:39 pm
by navy
finally i catch an error:

Code: Select all

field1=58.55&field2=19.06
field1=60.30&field2=19.41
field1=59.20&field2=19.12
field1=58.71&field2=18.65
field1=57.84&field2=18.50
field1=59.69&field2=18.98
field1=60.58&field2=18.99
field1=58.97&field2=18.52
field1=58.40&field2=18.38
field1=60.12&field2=18.97
field1=60.62&field2=18.90
Traceback (most recent call last):
  File "main.py", line 55, in <module>
  File "umqtt/simple.py", line 97, in connect
IndexError: bytes index out of range

MicroPython v1.10-8-g8b7039d7d on 2019-01-26; ESP module with ESP8266
Type "help()" for more information.
>>>
so after this crash ESP dont work any more and turned off a led.

I wondering why WDT dont work and why my try/except dont catch that?

Code: Select all

import machine
import time
from machine import Pin
import bme280_float
import network
import micropython
from umqtt.simple import MQTTClient

class WDT:
    def __init__(self, id=0, timeout=300):
        self._timeout = timeout / 10
        self._counter = 0
        self._timer = machine.Timer(id)
        self.init()

    def _wdt(self, t):
        self._counter += self._timeout
        if self._counter >= self._timeout * 10:
            print("WDT timeout")
            machine.reset()

    def feed(self):
        self._counter = 0

    def init(self, timeout=None):
        timeout = timeout or self._timeout
        self._timeout = timeout
        self._timer.init(period=int(self._timeout * 1000), mode=machine.Timer.PERIODIC, callback=self._wdt)

    def deinit(self):  # will not stop coroutine
        self._timer.deinit()
wdt=WDT()

WiFi_SSID = "ssid"
WiFi_PASS = "pass"


SERVER = "mqtt.thingspeak.com"
CHANNEL_ID = "77"
WRITE_API_KEY = "xxx"
led = Pin(2, Pin.OUT)

# Exception in an ISR should be handled, reserve memory for that
micropython.alloc_emergency_exception_buf(100)


def do_connect():
    wlan = network.WLAN(network.STA_IF)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network... ')
        wlan.connect(WiFi_SSID, WiFi_PASS)
        print
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())
    print('SSID: ', WiFi_SSID)

def collectData():
    temp1, pas1, hum1 = bme.values
    #temp1 = result[0]
    #hum1 = result[2]
    hum1 = hum1.replace("%", "")
    temp1 = temp1.replace("C", "")
    led.on()
    return temp1, hum1

try:

    # esp8266 scl pin 5, sda pin 4
    # esp32 scl pin 22 (gpio 22), sda pin 21 (gpio 21)
    i2c = machine.I2C(scl=machine.Pin(5), sda=machine.Pin(4))
    #bme= BME280(i2c=i2c, mode=BME280_OSAMPLE_8, address=BME280_I2CADDR)
    bme = bme280_float.BME280(i2c=i2c)
    client = MQTTClient("umqtt_client", SERVER)
    topic = "channels/" + CHANNEL_ID + "/publish/" + WRITE_API_KEY

    wlan = network.WLAN(network.STA_IF)
    ap_if = network.WLAN(network.AP_IF)
    ap_if.active(False)
    wlan.active(True)
    if not wlan.isconnected():
        print('connecting to network... ')
        wlan.connect(WiFi_SSID, WiFi_PASS)
        while not wlan.isconnected():
            pass
    print('network config:', wlan.ifconfig())
    print('SSID: ', WiFi_SSID)


    while True:
        wdt.feed() # feeding a reset timer
        temp1, hum1 = collectData()
        #esp8266 bme code: payload = "field1="+str(hum1)+"&field2="+str(temp1)
        payload = "field1="+str(hum1)+"&field2="+str(temp1)
        print(payload)
        try:
            client.connect()
            client.publish(topic, payload)
            client.disconnect()
        except:
            continue
        led.off()
        time.sleep(180)
except:
    print('Catched Exception in main. Reset.')
    machine.reset()

Re: ESP8266 goes down after sometime

Posted: Sat May 18, 2019 8:22 pm
by kevinkk525
The wdt should work. Are you waiting long enough? You have a timeout of 300s (5 minutes).

Re: ESP8266 goes down after sometime

Posted: Sun May 19, 2019 7:15 am
by navy
yes. i've check that receiving of data stops (widget on my android), come to ESP and see there is no led on. After that i go to sleep and come back at the morning, it was still off.
I just reset it and setted up an usb cable to see what happening.

Re: ESP8266 goes down after sometime

Posted: Sun May 19, 2019 7:58 am
by kevinkk525
That's strange. Can you check the wdt only to make sure it works? I'm using the same wdt code and it works all the time.

Re: ESP8266 goes down after sometime

Posted: Sun May 19, 2019 10:45 am
by navy
i've refactored code a little bit, and have started it to testing. It still working from yesterday.
Put connection to wifi and WDT to separate module. Maybe it make sense.
All exception works when i try to CTRL+C in REPL.

Code: Select all

import machine
import time
from machine import Pin
import bme280_float
import network
import micropython
from umqtt.simple import MQTTClient
from wdt import WDT
import ConnectWiFi

ConnectWiFi.connect()
wdt = WDT(timeout=300)
SERVER = "mqtt.thingspeak.com"
CHANNEL_ID = "777"
WRITE_API_KEY = "XXX"


blue_led = Pin(2, Pin.OUT)

# Exception in an ISR should be handled, reserve memory for that
micropython.alloc_emergency_exception_buf(100)

def collectData():
    temp1, pas1, hum1 = bme.values
    #temp1 = result[0]
    #hum1 = result[2]
    hum1 = hum1.replace("%", "")
    temp1 = temp1.replace("C", "")
    return temp1, hum1

try:

    # esp8266 scl pin 5, sda pin 4
    # esp32 scl pin 22 (gpio 22), sda pin 21 (gpio 21)
    i2c = machine.I2C(scl=machine.Pin(22), sda=machine.Pin(21))
    #bme= BME280(i2c=i2c, mode=BME280_OSAMPLE_8, address=BME280_I2CADDR)
    bme = bme280_float.BME280(i2c=i2c)
    client = MQTTClient("umqtt_client", SERVER)
    topic = "channels/" + CHANNEL_ID + "/publish/" + WRITE_API_KEY

    while True:
        wdt.feed() # feeding a reset timer
        temp1, hum1 = collectData()
        #esp8266 bme code: payload = "field1="+str(hum1)+"&field2="+str(temp1)
        payload = "field1="+str(hum1)+"&field2="+str(temp1)
        print(payload)
        try:
            client.connect()
            client.publish(topic, payload)
            client.disconnect()
        except:
            print("MQTT connect exception")
            continue
        for i in range(5):
            time.sleep_ms(50)          
            blue_led.on()
            time.sleep_ms(50) 
            blue_led.off()
        wdt.feed()  # feeding a reset timer
        time.sleep(180)
except:
    print('Catched Exception in main. Reset.')
    machine.reset()