如何制作 MicroBit MakeCode 批量代码创建器?

Posted

技术标签:

【中文标题】如何制作 MicroBit MakeCode 批量代码创建器?【英文标题】:How can I make a MicroBit MakeCode mass code creator? 【发布时间】:2019-05-24 21:26:23 【问题描述】:

我正在为我所在城镇的 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】:

这里的挑战是想出一种方法,让每个 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:我没有机会测试这段代码是否有效。让我知道进展如何:)

【讨论】:

非常感谢您的帮助。我很感激。我已经测试过了,但我会确保。

以上是关于如何制作 MicroBit MakeCode 批量代码创建器?的主要内容,如果未能解决你的问题,请参考以下文章

micro:bit怎么随机显示动作

如何使用 MakeCode 在 Minecraft 中放置半块板

如何在 Microsoft MakeCode 中为 micro:bit 创建全局变量?

如何将 microbit 与 BLE 连接并监听按钮按下事件?

构建 MakeCode 包

[20个项目学会BBC micro:bit编程] 11-模拟舵机控制实验