連接線的方式和上一個練習相同,但是我們把程式修改一下,就可以得到許多不同的顯示效果。使用SIN函數是其中一個方式。透過SIN函數來決定顯示的亮度(其實就是輸出的值,0是最小,1023是最大), SIN(0)~SIN(360)不斷地輸出,就可以製作出如下所示的效果:

要使用這個效果之前,要先確定使用的PIN腳設定不再是原來的數位輸出非0即1,而是使用PWM(Pulse Width Modulation)技術,把輸出的內容從原有的數位訊號改為以波形寬度比率的方式來模擬類比輸出,根據說明文件,NodeMCU可以支援PWM輸出的接腳為 0, 2, 4, 5, 12, 13, 14 以及15,而D1, D2, D3分別對應到5, 4, 0,都是可以支援PWM的接腳,因此我們就可以在不用改變連接線的情況下,透過以下的程式來做到呼吸燈的效果:

from machine import Pin, PWM
import time, math

ledR = PWM(Pin(5), freq=1000)
ledG = PWM(Pin(4), freq=1000)
ledB = PWM(Pin(0), freq=1000)
led = [ledR, ledG, ledB]

while True:
    for d in range(360):
        for l in led:
            l.duty(int(512*math.sin(math.pi*d/180)+512))
        time.sleep_ms(2)

在這個程式中,我們原本只使用Pin來設定接腳,現在再加上PWM,指定這些接腳都需要以PWM的方式輸出。PWM輸出設定需要指定2個部份,其中一個部份是頻率,以freq來設定,在這裡我們設定為1000,也就是1KHz,一開始先設定頻率,接下來就可以使用duty這個函數來設定輸出的值,0是完全沒有輸出,而1023則最大的輸出。

在第10行,我們設定讓d這個變數可以從0變化到359度,然後在第12行的地方,透過math.sin這個函數來計算三角函數的SIN函數值。不過,由於Python使用的是弳度,因此要使用math.pi*d/180來做轉興。此外,輸出值只能是正數,但SIN函數的值是-1到+1,因此我們只使用512去乘SIN函數的值,出來的結果再加上512,把它們的值從-511~511調整到0到1022,最後,輸出的值需要是整數,因此再把整個計算出來的值以int函數來變成整數型態就可以了。

最後,原本的time.sleep改為time.sleep_ms,以毫秒為單位,以避免數值的變換速度過慢。Python的math套件中還有許多的函數可以使用,有興趣的同學們也可以試試看喔。

(52)