首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建MicroBit MakeCode批量代码创建器?

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

Stack Overflow用户
提问于 2019-05-25 05:26:23
回答 1查看 30关注 0票数 0

我正在为我的镇上的Maker Faire做一个项目。我正在尝试做的是让Micro:Bit通过无线电发送消息,由另一个人接收并通过另一个通道发送。然后是另一个Micro:Bit将会拾取它,以此类推。我有用于发送第一条消息的起始微:位的代码,以及接收第一条消息并再次发送它的第二条微:位的代码。每一个新的Micro:Bit都会将广播频道增加一个。有没有办法自动完成这项工作,而不需要为每个新的Micro:bit手动增加它?

这是我的第二个Micro:Bit的代码:

代码语言:javascript
复制
radio.onReceivedString(function (receivedString) {
radio.setGroup(1)
basic.showString(receivedString)
radio.setGroup(2)
radio.sendString(receivedString) 
})

谢谢!

EN

回答 1

Stack Overflow用户

发布于 2019-06-19 23:39:26

这里的挑战是想出一种方法,使每个微:位在启动时知道它的序列号。如果您能够使用唯一的序列号(例如: 0,1,2,3,4,5)初始化每个micro:位,那么您可以在每个micro:位上闪存相同的代码,只需使用序列号作为偏移量。例如: setGroup(sequenceNumber)...setGroup (sequenceNumber + 1)。在第一个微:位将分别是组0和1的情况下,在第二个微:位将分别是组1和2的情况下,依此类推。

我可以想到几种方法,让每个微:位在启动时都有自己唯一的序列号。一种方法是在启动时将它们全部设置为0,然后使用每个微:位上的按钮更改序列号。如下所示:

代码语言:javascript
复制
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:位将保存它看到的所有设备的列表(通过无线电在预设组上,例如: 0),并且对于请求序列号的每个新的micro:位,它将为其分配一个唯一的编号并将其发送回来。其他的micro:位将在初始化阶段启动,在初始化阶段,它不断请求序列号并轮询,直到它被主micro:位分配一个为止。

类似于以下内容:

师父:

代码语言:javascript
复制
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]);
    }
})

所有其他微:位:

代码语言:javascript
复制
// 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:我没有机会测试这段代码是否能正常工作。让我知道它的进展:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56299697

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档