micro:bit大型跑馬燈

今天實作的micro:bit小程式,也是基於一對多的控制而改編成的大型跑馬燈程式。

micro:bit上的LED可顯示文字,如果長度超過二個字的文字便會以砲馬燈的方式由左到右依序出現。但是micro:bit的LED實在太小,一次只能出現一個字母,如果有多個micro:bit就可以組合成一個大型跑馬燈。

可多個micro:bit組合成大型跑馬燈

可將下方程式碼貼於makecode上的javascript頁面上

可多個micro:bit組合成大型跑馬燈

也可以轉成積木式語法使用

先準備一個micro:bit當做控制器,將以下的程式安裝進這個micro:bit裡面,然後讓這個控制器先開好機,跑馬燈的micro:bit開機後就會向這個控制器要求給定一個流水編號。控制器按A鍵或B鍵可選擇大型跑馬燈要顯示的字串,A+B鍵一起按,則會將選定好的字串送給跑馬燈micro:bit來顯示。要顯示的字串請自行修改以下的程式碼的最後一行陣列值:

let arrayStr: string[] = []
let myBits: string[] = []
let selectedStr = 0
input.onButtonPressed(Button.B, () => {
    selectedStr += 1
    if (selectedStr > arrayStr.length - 1) {
        selectedStr = arrayStr.length - 1
    }
    basic.showNumber(selectedStr + 1)
})
input.onButtonPressed(Button.A, () => {
    selectedStr += 0 - 1
    if (selectedStr < 0) {
        selectedStr = 0
    }
    basic.showNumber(selectedStr + 1)
})
radio.onDataPacketReceived(({ receivedString: receivedName, receivedNumber: receivedValue }) => {
    if (receivedValue == -1) {
        myBits.push(receivedName)
        radio.sendValue(receivedName, myBits.length - 1)
        basic.showNumber(myBits.length)
    }
})
input.onButtonPressed(Button.AB, () => {
    radio.sendValue("bits", myBits.length)
    basic.pause(1)
    radio.sendValue(arrayStr[selectedStr], -2)
})
radio.setGroup(1)
myBits = []
selectedStr = -1
//可修改、增刪以下的字串陣列,讓跑馬燈有更多字串可供顯示
arrayStr = ["micro:bit", "Hello World!", "Yes, I got it!"]

再準備多個micro:bit當做要顯示文字的跑馬燈,將以下的程式安裝進這些個micro:bit跑馬燈裡面,要先將上面所介紹的控制端的micro:bit先開機,然後依序打開跑馬燈micro:bit,以取得自身的順序編號,才會依照正確的順序顯示文字。

let myString = ""
let bits = 0
let myIndex = 0
radio.onDataPacketReceived(({ receivedString: receivedName, receivedNumber: receivedValue }) => {
    if (receivedName == "" + control.deviceSerialNumber()) {
        myIndex = receivedValue
        basic.showNumber(myIndex)
    } else if (receivedName == "bits") {
        bits = receivedValue
    } else if (receivedValue == -2) {
        myString = receivedName+"  "
        basic.clearScreen()
        marquee()
    }
})
function marquee() {
    led.setBrightness(0)
    basic.showString(myString.charAt(myIndex))
    for (let i = 0; i < 200; i++) {
        led.setBrightness(i)
        basic.pause(1)
    }
    basic.pause(1800)
    basic.showString(myString.substr(myIndex + 1))
}
basic.showString("?")
radio.setGroup(1)
myIndex = -1
myString = ""
bits = 0
radio.sendValue("" + control.deviceSerialNumber(), myIndex)