我有运行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':
答案 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 - >其他文件之外)。如果它退出,它应该执行以下代码,这可能会触发重置。
您可能必须先捕获错误。
我希望我帮助