For this challenge we will use the microbit and a couple of LEDs to act as the indicators lights of a car. Our aim is to use the built-in accelerometer sensor of the mincro:bit to detect if it is being tilted to the left or to the right. If so, the micro:bit will “turn the indicator” on by making one of the two yellow LEDs blink to indicate the player is turning to the left or to the right.
Electronic Circuit
First we need to build the electronic circuit using a micro:bit, two LEDs, a few wires and crocodile clips and a bread board.
BBC micro:bit Code
Then we need to code the micro-bit to take control of the LEDs. You will need to use the micro:bit website to create the code using the JavaScript Block Editor.
Extension Task
Add an extra red LED to act as the break light. Buttons A and B of the micro:bit will act as the accelerator pedal (Button A) and the break pedal (Button B). When button B is pressed the break light (red LED) should turn on.
Extra Challenge
Using a red and a blue LED create an electronic circuit for the siren of a police car or a fire truck. Code your micro:bit to create the lighting sequence/pattern of your choice for your siren. You could also add a buzzer/speaker to create the sound of the siren. Use buttons A and B of the micro:bit to turn the siren on or off.
Have you ever seen a lightning flash or heard the thunder of lightning and wondered how close you were from the lightning strike? Have you noticed that there often was a delay between the flash of light and the clap of thunder when a lightning occurs?
It is possible to calculate the distance to a lightning strike by counting the seconds between the lightning flash and the sound of thunder.
When lightning strikes, the first thing you see is the flash of light which you can see instantly. This is because light travels at a very high speed (Speed of light = 300,000 km/s). At the same time a clap of thunder is created. However, in the air a sound wave does not travel as fast as light, so it may take a few seconds for this clap of thunder to reach you. This depends on how far you are from the lightning.
Look at the following diagram and check the formula of speed. Bear in mind that the speed of a sound wave in the air is 340 m/s.
Your Challenge
Write a program for the BBC micro:bit that will allow the user to:
Press the A button of the micro:bit when they spot a lightning flash.
Press the B button of the micro:bit when they hear the thunderstorm.
Display the distance (in meters) from the lightning strike using the LED screen.
Solution
We will complete this project in three main coding blocks.
First, let’s display an arrow pointing left to invite the user to press button A when they see a lightning strike.
Then we will record the exact time (in milliseconds) as to when button A was pressed and store this number in a variable called lightning. We will also display an arrow pointing towards button B.
Let’s now record the time (in milliseconds) when button B is pressed using a variable called thunder. We can then use these two timestamps to work out the time delay between the lightning strike and when the thunder was heard. Using the distance = speed x time formula, we can then workout and output the distance in meters from the lightning strike:
Solution...
The solution for this challenge is available to full members! Find out how to become a member: ➤ Members' Area
During a gold rush, gold miners use different techniques to find traces of gold hidden in the ground. One technique that miners use is gold panning. It consists of scooping some gravels and clear water in a pan which is gently agitated until small gold nuggets sinks to the bottom of the pan and can be handpicked.
For this challenge the pan will be the micro:bit. A LED light will represent a gold nugget. The aim is to tilt the micro:bit slightly to detect and pick up the gold nugget.
We will be using the built-in accelerometer sensor to detect in which direction the microbit is being tilted.
Every time the player (miner) will pick a gold nugget a new one will randomly appear on the 5 x 5 LED screen.
Checking the code above answer the following questions:
Can you identify the block of code used for the micro:bit to detect if it has been tilted to the left?
Can you identify the block of code used for the micro:bit to know when the miner has picked up a gold nugget?
Can you explain how does the micro:bit decide to stop the game by running the last block to display the Game Over message?
Extension Task
Change this game to use a timer. The game should last exactly 1 minute. Everytime the player picks up a gold nugget their score should increment by 1. After 1 minute, the game should stop and display the total score.
Ideas to get started
You could use a variable called “timer” and set it to 60000ms.
You could decrement your timer variable when the game is paused.
You will have to change the condition of your while loop: Instead of while score<10, use while timer>0.
Make sure that you display the final score at the end of the game.
Solution...
The solution for this challenge is available to full members! Find out how to become a member: ➤ Members' Area
In this challenge we will use the BBC micro:bit to control a RGB LED to create a gradient light effect where the LED will fade from red to purple, to blue, to purple and back to red.
To do so we will need:
A BBC micro:bit
A RGB LED
3 resistors (100 Ohms)
A breadboard
4 wires
RGB Colour Codes
Did you know that every colour on the screen can be represented using an RGB code (Red, Green, Blue) code. This code consists of three numbers between 0 and 255, indicating how much red, green and blue are used to recreate the colour.
For instance the RGB code for:
Red is (255,0,0)
Green is (0,255,0)
Blue is (0,0,255)
Yellow is (255,255,0)
Orange is (255,165,0)
Check the following RGB Color picker to see how RGB codes work:
Electric Circuit
An RGB LED is a 3-in-1 LED. It consists of a RED LED, a Green LED and a Blue LED all within the same component. It has 3 cathodes (+ pins) that can take different amperages. It has 1 common anode (- pin).
This is how we will connect our RGB LED to our micro:bit.
The purpose of the resistors is to limit the amperage in the circuit and hence protect the LED from receiving a too strong current (which could damage the LED). The resistors we use here are 100 ohms (Brown Black Brown rings).
micro:bit Code
Here is the code needed in the micro:bit to implement the gradient fading effect. Note that you will need to use the micro:bit website to create the code using the JavaScript Block Editor.
Step 1: Initial RGB values
Step 2: Red to Blue Gradient
Step 3: Blue to Red Gradient
Your Challenge
Tweak this code to create other gradient animations: Gradient 1: Cyan, Magenta, Cyan Gradient 2: Cyan, Yellow, Cyan Gradient 3: Green, Yellow, Magenta, Cyan, Green
In this challenge we will create a game for the BBC micro:bit.
Imagine you have been asked to bring a cupcake to Her Majesty the Queen Elizabeth II. You have picked the best cupcake from the kitchen and placed it at the centre of a silver tray.
You will have to carry the cupcake on its tray to the Queen, walking through the many rooms and corridors of Buckingham Palace.
Watch out, if you tilt the tray, you may end up dropping the Queen’s cupcake!
For this challenge we will replace the silver tray with a BBC micro:bit. The cupcake will be a sprite positioned in the centre of the LED screen, the tray will be the grid of 5×5 LEDs on the micro:bit.
The player will have to carry the micro:bit flat on the back of their hand, and carry it around the room, making sure they keep it as flat as possible.
Our program will use the built-in accelerometer input sensor of the micro:bit to find out if the micro:bit is leaning (forward, backward, to the left or to the right).
If so the sprite (cupcake) will slide in the right direction (The LED light will move on the 5×5 grid).
The game will end when/if the cupcake is at the edge of the 5X5 LED grid and the micro:bit is still tilted: the cupcake is falling off the grid/tray.
Video Demo
The Code
You will need to use the micro:bit website to create the code using the JavaScript Block Editor.
Code Review
Checking the code above answer the following questions:
Can you identify the block of code used for the micro:bit to detect if it has been tilted to the left?
Can you identify the block of code used for the micro:bit to know when the cupcake is falling off the tray?
Can you explain how does the microbit decide to stop the game by running the last block to display the Game Over message?
Can you explain the purpose of the variable called tolerance?
Why do we need a tolerance?
What would be the impact on the game if the tolerance with 500 instead of 200? (Would it be easier to play or harder? Why?)
What would be the impact on the game if the tolerance with 50 instead of 200? (Would it be easier to play or harder? Why?)
Extension Task 1
Add some more code to this game to record how long the player/waiter took to deliver the cupcake.
The micro:bit should record the running time from the start (just after the “3-2-1-Go” message) and allow the user to stop the game when they press button A.
The player will have to follow a set route (e.g. around the classroom) and if they manage to complete the route without dropping the cupcake, they should press button A to stop the counter, and the micro:bit should display their time.
Extension Task 2
Tweak the code so that if a player has been playing for 10 seconds without dropping the cupcake, the tolerance then changes to make the game harder to play (e.g. tolerance change from 200 to 100)
Solution...
The solution for this challenge is available to full members! Find out how to become a member: ➤ Members' Area
For this challenge we are creating a game of Tetris to play on the BBC micro:bit.
The game will be based on the following four shapes:
The game will use the following inputs:
Button A: Move current brick to the left
Button B: Move current brick to the right
Button A and B simultaneously: Rotate current brick clockwise
Video Demo
The game will use the LED screen which consists of a 5×5 grid of 25 LEDs.
Each LED can be on (value: 9 for maximum brightness) or Off (value: 0)
The side/borders of the grid will note be displayed.
The Python code will use 2-dimension arrays (list of lists in Python) to store the main grid (7×5) and the current brick (2×2)
To test this code you will need to use the Python Editor from the micro:bit website.
Python Code
from microbit import *
from random import choice
#Set up the tetris grid
grid=[[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,0,0,0,0,0,1],[1,1,1,1,1,1,1]]
#Store a list of 4 bricks, each brick is a 2x2 grid
bricks = [[9,9],[9,0]],[[9,9],[0,9]],[[9,9],[9,9]],[[9,9],[0,0]]
#select a brick randomly and position it at the center/top of the grid (y=0,x=3)
brick = choice(bricks)
x=3
y=0
frameCount=0
#A function to return the maximum of two values
def max(a,b):
if a>=b:
return a
else:
return b
#A function to hide the 2x2 brick on the LED screen
def hideBrick():
if x>0:
display.set_pixel(x-1,y,grid[y][x])
if x<5:
display.set_pixel(x+1-1,y,grid[y][x+1])
if x>0 and y<4:
display.set_pixel(x-1,y+1,grid[y+1][x])
if x<5 and y<4:
display.set_pixel(x+1-1,y+1,grid[y+1][x+1])
#A function to show the 2x2 brick on the LED screen
def showBrick():
if x>0:
display.set_pixel(x-1,y,max(brick[0][0],grid[y][x]))
if x<5:
display.set_pixel(x+1-1,y,max(brick[0][1],grid[y][x+1]))
if x>0 and y<4:
display.set_pixel(x-1,y+1,max(brick[1][0],grid[y+1][x]))
if x<5 and y<4:
display.set_pixel(x+1-1,y+1,max(brick[1][1],grid[y+1][x+1]))
#A function to rotate the 2x2 brick
def rotateBrick():
pixel00 = brick[0][0]
pixel01 = brick[0][1]
pixel10 = brick[1][0]
pixel11 = brick[1][1]
#Check if the rotation is possible
if not ((grid[y][x]>0 and pixel00>0) or (grid[y+1][x]>0 and pixel10>0) or (grid[y][x+1]>0 and pixel01>0) or (grid[y+1][x+1]>0 and pixel11>0)):
hideBrick()
brick[0][0] = pixel10
brick[1][0] = pixel11
brick[1][1] = pixel01
brick[0][1] = pixel00
showBrick()
#A function to move/translate the brick
def moveBrick(delta_x,delta_y):
global x,y
move=False
#Check if the move if possible: no collision with other blocks or borders of the grid
if delta_x==-1 and x>0:
if not ((grid[y][x-1]>0 and brick[0][0]>0) or (grid[y][x+1-1]>0 and brick[0][1]>0) or (grid[y+1][x-1]>0 and brick[1][0]>0) or (grid[y+1][x+1-1]>0 and brick[1][1]>0)):
move=True
elif delta_x==1 and x<5:
if not ((grid[y][x+1]>0 and brick[0][0]>0) or (grid[y][x+1+1]>0 and brick[0][1]>0) or (grid[y+1][x+1]>0 and brick[1][0]>0) or (grid[y+1][x+1+1]>0 and brick[1][1]>0)):
move=True
elif delta_y==1 and y<4:
if not ((grid[y+1][x]>0 and brick[0][0]>0) or (grid[y+1][x+1]>0 and brick[0][1]>0) or (grid[y+1+1][x]>0 and brick[1][0]>0) or (grid[y+1+1][x+1]>0 and brick[1][1]>0)):
move=True
#If the move is possible, update x,y coordinates of the brick
if move:
hideBrick()
x+=delta_x
y+=delta_y
showBrick()
#Return True or False to confirm if the move took place
return move
#A function to check for and remove completed lines
def checkLines():
global score
removeLine=False
#check each line one at a time
for i in range(0, 5):
#If 5 blocks are filled in (9) then a line is complete (9*5=45)
if (grid[i][1]+grid[i][2]+grid[i][3]+grid[i][4]+grid[i][5])==45:
removeLine = True
#Increment the score (10 pts per line)
score+=10
#Remove the line and make all lines above fall by 1:
for j in range(i,0,-1):
grid[j] = grid[j-1]
grid[0]=[1,0,0,0,0,0,1]
if removeLine:
#Refresh the LED screen
for i in range(0, 5):
for j in range(0, 5):
display.set_pixel(i,j,grid[j][i+1])
return removeLine
gameOn=True
score=0
showBrick()
#Main Program Loop - iterates every 50ms
while gameOn:
sleep(50)
frameCount+=1
#Capture user inputs
if button_a.is_pressed() and button_b.is_pressed():
rotateBrick()
elif button_a.is_pressed():
moveBrick(-1,0)
elif button_b.is_pressed():
moveBrick(1,0)
#Every 15 frames try to move the brick down
if frameCount==15 and moveBrick(0,1) == False:
frameCount=0
#The move was not possible, the brick stays in position
grid[y][x]=max(brick[0][0],grid[y][x])
grid[y][x+1]=max(brick[0][1],grid[y][x+1])
grid[y+1][x]=max(brick[1][0],grid[y+1][x])
grid[y+1][x+1]=max(brick[1][1],grid[y+1][x+1])
if checkLines()==False and y==0:
#The brick has reached the top of the grid - Game Over
gameOn=False
else:
#select a new brick randomly
x=3
y=0
brick = choice(bricks)
showBrick()
if frameCount==15:
frameCount=0
#End of Game
sleep(2000)
display.scroll("Game Over: Score: " + str(score))
Note: When testing this code, you may want to remove some of the #annotations especially if your micro:bit returns a “memory full” error.
Reuse and adapt your code to transform your BBC micro:bit into a dice. Your code will need to generate a random number (between 1 and 6) and based on the value of this number display (using the LEDs) the corresponding face of the dice:
For this challenge you will design and write a program to play against the BBC micro:bit.
The micro:bit will display a random number between 0 and 100. It will then ask the end-user whether they believe the next number will be higher or lower. The program will then generate the next number. If the user guessed right (e.g. the next number is higher or lower than the previous one) then the user scores one point. The game stops when the user guesses it wrong.
Learning Objectives
By completing this challenge you are going to use selection (IF statements) and comparison operators such as >= or <= to compare numbers.
You will also use variables to store the value of random numbers, and to keep and increment a score as the game progresses.
Solution
Try to implement the game by yourself on the BBC micro:bit website:
If you are stuck you can always use our solution below:
Step 1: Initialising the game
For our game we will need three variables:
number: the current number, randomly selected (between 0 and 100) being displayed on the LED screen,
nextNumber: the next number, also randomly selected between 0 and 100, but kept secret, the user will decide if they beieve it will be higher or lower than the current number,
score: the score will start at 0 and increment by 1 everytime the user has a good guess.
Step 2: Button A: Lower
When the user presses button A, they believe the next number will be lower than the current number. We can check if they are right or not.
If they are correct, we will display a smiley face, add 1 to their score and the nextNumber will become the current number whereas a new nextNumber is generated for the game to continue.
If they are wrong though, we will display a sad face as well as the value of the next number followed y the user score.
Step 3: Button B: Higher
Step 3 is very similar to step 2 but this time we are checking whether the next number is higher than the current number.
Extension Task:
That’s it you have a fully working game. We can tweak it slightly though. For instance how could we code the micro:bit so that when the user presses both the A and B buttons at the same time, the game restarts from the beginning – a new set of numbers is generated and the score is reset to zero?
In this challenge we will write a Python program to randomly shoot an arrow on a target. We will then use Pythagoras’ Theorem to calculate the distance between the arrow impact and the centre of the target. This distance will let us find out how many points to award to this shoot.
Scoring System
For our program we will be using the following scoring system:
Pythagoras’ Theorem
The arrow will be issued (x,y) coordinates randomly. Our script will use these coordinates to calculate the distance of the arrow from the centre of the target (0,0).
With this distance we can then decide how many points to be given using the following criteria:
Distance between 121 – 150 pixels (White Ring) = 1 point
Distance above 150 pixels (Off Target) = 0 point
The code so far…
As you can see we have started the code for you below but still have work to do on line 44 to 54 to calculate the distance of the arrow from the centre of the target and calculate the score.
You challenge is to complete this code (line 44 to 54).
Extension Task
Can you let the computer shoot three arrows and display the total score of all three arrows, by adding the score of each arrow.
Solution...
The solution for this challenge is available to full members! Find out how to become a member: ➤ Members' Area
In this challenge we will code our BBC micro:bit to create a “rolling dice” animation.
Our code will generate random numbers between 1 and 6 to create the animation and will include 8 frames. The last frame will be the number picked up by the dice. Here is a preview of the animation (on an infinite loop):
You can recreate this digital dice using the BBC micro:bit website.
Building the code, step by step:
Our “rolling the dice” animation will start when the user presses the A button on the micro-bit.
To create the animation we will then use a loop (repeat 8 times):
For each frame we will generate a random number between 1 and 6 using the following code:
We will then check the value of this random number using an IF block:
To display this number as it will appear on a dice we will use the “show leds” block:
We will repeat the last two steps for all the 6 possible faces of the dice by adding ELSE IF blocks to our IF block:
Finally we will add a pause between each frame (between each iteration of the loop):