MicroBit#
Overview#
Although the runtime is built from lots of small components, we also provide an easy to use pre-packaged collection of the commonly used components all in one place. This makes it much easier to start programming your micro:bit in C.
This grouping is provided by a C++ class called MicroBit
. The MicroBit
class has a number of
member variables, that operate as device drivers to control the most commonly used features of the micro:bit.
There is an instance of the MicroBit
class created as a global variable in all the sample programs, called uBit
:
uBit {
.i2c,
.storage,
.serial,
.MessageBus,
.buttonA,
.buttonB,
.buttonAB,
.display,
.accelerometer,
.compass,
.thermometer,
.io,
.radio,
}
You can use dot operator ‘.’ to any of these resources inside uBit to access any of the functions they provide. There is a complete list of the
functions available under the uBit
menu item in the navigation bar at the top of the page.
For example, if we needed to scroll some text across the display, we simply would write the following:
uBit.display.scroll("HELLO!");
Similarly, if we wanted to send some text over serial, we could write the following code:
for(int i = 3; i > 0; i--)
{
uBit.serial.printf("%d...", i);
uBit.sleep(1000);
}
// or alternatively...
uBit.serial.send("Code!");
The runtime also contains a scheduler, which uses lightweight threads (called fibers) to control the rate of execution.
To place the current fiber into a power efficient sleep write the following:
// where X is an integer in milliseconds for the amount of time you would like to sleep for.
uBit.sleep(X);
Message Bus ID#
None
Message Bus Events#
None
API#
Constructor#
MicroBit()#
Description#
Constructor.
Create a representation of a MicroBit device, which includes member variables that represent various device drivers used to control aspects of the micro:bit.
init#
void init()#
Description#
Post constructor initialisation method.
This call will initialised the scheduler, memory allocator and Bluetooth stack.
This is required as the Bluetooth stack can’t be brought up in a static context i.e. in a constructor.
Example#
uBit.init();
Note
This method must be called before user code utilises any functionality contained by uBit.
reset#
void reset()#
Description#
Will reset the micro:bit when called.
Example#
uBit.reset();
sleep#
void sleep( uint32_t milliseconds)#
Description#
Delay execution for the given amount of time.
If the scheduler is running, this will deschedule the current fiber and perform a power efficient, concurrent sleep operation.
If the scheduler is disabled or we’re running in an interrupt context, this will revert to a busy wait.
Alternatively: wait, wait_ms, wait_us can be used which will perform a blocking sleep operation.
Parameters#
uint32_tmilliseconds - the amount of time, in ms, to wait for. This number cannot be negative.
Returns#
MICROBIT_OK on success, MICROBIT_INVALID_PARAMETER milliseconds is less than zero.
Example#
uBit.sleep(20); //sleep for 20ms
Note
This operation is currently limited by the rate of the system timer, therefore the granularity of the sleep operation is limited to 6 ms unless the rate of the system timer is modified.
seedRandom#
void seedRandom()#
Description#
Seed the pseudo random number generator using the hardware random number generator.
Example#
uBit.seedRandom();
void seedRandom( uint32_t seed)#
Description#
Seed the pseudo random number generator using the given value.
Parameters#
uint32_tseed - The 32-bit value to seed the generator with.
Example#
uBit.seedRandom(0xBB5EED);
random#
int random( int max)#
Description#
Generate a random number in the given range. We use a simple Galois LFSR random number generator here, as a Galois LFSR is sufficient for our applications, and much more lightweight than the hardware random number generator built int the processor, which takes a long time and uses a lot of energy.
KIDS: You shouldn’t use this is the real world to generate cryptographic keys though… have a think why not. :-)
Parameters#
intmax - the upper range to generate a number for. This number cannot be negative.
Returns#
A random, natural number between 0 and the max-1. Or MICROBIT_INVALID_VALUE if max is <= 0.
Example#
uBit.random(200); //a number between 0 and 199
systemTime#
unsigned long systemTime()#
Description#
Determine the time since this MicroBit was last reset.
Returns#
The time since the last reset, in milliseconds.
Note
This will value overflow after 1.6 months.
systemVersion#
const char * systemVersion()#
Description#
Determine the version of the micro:bit runtime currently in use.
Returns#
A textual description of the version of the micro:bit runtime that is currently running on this device.
panic#
void panic()#
Description#
Triggers a microbit panic where an loop will display a panic face and the status code, if provided.
This loop will continue for panic_timeout iterations, defaults to 0 (infinite).
panic_timeout can be configured via a call to microbit_panic_timeout.
Example#
microbit_panic_timeout(4);
// will display loop for 4 iterations.
uBit.panic(10);
void panic( int statusCode)#
Description#
Triggers a microbit panic where an loop will display a panic face and the status code, if provided.
This loop will continue for panic_timeout iterations, defaults to 0 (infinite).
panic_timeout can be configured via a call to microbit_panic_timeout.
Parameters#
intstatusCode - the status code of the associated error.
Example#
microbit_panic_timeout(4);
// will display loop for 4 iterations.
uBit.panic(10);
addSystemComponent#
int addSystemComponent( MicroBitComponent * component)#
Description#
Add a component to the array of system components. This component will then receive periodic callbacks, once every tick period in interrupt context.
Parameters#
MicroBitComponent *component - The component to add.
Returns#
MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the component array is full.
Example#
// heap allocated - otherwise it will be paged out!
MicroBitDisplay* display = new MicroBitDisplay();
uBit.addSystemComponent(display);
Note
This interface is now deprecated, and will be removed in the next major release. Please use system_timer_add_component() .
removeSystemComponent#
int removeSystemComponent( MicroBitComponent * component)#
Description#
Remove a component from the array of system components. This component will no longer receive periodic callbacks.
Parameters#
MicroBitComponent *component - The component to remove.
Returns#
MICROBIT_OK on success or MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
Example#
// heap allocated - otherwise it will be paged out!
MicroBitDisplay* display = new MicroBitDisplay();
uBit.addSystemComponent(display);
uBit.removeSystemComponent(display);
Note
This interface is now deprecated, and will be removed in the next major release. Please use system_timer_remove_component() .
addIdleComponent#
int addIdleComponent( MicroBitComponent * component)#
Description#
Adds a component to the array of idle thread components, which are processed when the run queue is empty.
The system timer will poll isIdleCallbackNeeded on each component to determine if the scheduler should schedule the idle_task imminently.
Parameters#
MicroBitComponent *component - The component to add to the array.
Returns#
MICROBIT_OK on success or MICROBIT_NO_RESOURCES if the fiber components array is full.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
// heap allocated - otherwise it will be paged out!
MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
fiber_add_idle_component(accelerometer);
Note
This interface is now deprecated, and will be removed in the next major release. Please use fiber_add_idle_component() .
removeIdleComponent#
int removeIdleComponent( MicroBitComponent * component)#
Description#
Remove a component from the array of idle thread components
Parameters#
MicroBitComponent *component - The component to remove from the idle component array.
Returns#
MICROBIT_OK on success. MICROBIT_INVALID_PARAMETER is returned if the given component has not been previously added.
Example#
MicroBitI2C i2c(I2C_SDA0, I2C_SCL0);
// heap allocated - otherwise it will be paged out!
MicroBitAccelerometer* accelerometer = new MicroBitAccelerometer(i2c);
uBit.addIdleComponent(accelerometer);
uBit.removeIdleComponent(accelerometer);
Note
This interface is now deprecated, and will be removed in the next major release. Please use fiber_remove_idle_component() .