我正在为我镇的Maker Faire设计一个项目。我想做的是让Micro:Bit通过无线电发送一条消息,另一条消息将通过另一条通道将其接收。然后,另一个Micro:Bit会拾取它,依此类推。我有发送第一个消息的起始micro:bit和接收第一个消息并再次发送出去的第二个micro:bit的代码。每个新的Micro:Bit都会使广播频道增加一倍。有什么方法可以自动执行此操作,而不必为每个新的Micro:bit手动将其撞上?
这是我第二个Micro:Bit的代码:
radio.onReceivedString(function (receivedString) {
radio.setGroup(1)
basic.showString(receivedString)
radio.setGroup(2)
radio.sendString(receivedString)
})
谢谢!
答案 0 :(得分:0)
这里的挑战是提出一种方法,以便每个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]);
}
})
所有其他micro:bits:
// 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:我没有机会测试此代码是否有效。让我知道怎么回事:)