友情提示:380元/半年,儿童学编程,就上码丁实验室。
上次课做了一个micro:bit报数的小程序,每个micro:bit可以利用其出厂时的DeviceSerialNumber来寻址。今天以这个寻址程序为基础,实作以一个micro:bit控制多个micro:bit的小程序。这个小程序可选择要控制哪些micro:bit,并且选择这些micro:bit的LED要出现什么图案。
选一个micro:bit当做控制器,其他的micro:bit开机后会向控制器取得一个流水号当做自己的编号,主控端的micro:bit可利用A键或B键选择要控制哪个号码,也可以在号码出现时摇一下,将该号码储存进一个数组,被选择到的号码便可以被主控端一起控制,决定好号码后同时按A+B键。接下来再按A键或B键可选择受控的micro:bit要出现什么LED图案,选择好后一样按A+B键,便可以将图案送到受控端的micro:bit。
详细的操作方式请参考以下影片:
用A键及B键,可选择要控制的micro:bit编号及图案
可控制所有的micro:bit同时出现某个图案
可控制所有的micro:bit同时出现某个图案
也可以控制个别的micro:bit出现不同的图案
控制方法:
1.先将主控端的micro:bit先开启,被控端的micro:bit依序开起,被控端会向主控端取得流水编号,并显示在自己的LED上。
2.主控端按A或B键,会显示号码,出现该号码表示该号码的micro:bit可被控制,若想控制多个,则在显示该号码时用力摇动,则该号码会被记录下来,以便可以被控制。选好后,同时按A+B键,则表示选号确定,这时LED上会显示打勾,表示选号选好了。
3.接着主控端按A或B键则会显示要传送的图案,选好后同时按A+B键,则表示选好图案确定,这时LED上会显示打勾,受控端的micro:bit便会出现图案。
程序代码:
以下为主控端及被控端的程序,可将程序代码贴上makecode的javascript页面上,可以直接转成积木式的语法结构
主控端参考程序:
let bitSTEMp: number[] = []
let countBits = 0
let myBits: string[] = []
let myStep = 0
let selectedBit = 0
let selectedIcon = 0
input.onButtonPressed(Button.B, () => {
if (myStep == 1) {
selectedBit += 1
if (selectedBit > countBits – 1) {
selectedBit = countBits – 1
}
if (selectedBit == -1) {
basic.showString(“A”)
} else {
basic.showNumber(selectedBit)
}
}
if (myStep == 2) {
selectedIcon += 1
if (selectedIcon > 39) {
selectedIcon = 39
}
basic.showIcon(selectedIcon)
}
})
radio.onDataPacketReceived(({receivedString: receivedName, receivedNumber: receivedValue }) => {
if (receivedValue == -1) {
myBits.push(receivedName)
radio.sendValue(receivedName, countBits)
countBits += 1
basic.showNumber(countBits)
}
})
input.onButtonPressed(Button.A, () => {
if (myStep == 1) {
selectedBit += -1
if (selectedBit < -1) {
selectedBit = -1
}
if (selectedBit == -1) {
basic.showString(“A”)
} else {
basic.showNumber(selectedBit)
}
}
if (myStep == 2) {
selectedIcon += -1
if (selectedIcon < -1) {
selectedIcon = -1
}
if (selectedIcon == -1) {
basic.showString(“C”)
} else {
basic.showIcon(selectedIcon)
}
}
})
input.onButtonPressed(Button.AB, () => {
if (myStep == 1) {
basic.showIcon(IconNames.Yes)
basic.clearScreen()
}
if (myStep == 2) {
basic.clearScreen()
if (bitSTEMp.length > 0) {
for (let index = 0; index < bitsTemp.length; index++) {
radio.sendValue(“” +bitsTemp[index], selectedIcon)
}
} else if (selectedBit == -1) {
radio.sendValue(“all”, selectedIcon)
} else {
radio.sendValue(“” + selectedBit, selectedIcon)
}
basic.showString(“send”)
}
myStep += 1
if (myStep == 3) {
myStep = 1
bitsTemp = []
}
})
input.onGesture(Gesture.Shake, () => {
if (myStep == 1 && selectedBit != -1) {
bitsTemp.push(selectedBit)
basic.showIcon(IconNames.Happy)
}
})
radio.setGroup(1)
myBits = []
bitsTemp = []
countBits = 0
myStep = 1
selectedBit = -1
selectedIcon = -1
被控端参考程序:
let myIndex = 0
radio.onDataPacketReceived( ({receivedString: receivedName, receivedNumber: receivedValue }) => {
if (receivedName == “” + control.deviceSerialNumber()) {
myIndex = receivedValue
basic.showNumber(myIndex)
}
if (receivedName == “” + myIndex) {
if (receivedValue == -1) {
basic.clearScreen()
} else {
basic.showIcon(receivedValue)
}
}
if (receivedName == “all”) {
if (receivedValue == -1) {
basic.clearScreen()
} else {
basic.showIcon(receivedValue)
}
}
})
basic.showString(“?”)
radio.setGroup(1)
myIndex = -1
radio.sendValue(“” +control.deviceSerialNumber(), myIndex)
这个范例只是展示一对多控制micro:bit的LED,当然,若要控制其他的动作也是可以的,例如伺服马达或是一整群的机器人大军。
原文参考
https://www.facebook.com/permalink.php?story_fbid=1470367746332117&id=100000767174283&pnref=story
转自公众号:
易心Microbit编程