Как я могу сделать создатель массового кода MicroBit MakeCode?

Я работаю над проектом для 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) 
})

Спасибо!

0 ответов

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

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

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]);
    }
})

Все остальные микро: биты:


// 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: у меня не было возможности проверить, работает ли этот код. Сообщите мне, как это происходит:)

Другие вопросы по тегам