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