Lightning Calculator for the Microbit

Lightning Calculator for the Microbit

Ahead of a maker class I'm teaching in a week or so I've been thinking of what kinds of things are appropriate, easy to understand but complete applications. One I came up with was a lightning calculator. Press one button when you see the lightning, press another button when you hear the thunder. The microbit takes the time difference between the two events and works out an estimate of how far away is the storm.

# Lightning Calculator for microbit
# Press button first time for lightning
# Second time for thunder
# Calculates how far away storm is

from microbit import *

# Wait for a button push and return the time
def wait_for_any_button():
    
    time = 0
    
    while True:
        if button_a.was_pressed() or button_b.was_pressed():
            time = running_time()
            break

        sleep(100)
        
    return time
    
def calculate_distance(speed, time):
    return speed * time
    
speedOfSoundMetresPerSecond = 340

lightning = Image(
            "00990:"
            "09900:"
            "99999:"
            "00990:"
            "09000")
        
ear = Image(
            "09999:"
            "90000:"
            "90009:"
            "90000:"
            "09999")

# calculate continuously
while True:

    flashTime = 0
    thunderTime = 0
    
    # we're waiting for the lightning
    display.show(lightning)
    flashTime = wait_for_any_button()
    
    # now the thunder
    display.show(ear)
    thunderTime = wait_for_any_button()
    
    timeDifference = thunderTime - flashTime
    timeDifferenceInSeconds = timeDifference / 1000
    distanceInMeters = calculate_distance(speedOfSoundMetresPerSecond, timeDifferenceInSeconds)

    if distanceInMeters > 1000:
        display.scroll(str(distanceInMeters / 1000) + " km")
    else:    
        # storm is... metres away
        display.scroll(str(distanceInMeters) + " m")
        

I've tried to represent what event the microbit expects by displaying either a lightning flash or a (poorly drawn) ear.