Как я могу сделать создатель массового кода MicroBit MakeCode? - PullRequest
0 голосов
/ 25 мая 2019

Я работаю над проектом Maker Faire в моем городе.Я пытаюсь сделать так, чтобы 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 голосов
/ 19 июня 2019

Задача заключается в том, чтобы каждый микро: бит знал, какой у него порядковый номер при запуске.Если вы можете инициализировать каждый микро: бит с уникальным порядковым номером (например: 0, 1, 2, 3, 4, 5), то вы можете прошить один и тот же код на каждом микро: бите и просто использовать порядковый номерв качестве смещения.то есть: setGroup (sequenceNumber) ... setGroup (sequenceNumber + 1).В случае первого micro: bit это будут группы 0 и 1 соответственно, в случае второго micro: bit это будут группы 1 и 2 соответственно и так далее.

Я могу придумать несколько способов, чтобы каждый микро: бит имел свой собственный уникальный порядковый номер при запуске.Один из способов сделать это - установить их все на 0 при запуске, а затем использовать кнопки на каждом микро: бите, чтобы изменить порядковый номер.Примерно так:

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 будет хранить список всех устройств, которые он видел (по радио в предварительно заданной группе, например: 0), и для каждого нового micro: bit, который запрашивает порядковый номер, он присваивает ему уникальный номер и отправляет егоназад.Каждый из остальных битов micro: запускается на этапе инициализации, где он непрерывно запрашивает порядковый номер и опрашивает, пока не будет назначен один из них основным 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: у меня не было возможности проверить, работает ли этот код.Дайте мне знать, как оно идет:)

...