最近在準備ePy智慧屋的教案,剛好使用WS2812燈條,燈條上有5顆全彩LED燈,需要透過一個小小的範例讓學生熟悉操作線上實驗室的平台,就在思考使用甚麼範例的時候,想到過去最喜歡的一個範例是『流星燈』,這個範例操作的時候學生的反應也是挺好的,那就將之寫進教案中讓學生練習吧。
首先,我們必須練習調整亮度的積木,因為燈條上有5顆燈,所以我就做由最暗到最亮排列好的五顆LED,5顆LED的顏色先不調整,整體的感覺如下圖。
接著我們要讓他往左邊移動,先用草圖將整個邏輯繪製出來。
邏輯很簡單,草圖中的『位置1』到『位置5』是實際LED燈條的LED,其他的小圈圈是虛擬的,因此現在我有5顆燈要跑流星,模擬出來的次數就是11次會跑完,也就是說要完整跑完一次流星燈需要移動11次。
如果覺得一次5顆LED太多,也可以設置3顆就好,這樣跑完一次流星燈的移動次數會少一點。
這個做法的好處是我把亮度都固定住,只需要考慮移動的運算就好。
另外有個地方要注意,每往左邊移動一格,右邊就要填滿黑色,因為即便是將亮度遞減為0,LED燈條實際上還是會有一點點的亮度,所以我要特別再把它用黑色去填滿。
變數j是我們的亮度控制,他只會受到變數位置的影響,這就是我在上面說的固定亮度的部分。
如此我就可以簡單的做出一個燈條版本的流星燈。
那問題來了,如果換成8X8燈板也可做到嗎?
理論上是可以的,畢竟同樣是WS2812。如果是64顆燈,我們計算一次總共要跑的次數,把程式碼中的次數1~11換成1~69就可以了,但這不會是我們要的結果,我要的結果如影片。
影片中的流星是隨機取y軸落下,我們先做固定y軸位置的版本。
這樣就可以跑出固定y軸的版本
以上就是吳老師教學的版本,吳老師使用的是數學運算的方式來撰寫程式碼,這會比較貼近撰寫程式的邏輯,延伸也會比較廣,值得好好學習。
那菜鳥的我當然就是拿來好好的應用,我們加入隨機取色和變換y軸的部分,因為吳老師已經做掉大部分的內容,所以我們只要添加幾個積木就完成了。
如此一來我們就完成隨機落下且會變色的流星燈!
也了解到數學運算在程式語言中佔有非常重要的地位,但這的確需要慢慢練習才會熟悉!
接下來就是延伸,我與吳老師都有想到如果今天我們要做出『下雨』的燈板,代表著是『同時多行落下』與『不同步』的感覺,這要怎麼做出來呢?