这里的挑战是想出一种方法,让每个 micro:bit 都知道它在启动时的序列号。如果您能够使用唯一的序列号(例如:0、1、2、3、4、5)初始化每个 micro:bit,那么您可以在每个 micro:bit 上刷新相同的代码并使用序列号作为抵消。即:setGroup(sequenceNumber)... setGroup(sequenceNumber + 1)。在第一个 micro:bit 的情况下,将分别是组 0 和 1,在第二个 micro:bit 的情况下,将分别是组 1 和 2,依此类推。
我可以想出几种方法让每个 micro:bit 在启动时都有自己的唯一序列号。一种方法是在启动时将它们全部设置为 0,然后使用每个 micro:bit 上的按钮更改序列号。像这样的东西:
let sequenceNumber = 0;
input.onButtonPressed(Button.A, function () {
if (sequenceNumber > 0) sequenceNumber--;
})
input.onButtonPressed(Button.B, function () {
sequenceNumber++;
})
radio.onReceivedString(function (receivedString) {
radio.setGroup(sequenceNumber)
basic.showString(receivedString)
radio.setGroup(sequenceNumber + 1)
radio.sendString(receivedString)
})
上述策略需要您绕过每个 micro:bit 并在刷新后手动设置它们的序列号。如果您再次闪烁它,您将不得不重复该过程..
解决这个问题的另一种方法是让所有 micro:bits 运行相同的程序,除了一个,我们将其称为主程序。这个主 micro:bit 将保留它看到的所有设备的列表(通过预设组上的无线电,例如:0),并且对于每个请求序列号的新 micro:bit,它将为其分配一个唯一编号并发送它背部。其他每个 micro:bit 都将在初始化阶段启动,在此阶段它不断请求一个序列号并轮询,直到它被主 micro:bit 分配一个。
类似于以下内容:
掌握:
let masterGroupNumber = 0; // predetermined group number for master micro:bit
let currentSequenceNumber = 1;
let devices: { [key: string]: number } = {};
radio.setGroup(masterGroupNumber);
radio.onReceivedValue(function (name: string, value: number) {
if (name === "uid") {
// We're received a unique id. Assign it a sequence number
// if it has not already been assigned
let uid = value.toString();
if (!devices[uid])
devices[uid] = currentSequenceNumber++;
radio.sendValue(uid, devices[uid]);
}
})
所有其他微:位:
// Begin the program in the initialization phase,
// we're waiting to be assigned a sequence number
let masterGroupNumber = 0; // predetermined group number for master micro:bit
let sequenceNumber = 0;
let hasSequenceNumber = false;
radio.setGroup(masterGroupNumber);
let uniqueDeviceId = control.deviceSerialNumber();
radio.onReceivedValue(function (name: string, value: number) {
if (name === uniqueDeviceId.toString()) {
sequenceNumber = value;
hasSequenceNumber = true;
}
})
// Poll till we've received a sequence number
while (!hasSequenceNumber) {
// Broadcast our unique device id.
radio.sendValue("uid", uniqueDeviceId);
// Wait a litte
basic.pause(500);
}
// We've established communication with the master micro:bit
// and have received a sequence number
radio.onReceivedString(function (receivedString) {
radio.setGroup(sequenceNumber)
basic.showString(receivedString)
radio.setGroup(sequenceNumber + 1)
radio.sendString(receivedString)
})
您可能还有其他一些方法可以做到这一点,但我希望这能给您一些想法。
ps:我没有机会测试这段代码是否有效。让我知道事情的后续 :)