Skip to content

Display Alarm Icon

 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
from array import array

def draw_alarm_icon(display, x, y, alarm_hour, alarm_minute, size=24):
    """
    Draw an alarm bell icon with time display using polygons.

    Args:
        display: SSD1306 display instance
        x, y: Top-left position for the icon
        alarm_hour: Hour of the alarm (1-12)
        alarm_minute: Minute of the alarm (0-59)
        size: Base size of the icon (default 24 pixels)
    """
    # Scale factors
    scale = size / 24  # Base size is 24 pixels

    # Bell body coordinates (scaled from base design)
    bell_body = array('B', [
        int(4 * scale),  int(0 * scale),    # Top left of dome
        int(20 * scale), int(0 * scale),    # Top right of dome
        int(24 * scale), int(12 * scale),   # Bottom right curve
        int(22 * scale), int(18 * scale),   # Right side
        int(2 * scale),  int(18 * scale),   # Left side
        int(0 * scale),  int(12 * scale),   # Bottom left curve
    ])

    # Bell base coordinates
    bell_base = array('B', [
        int(2 * scale),  int(18 * scale),   # Top left
        int(22 * scale), int(18 * scale),   # Top right
        int(20 * scale), int(20 * scale),   # Bottom right
        int(4 * scale),  int(20 * scale),   # Bottom left
    ])

    # Clapper coordinates
    clapper = array('B', [
        int(11 * scale), int(20 * scale),   # Top
        int(13 * scale), int(20 * scale),   # Top right
        int(14 * scale), int(24 * scale),   # Bottom right
        int(10 * scale), int(24 * scale),   # Bottom left
    ])

    # Sound wave lines (using array for consistency)
    left_wave = array('B', [
        int(0 * scale),  int(12 * scale),
        int(-3 * scale), int(12 * scale),
        int(-4 * scale), int(14 * scale),
        int(-3 * scale), int(16 * scale),
    ])

    right_wave = array('B', [
        int(24 * scale), int(12 * scale),
        int(27 * scale), int(12 * scale),
        int(28 * scale), int(14 * scale),
        int(27 * scale), int(16 * scale),
    ])

    # Draw the components
    display.poly(x, y, bell_body, 1, 1)  # Filled bell body
    display.poly(x, y, bell_base, 1, 1)  # Filled bell base
    display.poly(x, y, clapper, 1, 1)    # Filled clapper

    # Draw the sound waves
    if size >= 20:  # Only draw waves if icon is large enough
        display.poly(x, y, left_wave, 1, 0)   # Left sound wave
        display.poly(x, y, right_wave, 1, 0)  # Right sound wave

    # Draw the alarm time below the bell
    time_str = f"{alarm_hour:2d}:{alarm_minute:02d}"
    # Center the time string under the bell
    text_x = x + (int(24 * scale) - len(time_str) * 6) // 2
    text_y = y + int(26 * scale)
    display.text(time_str, text_x, text_y, 1)

def demo_alarm_icons(display):
    """
    Demonstrate the alarm icon at different sizes and positions
    """
    # Clear the display
    display.fill(0)

    # Draw three different sized bells
    draw_alarm_icon(display, 0, 0, 7, 30, size=20)    # Small bell
    draw_alarm_icon(display, 35, 0, 8, 15, size=28)   # Medium bell
    draw_alarm_icon(display, 80, 0, 6, 45, size=36)   # Large bell

    # Update the display
    display.show()

# Example usage:
"""
oled = ssd1306.SSD1306_SPI(128, 64, spi, DC, RES, CS)
demo_alarm_icons(oled)
"""