2018年5月14日 星期一

MicroPython 1.9.4 版釋出

今天上 MicroPython 官網下載頁, 發現期盼已久的 v.1.9.4 版韌體已經在 5/11 日釋出, 於是趕緊下載下來嚐新. 這次改版項目主要如下 :
  1. 剖析器 (Parser) 瘦身, 加上移除無用之程式碼使得大部分的板子來說韌體大小下降, 但 ESP8266 與 STM32 的韌體大小卻因為新增功能而變大, 例如更豐富的 frambuf 模組的格式, 以及新增了 ujson.dump() 函數.
  2. 新增內部 Python 堆疊以增進記憶體暫存之效率與彈性. 
  3. 內部原始碼重構, 原始碼覆蓋率顯著提升.
參考 :

http://micropython.org/resources/micropython-ChangeLog.txt

燒錄韌體方法參考 :

# MicroPython on ESP8266 (一) : 燒錄韌體
WeMOS D1 Mini 開發板測試

使用 D1 Mini 板的話要先將 D3 接地 (ESP-01 模組則為 D0) 再插入 USB 槽, 使用 ESP8266Flasher 軟體以 115200 速率燒錄到 4MB 的 Flash 中. 燒錄完成後拔除 ESP8266 接地線後按 Reset 鈕或重插拔 USB 槽, 開啟 Putty 的 Serial 埠以 115200 速率連線, 測試如下 :

MicroPython v1.9.4-8-ga9a3caad0 on 2018-05-11; ESP module with ESP8266
Type "help()" for more information.
>>> help()
Welcome to MicroPython!

For online docs please visit http://docs.micropython.org/en/latest/esp8266/ .
For diagnostic information to include in bug reports execute 'import port_diag'.

Basic WiFi configuration:

import network
sta_if = network.WLAN(network.STA_IF); sta_if.active(True)
sta_if.scan()                             # Scan for available access points
sta_if.connect("<AP_name>", "<password>") # Connect to an AP
sta_if.isconnected()                      # Check for successful connection
# Change name/password of ESP8266's AP:
ap_if = network.WLAN(network.AP_IF)
ap_if.config(essid="<AP_NAME>", authmode=network.AUTH_WPA_WPA2_PSK, password="<password>")

Control commands:
  CTRL-A        -- on a blank line, enter raw REPL mode
  CTRL-B        -- on a blank line, enter normal REPL mode
  CTRL-C        -- interrupt a running program
  CTRL-D        -- on a blank line, do a soft reset of the board
  CTRL-E        -- on a blank line, enter paste mode

For further help on a specific object, type help(obj)
>>> import sys
>>> dir(sys)
['__class__', '__name__', 'argv', 'byteorder', 'exit', 'implementation', 'maxsize', 'modules', 'path', 'platform', 'print_exception', 'stderr', 'stdin', 'stdout', 'version', 'version_info']


不過我測試 WDT 功能, 還是一樣無法傳入參數來設定 Timeout 秒數, 不傳參數預設就是 5 秒鐘, 但我沒呼叫 feed() 阻止 timeout, 板子也沒有 Reset, 可見目前 ESP8266 上的 WDT 還是無作用, 下面這篇也說 ESP8266 沒有 WDT 功能, 殘念  :

【ESP8266】没有WDT功能

"虽然在官方文档中,有WDT模块,但实际上,ESP8266中还没有提供这个功能,这个功能目前只支持WiPY模块。"

>>> from machine import WDT
>>> wdt = WDT(timeout=2000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function does not take keyword arguments
>>> wdt = WDT()
>>> wdt.feed()
>>> wdt = WDT(id=0, timeout=10000)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: function does not take keyword arguments
>>> type(wdt)
<class 'WDT'>
>>> dir(WDT)
['__class__', '__name__', 'deinit', 'feed']
>>> wdt.deinit()

參考 :

# class WDT – watchdog timer

不過我在下面這篇文章找到一個模擬 WDT 的方法 :

How can I reset ESP8266 MicroPython after main.py crashes?

其程式複製如下 :

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

有空再來想個實驗測試一下.

Is there a built-in function to print all the current properties and values of an object?

沒有留言 :