我如何制作MicroBit MakeCode大众代码创建者?

时间:2019-05-24 21:26:23

标签: makecode

我正在为我镇的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) 
})

谢谢!

1 个答案:

答案 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:我没有机会测试此代码是否有效。让我知道怎么回事:)