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