iT邦幫忙

2023 iThome 鐵人賽

DAY 13
0

我們今天來看 machine.Timer 模組。

Timer 顧名思義,是計時器或是定時器的意思,我們可以設定一個時間,當時間到了,可以執行我們預先設定的動作,Micropython官方給的例子如下:

from machine import Timer

tim0 = Timer(0)
tim0.init(period=5000, mode=Timer.ONE_SHOT, callback=lambda t:print(0))

tim1 = Timer(1)
tim1.init(period=2000, mode=Timer.PERIODIC, callback=lambda t:print(1))

官方文件說 Timer(id) 裡的 id 的數值爲 0 ~ 3, 若是 -1 表示爲軟體的 Timer, 這個部分,我們明天再詳細的實驗說明。

這個例子很簡單,用了兩個 Timer 變數:tim0 與 tim1。

tim0 在初始化的時候,帶入了幾個參數(或者稱爲引數也行),period 這個 KW (keyword) 參數, 指明是一個時間,單位是 ms (千分之一秒),這裡 5000 就是 5 秒的意思。

mode 這裡指明的是 ONE_SHOT, 也就是說,當 period 指定的時間到了之後,會去執行 一次 後面 callback 參數所指明的 callback function (回 call 函數)。

這裡 callback function 使用了 lambda 匿名函數,帶入物件(或者參數) t , 執行 print(0) 這個動作。其實這個 t 應該是要帶入一個 Timer 物件,我們之後會說明。

tim1 用了 PERIODIC, 這代表週期重覆的意思,也就是每隔 2 秒,執行 print(1) 這個動作,一直重覆下去。

程式的結果如下:

1
1
0
1
1
1
......

我們發現如預期的,每 2 秒印出 1,在第 5 秒的時候,印出 0 一次。

用 Timer 來實現調頻

我們前面使用了 sleep 延時的功能,來實現產生 10,100,1000 Hz 頻率的波形,其實這就是所謂的變頻或調頻

我們用 Timer 來實現 LED 閃爍的例子:

from machine import Pin,Timer
 
LED = Pin(1, Pin.OUT)
tim = Timer(0)
   
tim.init(period = 50, mode = Timer.PERIODIC, callback = lambda t: LED.value(not LED.value()))

這樣就產生 10 Hz 的 LED 閃爍。

您可以比對一下之前用 sleep 延時的方法,用 Timer 是否變成簡單許多了呢? 而且還是多工的!在 LED 閃爍的執行中,我們還可以做其它事,不會影響閃爍的頻率。

至於產生 100 Hz, 1000 Hz的閃爍,就給您當作業了!


上一篇
12.時序的量測
下一篇
14.探討模組的使用
系列文
ESP32 Micropython 從入門到實用30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言