File: four_buttons.py

package info (click to toggle)
firmware-microbit-micropython 1.0.1-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, sid
  • size: 25,448 kB
  • sloc: ansic: 83,496; cpp: 27,664; python: 2,475; asm: 274; makefile: 245; javascript: 41; sh: 25
file content (120 lines) | stat: -rw-r--r-- 3,389 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
"""Four buttons - 2 buttons + 2 more "buttons"!
A little example of using pins 1 & 2 an extra 2 buttons. By Tom Viner

Explanation and see running:
https://www.youtube.com/watch?v=6ofUJ6Mgk4k
"""
import microbit

# define some constants

DISPLAY_WIDTH = 5
DISPLAY_HEIGHT = 5

MIN_BRIGHTNESS = 0
MAX_BRIGHTNESS = 9

# A maths functions to help us

def clamp(minimum, n, maximum):
    """Return the nearest value to n, that's within minimum to maximum (incl)
    """
    return max(minimum, min(n, maximum))


# Helpers for controling the display

def light(brightness, filter):
    """Light up all pixels matching the filter function
    """
    brightness = clamp(MIN_BRIGHTNESS, round(brightness), MAX_BRIGHTNESS)
    for col in range(DISPLAY_WIDTH):
        for row in range(DISPLAY_HEIGHT):
            if filter(col, row):
                microbit.display.set_pixel(col, row, brightness)

def light_column(column):
    """Light up a whole column to max brightness
    """
    def filter_column(col, row):
        """For a given pixel position, turn on if it matches our column
        """
        return col == column
    light(MAX_BRIGHTNESS, filter_column)

def light_row(row):
    """Light up a whole row to max brightness
    """
    def filter_row(col, rw):
        """For a given pixel position, turn on if it matches our row
        """
        return rw == row
    light(MAX_BRIGHTNESS, filter_row)

def fade_display():
    """Reduce every pixel by 1 brightness level

    This means as we draw new things, the old ones will fade away
    """
    for col in range(5):
        for row in range(5):
            brightness = microbit.display.get_pixel(col, row)
            # reduce by one, but make sure it's still in 0 to 9
            brightness = clamp(MIN_BRIGHTNESS, brightness - 1, MAX_BRIGHTNESS)
            microbit.display.set_pixel(col, row, brightness)

def paint_box(top=0, bottom=DISPLAY_HEIGHT-1, left=0, right=DISPLAY_WIDTH-1):
    """Draw a filled in rectangle on the display
    """
    def filter_box(col, row):
        """For a given pixel position, turn it on if it's with the bounds
        """
        # remember rows count from 0 at the top!
        correct_vertical = top <= row <= bottom
        correct_horizontal = left <= col <= right
        return correct_vertical and correct_horizontal
    light(MAX_BRIGHTNESS, filter_box)


# Our main functions

def pin_is_touched(n):
    """Pass in a pin number (1 or 2),
    get back True if it's being touched right now

    In this way, it acts just like microbit.button_a.is_pressed()
    """
    pin = getattr(microbit, 'pin{}'.format(n))
    return pin.read_analog() > 300

def four_buttons():
    """Push buttons, touch pins, see if you can light up the whole display!
    """
    a_is_pressed = microbit.button_a.is_pressed()
    b_is_pressed = microbit.button_b.is_pressed()

    # let's call the two pin-buttons c and d:
    c_is_pressed = pin_is_touched(1)
    d_is_pressed = pin_is_touched(2)

    if a_is_pressed:
        light_row(2)
        paint_box(right=1)
    if b_is_pressed:
        light_row(3)
        paint_box(left=3)
    if c_is_pressed:
        light_column(1)
        paint_box(bottom=1)
    if d_is_pressed:
        light_column(3)
        paint_box(top=3)


while True:
    four_buttons()

    microbit.sleep(10)

    # fade all pixels by one brightness level
    fade_display()