如何在main.py崩溃后重置ESP8266 MicroPython?

时间:2017-03-05 07:29:47

标签: iot esp8266 nodemcu micropython

我有运行MicroPython的NodeMCU ESP8266板。我在ESP8266上运行了一个Web服务器。这是我的第一个基于其中一个主板的物联网项目。

以下是代码的片段。

这是在main.py内执行的。偶尔,某些东西导致代码崩溃(可能是基于时间和请求)。当main.py退出时,无论出于何种原因,我都会退回到python CLI。

我希望董事会在发生这种情况时重置(如果没有更好的方法)。

重启/重置ESP8266的最佳方法是什么?

addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1]

s = socket.socket()
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind(addr)
s.listen(5)
print('listening on', addr)

while True:
    cl, addr = s.accept()
    print('client connected from', addr)
    cl_file = cl.makefile('rwb', 0)
    print("Request:")
    while True:
        line = cl_file.readline()
        print("Line:" , line)
        if not line or line == b'\r\n':
            print("breaking")
            break
        if line == b'GET /active HTTP/1.1\r\n':

4 个答案:

答案 0 :(得分:5)

MicroPython具有machine.reset()功能来重置电路板。

Python(不仅仅是MicroPython)使用exception handling来处理错误。

结合这两者,您可以轻松实现您想要的效果。例如:

a = 4
b = 2
try:
    a / b
except:
    machine.reset()

如果在上面的代码中将b的值替换为0,则您的电路板将重置。如果你考虑一下,你可能会发现它没有多大意义 - 你不希望你的电路板突然重置,如果你只是错误或其他方式除以0。必须有更好的方法来处理错误!同样,您可能想要考虑自己的情况,看看重置电路板是否真的是最佳选择。如果您认为是的,那很好,请始终牢记编程您的电路板突然重置。否则,你的下一个问题可能是“我的电路板突然重置!为什么???” ; - )

答案 1 :(得分:3)

原始问题可能会迟到,但我要分享的答案可能对其他人有所帮助。考虑它不是最终解决方案,但在许多情况下,它可能会节省一天。你可以探索你的案例。

解决方案是使用MicroPython的内部调度功能。由于它的执行是有保证的,因此它的行为可以用作模仿功能监视器的工具。

以下代码将使用给定的定时器和阈值运行,可以在您的情况下自定义,如果定时器达到其阈值,并且wd_buffer的值未更新那段时间,则可能会调用该函数,我们重复这个过程又来了。 因此,为了防止ESP在这种情况下在12秒后重新启动,您必须在代码中的某个位置定期(短于12秒或根据需要调整计时器和阈值)更新Global wd_buffer变量的值。希望它有所帮助。

# Simple WD - Global Variable
wd_feeder = 0 
wd_buffer = 0
wd_counter = 0
wd_threshold = 4

def wd_checker(calledvalue):
    print('watchdog is checking... feeder= {} buffer= {}'.format(wd_feeder, wd_buffer))
    global wd_counter
    global wd_buffer
    global wd_feeder
    if wd_feeder == wd_buffer:
        print('state is suspicious ... counter is {} incrementing the counter'.format(wd_counter))
        wd_counter += 1
    else:
        wd_counter = 0
        wd_feeder = wd_buffer
    if wd_counter == wd_threshold:
        print('Counter is reached its threshold, following function will be called')
        wd_feeder = wd_buffer = wd_counter = 0
        machine.reset()


if __name__ == '__main__':
    scheduler_wd = machine.Timer(-1)
    scheduler_wd.init(period=3000, mode=machine.Timer.PERIODIC, callback=wd_checker)

答案 2 :(得分:1)

你可以添加一个while循环来检查Flash按钮(GPIO引脚0),如下所示:

import machine
pin = machine.Pin(0, machine.Pin.IN, machine.Pin.PULL_UP)                                                                 
while pin.value():
    print('Put your code here...')
    print('..this will looping until the Flash button is pressed...')

print('...and then it continues here.')

答案 3 :(得分:0)

您可以从boot或main.py执行代码(应该在main.py - >其他文件之外)。如果它退出,它应该执行以下代码,这可能会触发重置。

您可能必须先捕获错误。

我希望我帮助