diff --git a/KugelmühleSchaltplan/KugelmühleSchaltplan-backups/KugelmühleSchaltplan-2026-09-25_015705.zip b/KugelmühleSchaltplan/KugelmühleSchaltplan-backups/KugelmühleSchaltplan-2026-09-25_015705.zip new file mode 100644 index 0000000..bcb9111 Binary files /dev/null and b/KugelmühleSchaltplan/KugelmühleSchaltplan-backups/KugelmühleSchaltplan-2026-09-25_015705.zip differ diff --git a/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_prl b/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_prl index 5eea5ae..8e0486a 100644 --- a/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_prl +++ b/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_prl @@ -30,41 +30,21 @@ "zones": true }, "visible_items": [ - "vias", - "footprint_text", - "footprint_anchors", - "ratsnest", - "grid", - "footprints_front", - "footprints_back", - "footprint_values", - "footprint_references", - "tracks", - "drc_errors", - "drawing_sheet", - "bitmaps", - "pads", - "zones", - "drc_warnings", - "drc_exclusions", - "locked_item_shadows", - "conflict_shadows", - "shapes", - "board_outline_area", - "ly_points" + 12 ], - "visible_layers": "ffffffff_ffffffff_ffffffff_ffffffff", + "visible_layers": "fffffff_ffffffff", "zone_display_mode": 0 }, "git": { "integration_disabled": false, + "repo_password": "", "repo_type": "", "repo_username": "", "ssh_key": "" }, "meta": { "filename": "KugelmühleSchaltplan.kicad_prl", - "version": 5 + "version": 3 }, "net_inspector_panel": { "col_hidden": [], diff --git a/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_pro b/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_pro index 4496911..abfa4ac 100644 --- a/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_pro +++ b/KugelmühleSchaltplan/KugelmühleSchaltplan.kicad_pro @@ -1,6 +1,205 @@ { "board": { "3dviewports": [], + "design_settings": { + "defaults": { + "apply_defaults_to_fp_fields": false, + "apply_defaults_to_fp_shapes": false, + "apply_defaults_to_fp_text": false, + "board_outline_line_width": 0.05, + "copper_line_width": 0.2, + "copper_text_italic": false, + "copper_text_size_h": 1.5, + "copper_text_size_v": 1.5, + "copper_text_thickness": 0.3, + "copper_text_upright": false, + "courtyard_line_width": 0.05, + "dimension_precision": 4, + "dimension_units": 3, + "dimensions": { + "arrow_length": 1270000, + "extension_offset": 500000, + "keep_text_aligned": true, + "suppress_zeroes": false, + "text_position": 0, + "units_format": 1 + }, + "fab_line_width": 0.1, + "fab_text_italic": false, + "fab_text_size_h": 1.0, + "fab_text_size_v": 1.0, + "fab_text_thickness": 0.15, + "fab_text_upright": false, + "other_line_width": 0.1, + "other_text_italic": false, + "other_text_size_h": 1.0, + "other_text_size_v": 1.0, + "other_text_thickness": 0.15, + "other_text_upright": false, + "pads": { + "drill": 0.762, + "height": 1.524, + "width": 1.524 + }, + "silk_line_width": 0.1, + "silk_text_italic": false, + "silk_text_size_h": 1.0, + "silk_text_size_v": 1.0, + "silk_text_thickness": 0.1, + "silk_text_upright": false, + "zones": { + "min_clearance": 0.5 + } + }, + "diff_pair_dimensions": [], + "drc_exclusions": [], + "meta": { + "version": 2 + }, + "rule_severities": { + "annular_width": "error", + "clearance": "error", + "connection_width": "warning", + "copper_edge_clearance": "error", + "copper_sliver": "warning", + "courtyards_overlap": "error", + "diff_pair_gap_out_of_range": "error", + "diff_pair_uncoupled_length_too_long": "error", + "drill_out_of_range": "error", + "duplicate_footprints": "warning", + "extra_footprint": "warning", + "footprint": "error", + "footprint_symbol_mismatch": "warning", + "footprint_type_mismatch": "ignore", + "hole_clearance": "error", + "hole_near_hole": "error", + "invalid_outline": "error", + "isolated_copper": "warning", + "item_on_disabled_layer": "error", + "items_not_allowed": "error", + "length_out_of_range": "error", + "lib_footprint_issues": "warning", + "lib_footprint_mismatch": "warning", + "malformed_courtyard": "error", + "microvia_drill_out_of_range": "error", + "missing_courtyard": "ignore", + "missing_footprint": "warning", + "net_conflict": "warning", + "npth_inside_courtyard": "ignore", + "padstack": "warning", + "pth_inside_courtyard": "ignore", + "shorting_items": "error", + "silk_edge_clearance": "warning", + "silk_over_copper": "warning", + "silk_overlap": "warning", + "skew_out_of_range": "error", + "solder_mask_bridge": "error", + "starved_thermal": "error", + "text_height": "warning", + "text_thickness": "warning", + "through_hole_pad_without_hole": "error", + "too_many_vias": "error", + "track_dangling": "warning", + "track_width": "error", + "tracks_crossing": "error", + "unconnected_items": "error", + "unresolved_variable": "error", + "via_dangling": "warning", + "zones_intersect": "error" + }, + "rules": { + "max_error": 0.005, + "min_clearance": 0.0, + "min_connection": 0.0, + "min_copper_edge_clearance": 0.5, + "min_hole_clearance": 0.25, + "min_hole_to_hole": 0.25, + "min_microvia_diameter": 0.2, + "min_microvia_drill": 0.1, + "min_resolved_spokes": 2, + "min_silk_clearance": 0.0, + "min_text_height": 0.8, + "min_text_thickness": 0.08, + "min_through_hole_diameter": 0.3, + "min_track_width": 0.0, + "min_via_annular_width": 0.1, + "min_via_diameter": 0.5, + "solder_mask_to_copper_clearance": 0.0, + "use_height_for_length_calcs": true + }, + "teardrop_options": [ + { + "td_onpadsmd": true, + "td_onroundshapesonly": false, + "td_ontrackend": false, + "td_onviapad": true + } + ], + "teardrop_parameters": [ + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_round_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_rect_shape", + "td_width_to_size_filter_ratio": 0.9 + }, + { + "td_allow_use_two_tracks": true, + "td_curve_segcount": 0, + "td_height_ratio": 1.0, + "td_length_ratio": 0.5, + "td_maxheight": 2.0, + "td_maxlen": 1.0, + "td_on_pad_in_zone": false, + "td_target_name": "td_track_end", + "td_width_to_size_filter_ratio": 0.9 + } + ], + "track_widths": [], + "tuning_pattern_settings": { + "diff_pair_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 1.0 + }, + "diff_pair_skew_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + }, + "single_track_defaults": { + "corner_radius_percentage": 80, + "corner_style": 1, + "max_amplitude": 1.0, + "min_amplitude": 0.2, + "single_sided": false, + "spacing": 0.6 + } + }, + "via_dimensions": [], + "zones_allow_external_fillets": false + }, "ipc2581": { "bom_rev": "", "dist": "", @@ -207,6 +406,7 @@ "bus_entry_needed": "error", "bus_to_bus_conflict": "error", "bus_to_net_conflict": "error", + "conflicting_netclasses": "error", "different_unit_footprint": "error", "different_unit_net": "error", "duplicate_reference": "error", @@ -217,6 +417,7 @@ "footprint_filter": "ignore", "footprint_link_issues": "warning", "four_way_junction": "ignore", + "global_label_dangling": "warning", "ground_pin_not_ground": "warning", "hier_label_mismatch": "error", "isolated_pin_label": "warning", @@ -257,7 +458,7 @@ }, "meta": { "filename": "KugelmühleSchaltplan.kicad_pro", - "version": 3 + "version": 1 }, "net_settings": { "classes": [ @@ -272,17 +473,15 @@ "microvia_drill": 0.1, "name": "Default", "pcb_color": "rgba(0, 0, 0, 0.000)", - "priority": 2147483647, "schematic_color": "rgba(0, 0, 0, 0.000)", "track_width": 0.2, - "tuning_profile": "", "via_diameter": 0.6, "via_drill": 0.3, "wire_width": 6 } ], "meta": { - "version": 5 + "version": 3 }, "net_colors": null, "netclass_assignments": null, @@ -290,11 +489,14 @@ }, "pcbnew": { "last_paths": { + "gencad": "", "idf": "", "netlist": "", "plot": "", + "pos_files": "", "specctra_dsn": "", "step": "", + "svg": "", "vrml": "" }, "page_layout_descr_file": "" @@ -417,9 +619,16 @@ "meta": { "version": 1 }, + "net_format_name": "", "page_layout_descr_file": "", "plot_directory": "", "reuse_designators": true, + "spice_current_sheet_as_root": false, + "spice_external_command": "spice \"%I\"", + "spice_model_current_sheet_as_root": true, + "spice_save_all_currents": false, + "spice_save_all_dissipations": false, + "spice_save_all_voltages": false, "subpart_first_id": 65, "subpart_id_separator": 0, "top_level_sheets": [ diff --git a/KugelmühleSchaltplan/fp-info-cache b/KugelmühleSchaltplan/fp-info-cache new file mode 100644 index 0000000..573541a --- /dev/null +++ b/KugelmühleSchaltplan/fp-info-cache @@ -0,0 +1 @@ +0 diff --git a/clock.gif b/clock.gif new file mode 100644 index 0000000..6cb7e3d Binary files /dev/null and b/clock.gif differ diff --git a/clock_frames.h b/clock_frames.h new file mode 100644 index 0000000..a643df0 --- /dev/null +++ b/clock_frames.h @@ -0,0 +1,725 @@ +#pragma once +#include + +// Abmessungen: 21x21, 143 Frames +#define CLOCK_WIDTH 21 +#define CLOCK_HEIGHT 21 +#define CLOCK_FRAME_COUNT 143 + +const unsigned char clock_frame_0[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x01, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_1[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x01, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x24, 0x04, 0x14, 0x14, 0x0A, 0x04, 0x14, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x40, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_2[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x01, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x84, 0x09, 0x02, 0x64, 0x08, 0x02, 0x1C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x08 +}; + +const unsigned char clock_frame_3[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x01, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x08, 0x04, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0xFC, 0x0F, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_4[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x01, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x08, 0x04, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_5[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x01, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x08, 0x06, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x2C, 0x20, 0x04, 0x18, 0x40, 0x06, 0x30, 0x44, 0x03, 0x60, 0x90, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_6[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x05, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_7[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_8[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x08, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_9[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x10, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x08, 0x08, 0x02, 0x08, 0x08, 0xFA, 0x0F, 0x08, 0x02, 0x10, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x14, 0x18, 0x40, 0x06, 0x30, 0x00, 0x13, 0x60, 0xA0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_10[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x10, 0x04, 0x14, 0x10, 0x0A, 0x64, 0x08, 0x08, 0x82, 0x09, 0x08, 0x02, 0x0E, 0x08, 0x02, 0x10, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x14, 0x98, 0x40, 0x06, 0x30, 0x00, 0x13, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_11[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x11, 0x04, 0x14, 0x11, 0x0A, 0x04, 0x0A, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_12[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x24, 0x04, 0x14, 0x14, 0x0A, 0x04, 0x14, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_13[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x06, 0x14, 0x10, 0x0B, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x04 +}; + +const unsigned char clock_frame_14[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x90, 0x09, 0x02, 0x68, 0x08, 0x02, 0x18, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x20, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_15[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x20, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x18, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_16[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x20, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x18, 0x08, 0x02, 0x08, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_17[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x20, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x18, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x22, 0x04, 0x18, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_18[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x40, 0x0A, 0x04, 0x20, 0x08, 0x02, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x09, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x18, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_19[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x40, 0x0A, 0x04, 0x20, 0x08, 0x02, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x09, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_20[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x40, 0x0A, 0x04, 0x20, 0x08, 0x02, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x09, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0xD8, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_21[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x60, 0x08, 0x02, 0x10, 0x08, 0xFA, 0x0F, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_22[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x60, 0x08, 0x82, 0x11, 0x08, 0x02, 0x0E, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_23[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x62, 0x08, 0x02, 0x34, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_24[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x06, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x64, 0x08, 0x02, 0x1C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_25[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x30, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x68, 0x08, 0x02, 0x18, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_26[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0x18, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x01 +}; + +const unsigned char clock_frame_27[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0xE0, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_28[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0xE0, 0x08, 0x02, 0x18, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_29[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0xE0, 0x08, 0x02, 0x18, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x30, 0x0A, 0x0C, 0x20, 0x04, 0x18, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_30[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x80, 0x08, 0x02, 0x78, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x18, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0xC4, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_31[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x80, 0x08, 0x02, 0x78, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_32[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x80, 0x08, 0x02, 0x78, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x41, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_33[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0xFF, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_34[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0xFE, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_35[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0xFC, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x01 +}; + +const unsigned char clock_frame_36[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0xFC, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_37[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0xF8, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x08, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_38[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0xF8, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_39[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0xF0, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x08 +}; + +const unsigned char clock_frame_40[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x40, 0x0C, 0x02, 0xF8, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x40, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x11, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_41[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x40, 0x0C, 0x02, 0xF8, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x10, 0x0E, 0x0C, 0x20, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_42[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x7C, 0x08, 0x06, 0x84, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x80, 0x00 +}; + +const unsigned char clock_frame_43[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x7C, 0x08, 0x06, 0x82, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_44[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x7E, 0x08, 0x86, 0x81, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x4C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_45[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x08, 0x02, 0x38, 0x08, 0x06, 0xC0, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_46[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x08, 0x02, 0x38, 0x08, 0x06, 0xC0, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_47[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x84, 0x08, 0x02, 0x38, 0x08, 0x06, 0xC0, 0x08, 0x04, 0x00, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x02, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_48[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_49[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x06, 0x14, 0x30, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_50[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0x18, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_51[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x18, 0x08, 0x06, 0x30, 0x08, 0x04, 0x40, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_52[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x18, 0x08, 0x06, 0x70, 0x08, 0x04, 0xC0, 0x09, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_53[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x18, 0x08, 0x06, 0x38, 0x08, 0x04, 0x50, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x20, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_54[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x0C, 0x08, 0x06, 0x14, 0x08, 0x04, 0x64, 0x0A, 0x14, 0x04, 0x0A, 0x2C, 0x04, 0x04, 0x18, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_55[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x0C, 0x08, 0x06, 0x12, 0x08, 0x04, 0x62, 0x0A, 0x14, 0x01, 0x0A, 0x2C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC2, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_56[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0A, 0x02, 0x0E, 0x08, 0x86, 0x11, 0x08, 0x64, 0x60, 0x0A, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC1, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_57[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x0A, 0x02, 0x08, 0x08, 0x06, 0x10, 0x08, 0x04, 0x20, 0x0A, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x10, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_58[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x1C, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x0A, 0x02, 0x08, 0x08, 0x06, 0x10, 0x08, 0x04, 0x20, 0x0A, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x48, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x10, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_59[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x0A, 0x02, 0x08, 0x08, 0x06, 0x10, 0x08, 0x04, 0x20, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_60[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_61[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_62[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0x18, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x05, 0x98, 0x40, 0x06, 0x30, 0x00, 0x13, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_63[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x10, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_64[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x18, 0x08, 0x06, 0x68, 0x08, 0x04, 0x90, 0x09, 0x14, 0x10, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x60, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_65[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x08, 0x08, 0x06, 0x28, 0x08, 0x04, 0x10, 0x08, 0x14, 0x30, 0x0A, 0x0C, 0x20, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_66[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x0C, 0x08, 0x06, 0x0C, 0x08, 0x04, 0x0C, 0x08, 0x14, 0x0C, 0x0A, 0x0C, 0x14, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_67[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x0C, 0x08, 0x06, 0x0A, 0x08, 0x04, 0x0A, 0x08, 0x14, 0x09, 0x0A, 0x0C, 0x11, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_68[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x0E, 0x08, 0x86, 0x09, 0x08, 0x64, 0x08, 0x08, 0x14, 0x08, 0x0A, 0x0C, 0x10, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_69[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x08, 0x02, 0x00, 0x08, 0x06, 0x08, 0x08, 0x04, 0x08, 0x08, 0x14, 0x08, 0x0A, 0x0C, 0x08, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_70[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x1C, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x08, 0x22, 0x04, 0x08, 0x06, 0x08, 0x08, 0x04, 0x08, 0x08, 0x14, 0x08, 0x0A, 0x0C, 0x08, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_71[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x08, 0x08, 0x04, 0x08, 0x08, 0x14, 0x08, 0x0A, 0x0C, 0x08, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_72[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_73[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_74[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x80, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0x18, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_75[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x80, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_76[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x80, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x3C, 0x08, 0x06, 0x64, 0x08, 0x04, 0x84, 0x09, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x90, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_77[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x80, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x2C, 0x08, 0x06, 0x0C, 0x08, 0x04, 0x14, 0x08, 0x14, 0x24, 0x0A, 0x0C, 0x24, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x13, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x04 +}; + +const unsigned char clock_frame_78[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0C, 0x02, 0x04, 0x08, 0x06, 0x06, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x06, 0x04, 0x98, 0x54, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_79[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0C, 0x02, 0x04, 0x08, 0x06, 0x06, 0x08, 0x04, 0x06, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x03, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_80[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x0C, 0x02, 0x06, 0x08, 0x86, 0x05, 0x08, 0x64, 0x04, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_81[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x0C, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_82[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x0C, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x02, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_83[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x0C, 0x02, 0x04, 0x08, 0x06, 0x04, 0x0C, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x02, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_84[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_85[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_86[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x06, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0x02, 0x18, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x02, 0x08, 0x14, 0x02, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_87[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x01, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_88[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x1C, 0x08, 0x06, 0x62, 0x08, 0x04, 0x81, 0x09, 0x14, 0x01, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_89[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x0C, 0x08, 0x06, 0x0A, 0x08, 0x04, 0x11, 0x08, 0x14, 0x21, 0x0A, 0x0C, 0x20, 0x05, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xD0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_90[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x04, 0x08, 0x06, 0x06, 0x08, 0x04, 0x05, 0x08, 0x94, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_91[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x03, 0x08, 0x94, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_92[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x06, 0x08, 0x86, 0x03, 0x08, 0x64, 0x01, 0x08, 0x94, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_93[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x08, 0x02, 0x06, 0x08, 0x06, 0x01, 0x08, 0x84, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x04, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_94[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x08, 0x02, 0x06, 0x08, 0x06, 0x01, 0x08, 0x84, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_95[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x26, 0x08, 0x06, 0x01, 0x08, 0x84, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_96[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x04, 0x00, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_97[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x04, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0x02, 0x08, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x04, 0x00, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_98[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x0C, 0x02, 0x18, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x04, 0x00, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_99[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0xF8, 0x0F, 0x02, 0x03, 0x08, 0xC6, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_100[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x1B, 0x08, 0xC6, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x60, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_101[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x0B, 0x08, 0xC6, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x30, 0x0A, 0x0C, 0x20, 0x04, 0x18, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_102[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x04, 0x08, 0xC2, 0x07, 0x08, 0x06, 0x04, 0x08, 0x04, 0x44, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_103[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x04, 0x08, 0xC2, 0x07, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xF0, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_104[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0x02, 0x04, 0x08, 0xC2, 0x07, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x04, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_105[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xFA, 0x07, 0x08, 0xC2, 0x03, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_106[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0x82, 0x01, 0x08, 0x02, 0x06, 0x08, 0xC2, 0x03, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_107[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0xC2, 0x03, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_108[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0xC2, 0x07, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_109[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x06, 0x14, 0x10, 0x0A, 0x04, 0x10, 0x08, 0x02, 0x08, 0x08, 0xC2, 0x0F, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_110[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x80, 0x09, 0x02, 0x60, 0x08, 0xC2, 0x1F, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_111[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xC2, 0xFF, 0x0F, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_112[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xC2, 0x07, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x0D, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_113[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x02, 0x00, 0x08, 0xC2, 0x07, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x0C, 0x14, 0x20, 0x0A, 0x0C, 0x20, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_114[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x87, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0xC4, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_115[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x87, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_116[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0x42, 0x00, 0x08, 0x82, 0x87, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x01 +}; + +const unsigned char clock_frame_117[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x04, 0x00, 0x08, 0xC2, 0x00, 0x08, 0xFA, 0x87, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_118[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x64, 0x00, 0x08, 0xC2, 0x01, 0x08, 0x02, 0x87, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_119[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x02, 0x08, 0xC2, 0x04, 0x08, 0x02, 0x07, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_120[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x44, 0x44, 0x08, 0x82, 0x05, 0x08, 0x02, 0x06, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_121[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x20, 0x06, 0x14, 0x30, 0x0A, 0x44, 0x10, 0x08, 0x82, 0x09, 0x08, 0x02, 0x0E, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_122[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x44, 0x80, 0x09, 0x82, 0x61, 0x08, 0x02, 0x1E, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_123[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x84, 0x00, 0x08, 0x02, 0x03, 0x08, 0x02, 0x04, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x08, 0x04, 0x80, 0x09, 0x14, 0x40, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_124[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x14, 0x00, 0x0A, 0x84, 0x00, 0x08, 0x02, 0x03, 0x08, 0x02, 0x04, 0x08, 0x02, 0x18, 0x08, 0x06, 0x08, 0x08, 0x04, 0x10, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x20, 0x04, 0x98, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_125[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x94, 0x00, 0x0A, 0x04, 0x01, 0x08, 0x02, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x14, 0x04, 0x0A, 0x0C, 0x14, 0x04, 0x98, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0x84, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_126[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x94, 0x00, 0x0A, 0x04, 0x01, 0x08, 0x02, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x14, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_127[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x94, 0x00, 0x0A, 0x04, 0x01, 0x08, 0x02, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_128[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x94, 0x01, 0x0A, 0x04, 0x01, 0x08, 0x02, 0x02, 0x08, 0xFA, 0x07, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x20, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_129[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x00, 0x04, 0x94, 0x01, 0x0A, 0x64, 0x01, 0x08, 0x82, 0x03, 0x08, 0x02, 0x06, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x02, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_130[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x94, 0x01, 0x0A, 0x04, 0x03, 0x08, 0x02, 0x06, 0x08, 0x02, 0x04, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x08, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC1, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_131[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x84, 0x05, 0x90, 0x44, 0x03, 0x08, 0x04, 0x06, 0x0C, 0x05, 0x04, 0x14, 0x05, 0x0A, 0x04, 0x06, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_132[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x40, 0x06, 0x0C, 0x21, 0x04, 0x14, 0x11, 0x0A, 0x04, 0x12, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x0C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_133[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x01, 0x04, 0x14, 0x01, 0x0A, 0x04, 0x82, 0x09, 0x02, 0x74, 0x08, 0x02, 0x1C, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_134[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x02, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0xFC, 0x0F, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_135[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x02, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x18, 0x08, 0x06, 0x60, 0x0C, 0x04, 0x80, 0x09, 0x54, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_136[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x02, 0x0A, 0x04, 0x02, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x08, 0x08, 0x06, 0x08, 0x0C, 0x04, 0x10, 0x09, 0x54, 0x30, 0x0A, 0x0C, 0x20, 0x04, 0x18, 0x40, 0x06, 0x30, 0x40, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_137[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x04, 0x08, 0x04, 0x04, 0x08, 0x54, 0x04, 0x0A, 0x0C, 0x04, 0x04, 0x18, 0x44, 0x06, 0x30, 0x04, 0x03, 0x60, 0xC4, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_138[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x06, 0x02, 0x08, 0x04, 0x02, 0x08, 0x54, 0x01, 0x0A, 0x0C, 0x01, 0x04, 0x98, 0x40, 0x06, 0xB0, 0x00, 0x03, 0x60, 0xC0, 0x05, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_139[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x02, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x06, 0x08, 0x86, 0x01, 0x08, 0x64, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_140[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x04, 0x44, 0x08, 0x02, 0x04, 0x08, 0xFA, 0x07, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x05, 0x18, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0xC0, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char clock_frame_141[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x08, 0x00, 0x06, 0x0C, 0x04, 0x04, 0x14, 0x04, 0x0A, 0x64, 0x44, 0x08, 0x82, 0x05, 0x08, 0x02, 0x06, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x44, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x00, 0x00, 0x00, 0x10 +}; + +const unsigned char clock_frame_142[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x1E, 0x00, 0xC0, 0xF1, 0x00, 0x60, 0x80, 0x05, 0x90, 0x40, 0x03, 0x88, 0x00, 0x06, 0x0C, 0x05, 0x04, 0x14, 0x05, 0x0A, 0x04, 0x46, 0x08, 0x02, 0x04, 0x08, 0x02, 0x04, 0x08, 0x02, 0x00, 0x08, 0x06, 0x00, 0x08, 0x04, 0x00, 0x08, 0x14, 0x00, 0x0A, 0x0C, 0x00, 0x04, 0x98, 0x40, 0x06, 0x30, 0x00, 0x03, 0x60, 0x80, 0x01, 0x80, 0x7F, 0x10, 0x00, 0x00, 0x00 +}; + +const unsigned char* const clock_frames[] PROGMEM = { + clock_frame_0, + clock_frame_1, + clock_frame_2, + clock_frame_3, + clock_frame_4, + clock_frame_5, + clock_frame_6, + clock_frame_7, + clock_frame_8, + clock_frame_9, + clock_frame_10, + clock_frame_11, + clock_frame_12, + clock_frame_13, + clock_frame_14, + clock_frame_15, + clock_frame_16, + clock_frame_17, + clock_frame_18, + clock_frame_19, + clock_frame_20, + clock_frame_21, + clock_frame_22, + clock_frame_23, + clock_frame_24, + clock_frame_25, + clock_frame_26, + clock_frame_27, + clock_frame_28, + clock_frame_29, + clock_frame_30, + clock_frame_31, + clock_frame_32, + clock_frame_33, + clock_frame_34, + clock_frame_35, + clock_frame_36, + clock_frame_37, + clock_frame_38, + clock_frame_39, + clock_frame_40, + clock_frame_41, + clock_frame_42, + clock_frame_43, + clock_frame_44, + clock_frame_45, + clock_frame_46, + clock_frame_47, + clock_frame_48, + clock_frame_49, + clock_frame_50, + clock_frame_51, + clock_frame_52, + clock_frame_53, + clock_frame_54, + clock_frame_55, + clock_frame_56, + clock_frame_57, + clock_frame_58, + clock_frame_59, + clock_frame_60, + clock_frame_61, + clock_frame_62, + clock_frame_63, + clock_frame_64, + clock_frame_65, + clock_frame_66, + clock_frame_67, + clock_frame_68, + clock_frame_69, + clock_frame_70, + clock_frame_71, + clock_frame_72, + clock_frame_73, + clock_frame_74, + clock_frame_75, + clock_frame_76, + clock_frame_77, + clock_frame_78, + clock_frame_79, + clock_frame_80, + clock_frame_81, + clock_frame_82, + clock_frame_83, + clock_frame_84, + clock_frame_85, + clock_frame_86, + clock_frame_87, + clock_frame_88, + clock_frame_89, + clock_frame_90, + clock_frame_91, + clock_frame_92, + clock_frame_93, + clock_frame_94, + clock_frame_95, + clock_frame_96, + clock_frame_97, + clock_frame_98, + clock_frame_99, + clock_frame_100, + clock_frame_101, + clock_frame_102, + clock_frame_103, + clock_frame_104, + clock_frame_105, + clock_frame_106, + clock_frame_107, + clock_frame_108, + clock_frame_109, + clock_frame_110, + clock_frame_111, + clock_frame_112, + clock_frame_113, + clock_frame_114, + clock_frame_115, + clock_frame_116, + clock_frame_117, + clock_frame_118, + clock_frame_119, + clock_frame_120, + clock_frame_121, + clock_frame_122, + clock_frame_123, + clock_frame_124, + clock_frame_125, + clock_frame_126, + clock_frame_127, + clock_frame_128, + clock_frame_129, + clock_frame_130, + clock_frame_131, + clock_frame_132, + clock_frame_133, + clock_frame_134, + clock_frame_135, + clock_frame_136, + clock_frame_137, + clock_frame_138, + clock_frame_139, + clock_frame_140, + clock_frame_141, + clock_frame_142, +}; diff --git a/display_ui.cpp b/display_ui.cpp index 53e218a..9d86745 100644 --- a/display_ui.cpp +++ b/display_ui.cpp @@ -1,11 +1,11 @@ #include "display_ui.h" #include #include +#include "fire_frames.h" +#include "clock_frames.h" -// Bitmaps & Animation-Dateien aus Lopaka -//#include "Clock.h" -//#include "Clock.h" -//#include "fire_flames.h" +static uint8_t fire_flames_frame = 0; +static uint8_t clock_frame = 0; uint32_t lastDispTime = 0; @@ -21,11 +21,6 @@ static const unsigned char image_paint_27_bits[] U8X8_PROGMEM = { static const unsigned char image_checked_bits[] U8X8_PROGMEM = {0x00,0x00,0x40,0x21,0x13,0x0e,0x04,0x00}; static const unsigned char image_crossed_bits[] U8X8_PROGMEM = {0x00,0x21,0x12,0x0c,0x1e,0x33,0x00,0x00}; - -// Animations-Zähler -//static uint8_t fire_flames_frame = 0; -//static uint8_t Clock_frame = 0; - // U8g2-Display-Objekt static U8G2_SSD1306_128X64_NONAME_F_HW_I2C u8g2(U8G2_R0, /* reset=*/ U8X8_PIN_NONE); @@ -39,18 +34,21 @@ void initDisplay() { // ANIMATIONEN BERECHNEN & ZEICHNEN // ############################################################# static void updateAnimations() { - //fire_flames_frame = (millis() / 77) % 8; - //Clock_frame = (millis() / 200) % 143; + // 8 Frames: Wechsel alle 77 ms + fire_flames_frame = (millis() / 77) % FIRE_FLAMES_FRAME_COUNT; + + // 143 Frames: Wechsel alle 50 ms (ca. 7 Sekunden Gesamt-Umlaufzeit) + clock_frame = (millis() / 50) % CLOCK_FRAME_COUNT; } static void drawAnimation_fire_flames() { - //u8g2.setDrawColor(1); - // u8g2.drawXBMP(80, 30, 21, 32, fire_flames_frames[fire_flames_frame]); + u8g2.setDrawColor(1); + u8g2.drawXBMP(80, 30, FIRE_FLAMES_WIDTH, FIRE_FLAMES_HEIGHT, fire_flames_frames[fire_flames_frame]); } static void drawAnimation_Clock() { - //u8g2.setDrawColor(1); - // u8g2.drawXBMP(104, 40, 21, 21, Clock_frames[Clock_frame]); + u8g2.setDrawColor(1); + u8g2.drawXBMP(104, 40, CLOCK_WIDTH, CLOCK_HEIGHT, clock_frames[clock_frame]); } // ############################################################# @@ -61,103 +59,116 @@ static void drawHomeScreen(int currentSpeed, int curH, int curM, bool timeValid, u8g2.setBitmapMode(1); u8g2.setDrawColor(1); // 1 = Weiß (an) - // 1. Feste Beschriftungen + // Aktuelle Geschwindigkeit u8g2.setFont(u8g2_font_helvB08_tr); - u8g2.drawStr(5, 9, "Geschw"); - u8g2.drawStr(5, 20, "Zeituhr"); - u8g2.drawStr(5, 31, "Temp"); - - // 2. Dynamischer Wert: Geschwindigkeit - char speedBuf[10]; - snprintf(speedBuf, sizeof(speedBuf), "%d", currentSpeed); - u8g2.drawStr(51, 8, speedBuf); + u8g2.drawStr(2, 10, "Geschw:"); + char speedBuf[16]; + snprintf(speedBuf, sizeof(speedBuf), "%d U/min", currentSpeed); + u8g2.drawStr(52, 10, speedBuf); + // Zeitschaltuhr + u8g2.drawStr(2, 21, "Zeituhr"); // 3. Dynamische Zeitschaltuhr: Start- und Endzeit - char startBuf[8]; - char endBuf[8]; - snprintf(startBuf, sizeof(startBuf), "%02d:%02d", settings.startHour, settings.startMin); - snprintf(endBuf, sizeof(endBuf), "%02d:%02d", settings.endHour, settings.endMin); + char timerBuf[16]; + if (settings.timerEnabled) { + snprintf(timerBuf, sizeof(timerBuf), "%02d:%02d-%02d:%02d", + settings.startHour, settings.startMin, settings.endHour, settings.endMin); + } else { + snprintf(timerBuf, sizeof(timerBuf), "Deaktiviert"); + } + u8g2.drawStr(52, 21, timerBuf); - u8g2.drawStr(51, 19, startBuf); - u8g2.drawLine(79, 16, 83, 16); // Bindestrich zwischen Zeiten - u8g2.drawStr(89, 19, endBuf); + // Aktuelle Temperatur + u8g2.drawStr(2, 32, "Temp"); + char tempBuf[16]; + snprintf(tempBuf, sizeof(tempBuf), "%d / %d \xb0""C", curTemp, settings.maxTemp); // \xb0 = Grad-Zeichen + u8g2.drawStr(52, 32, tempBuf); - // 4. Dynamische Temperatur (Ist & Soll/Max) - char curTempBuf[10]; - snprintf(curTempBuf, sizeof(curTempBuf), "%d", curTemp); - u8g2.drawStr(52, 30, curTempBuf); - u8g2.drawLine(67, 24, 67, 29); // Trennstrich - - char maxTempBuf[8]; - snprintf(maxTempBuf, sizeof(maxTempBuf), "%d", settings.maxTemp); - u8g2.drawStr(74, 30, maxTempBuf); + // ========================================================= + // 2. HORIZONTALE TRENNLINIE + // ========================================================= + u8g2.drawHLine(0, 36, 128); // 5. Große aktuelle Uhrzeit unten links - u8g2.setFont(u8g2_font_helvB08_tr); + u8g2.setFont(u8g2_font_helvB14_tr); char timeBuf[10]; if (timeValid) { snprintf(timeBuf, sizeof(timeBuf), "%02d:%02d", curH, curM); } else { snprintf(timeBuf, sizeof(timeBuf), "--:--"); } - u8g2.drawStr(4, 60, timeBuf); + u8g2.drawStr(2, 58, timeBuf); - // 6. Lopaka Deko-Bitmap - u8g2.drawXBMP(32, 4, 16, 26, image_paint_27_bits); + // Icon 1: Zeitschaltuhr aktiv (z. B. bei X = 90) + if (timerActive) { + drawAnimation_Clock(); + } - // 7. Lopaka Animationen abspielen - //drawAnimation_fire_flames(); - //drawAnimation_Clock(); + // Icon 2: Überhitzungs-Warnung (z. B. bei X = 110) + if (curTemp >= settings.maxTemp) { + drawAnimation_fire_flames(); + } } // ############################################################# // Zeitschaltuhr // ############################################################# static void drawTimerScreen(TimeEditStep timeEditStep, uint8_t settingIdx, const SystemSettings& settings){ + const uint8_t* Font = u8g2_font_helvB10_tr; u8g2.setFontMode(1); u8g2.setBitmapMode(1); // Von - u8g2.setFont(u8g2_font_6x12_tr); - u8g2.drawStr(31, 26, "Von:"); + u8g2.setFont(Font); + u8g2.drawStr(30, 18, "Von:"); // Start Time - u8g2.setFont(u8g2_font_6x10_tr); char startBuf[10]; snprintf(startBuf, sizeof(startBuf), "%02d:%02d", settings.startHour, settings.startMin); - u8g2.drawStr(66, 26, startBuf); + u8g2.drawStr(66, 18, startBuf); // string 23 - u8g2.setFont(u8g2_font_6x12_tr); - u8g2.drawStr(31, 44, "Bis:"); + u8g2.drawStr(30, 36, "Bis:"); // End Time - u8g2.setFont(u8g2_font_6x10_tr); char endBuf[10]; snprintf(endBuf, sizeof(endBuf), "%02d:%02d", settings.endHour, settings.endMin); - u8g2.drawStr(66, 44, endBuf); + u8g2.drawStr(66, 36, endBuf); + + // AutoSpeed + u8g2.drawStr(18, 54, "Speed:"); + char speedBuf[10]; + snprintf(speedBuf, sizeof(speedBuf), "%d", settings.autoSpeed); + u8g2.drawStr(66, 54, speedBuf); // Auswahlbox Zeichnen switch (timeEditStep) { case EDIT_START_HOUR: u8g2.setDrawColor(2); // Invertierungs mode - u8g2.drawBox(66, 17, 11, 11); + u8g2.drawBox(65, 7, 16, 13); u8g2.setDrawColor(1); // Wieder zurück auf normal break; case EDIT_START_MIN: u8g2.setDrawColor(2); // Invertierungs mode - u8g2.drawBox((66+18), 17, 11, 11); + u8g2.drawBox(65 + 19, 7, 16, 13); u8g2.setDrawColor(1); // Wieder zurück auf normal break; case EDIT_END_HOUR: u8g2.setDrawColor(2); // Invertierungs mode - u8g2.drawBox(66, 35, 11, 11); + u8g2.drawBox(65, 25, 16, 13); u8g2.setDrawColor(1); // Wieder zurück auf normal break; case EDIT_END_MIN: u8g2.setDrawColor(2); // Invertierungs mode - u8g2.drawBox((66+18), 35, 11, 11); + u8g2.drawBox(65 + 19, 25, 16, 13); u8g2.setDrawColor(1); // Wieder zurück auf normal break; + case EDIT_SPEED:{ + int widthSpeedBuf = u8g2.getStrWidth(speedBuf); + u8g2.setDrawColor(2); + u8g2.drawBox(64, 43, widthSpeedBuf + 4, 13); // Umschließt den gesamten Wert + u8g2.setDrawColor(1); + break; + } default: break; } } @@ -271,8 +282,9 @@ void updateDisplay(bool inSettings, int curH, int curM, bool timeValid, int curTemp) { if (millis() - lastDispTime >= 50) { lastDispTime = millis(); - + u8g2.clearBuffer(); + updateAnimations(); if (inSettings) { drawSettingsScreen(settingIdx, editStep, settings); diff --git a/fire.gif b/fire.gif new file mode 100644 index 0000000..d13c5f7 Binary files /dev/null and b/fire.gif differ diff --git a/fire_frames.h b/fire_frames.h new file mode 100644 index 0000000..f52b666 --- /dev/null +++ b/fire_frames.h @@ -0,0 +1,50 @@ +#pragma once +#include + +// Abmessungen: 21x32, 8 Frames +#define FIRE_FLAMES_WIDTH 21 +#define FIRE_FLAMES_HEIGHT 32 +#define FIRE_FLAMES_FRAME_COUNT 8 + +const unsigned char fire_flames_frame_0[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x4C, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x40, 0x00, 0x20, 0xC8, 0x00, 0x20, 0xB4, 0x00, 0x80, 0x5A, 0x00, 0x80, 0x24, 0x00, 0x20, 0x74, 0x00, 0x00, 0x20, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x21, 0x00, 0x80, 0x30, 0x00, 0x80, 0x25, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char fire_flames_frame_1[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x4D, 0x00, 0x00, 0x4C, 0x00, 0x00, 0xCE, 0x00, 0x00, 0x40, 0x00, 0x20, 0xC8, 0x00, 0x20, 0xB4, 0x00, 0x80, 0x5A, 0x00, 0x80, 0x24, 0x00, 0x20, 0x74, 0x00, 0x00, 0x20, 0x00, 0x80, 0x0A, 0x00, 0x00, 0x21, 0x00, 0x80, 0x30, 0x00, 0x80, 0x25, 0x00, 0x00, 0x1E, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char fire_flames_frame_2[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0F, 0x00, 0x80, 0x0C, 0x00, 0x80, 0x4D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x05, 0x00, 0x00, 0x4E, 0x00, 0x40, 0xC7, 0x00, 0x40, 0xC8, 0x00, 0x40, 0xC3, 0x00, 0x20, 0x58, 0x00, 0x00, 0x15, 0x00, 0xA0, 0x24, 0x00, 0x80, 0x34, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x49, 0x00, 0xA0, 0x57, 0x00, 0x40, 0x30, 0x00, 0xC0, 0x09, 0x00, 0x00, 0x24, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char fire_flames_frame_3[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x05, 0x00, 0x00, 0x0F, 0x00, 0x80, 0x0C, 0x00, 0x80, 0x4D, 0x00, 0x00, 0x01, 0x00, 0x00, 0x07, 0x00, 0x00, 0x05, 0x00, 0x00, 0x4E, 0x00, 0x40, 0xC7, 0x00, 0x40, 0xC8, 0x00, 0x40, 0xC3, 0x00, 0x20, 0x58, 0x00, 0x00, 0x15, 0x00, 0xA0, 0x24, 0x00, 0x80, 0x34, 0x00, 0xE0, 0x00, 0x00, 0x40, 0x49, 0x00, 0xA0, 0x57, 0x00, 0x40, 0x30, 0x00, 0xC0, 0x09, 0x00, 0x00, 0x24, 0x00, 0x00, 0x12, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char fire_flames_frame_4[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x0D, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x00, 0x40, 0x00, 0x20, 0x40, 0x00, 0x00, 0x24, 0x00, 0x40, 0xEC, 0x00, 0x00, 0xB0, 0x00, 0x00, 0xD6, 0x00, 0x00, 0x38, 0x00, 0x60, 0xE0, 0x00, 0x60, 0xDA, 0x00, 0xA0, 0x18, 0x00, 0x20, 0xAF, 0x00, 0xE0, 0x05, 0x00, 0x80, 0xCD, 0x00, 0xE0, 0x0A, 0x00, 0xC0, 0x40, 0x00, 0x80, 0x31, 0x00, 0x80, 0x14, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char fire_flames_frame_5[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x62, 0x00, 0x00, 0x60, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x58, 0x00, 0x60, 0xE9, 0x00, 0x20, 0x04, 0x00, 0x20, 0x82, 0x00, 0x60, 0xA0, 0x00, 0xA0, 0x40, 0x00, 0xA0, 0xA7, 0x00, 0xE0, 0xFA, 0x00, 0x60, 0x41, 0x00, 0x00, 0x29, 0x00, 0x40, 0x0A, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x04, 0x00 +}; + +const unsigned char fire_flames_frame_6[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x44, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x02, 0x00, 0x00, 0x62, 0x00, 0x00, 0x60, 0x00, 0x00, 0x4A, 0x00, 0x00, 0x2C, 0x00, 0x00, 0x58, 0x00, 0x60, 0xE9, 0x00, 0x20, 0x04, 0x00, 0x20, 0x82, 0x00, 0x60, 0xA0, 0x00, 0xA0, 0x40, 0x00, 0xA0, 0xA7, 0x00, 0xE0, 0xFA, 0x00, 0x60, 0x41, 0x00, 0x00, 0x29, 0x00, 0x40, 0x0A, 0x00, 0x80, 0x0D, 0x00, 0x00, 0x04, 0x00 +}; + +const unsigned char fire_flames_frame_7[] PROGMEM = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x00, 0x00, 0x04, 0x00, 0x00, 0x06, 0x00, 0x00, 0x42, 0x00, 0x20, 0x46, 0x00, 0x00, 0x44, 0x00, 0x00, 0x06, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x3C, 0x00, 0x40, 0xE6, 0x00, 0x40, 0x46, 0x00, 0x60, 0xB8, 0x00, 0x60, 0x12, 0x00, 0x00, 0x47, 0x00, 0xA0, 0xD4, 0x00, 0x00, 0x2E, 0x00, 0x80, 0x79, 0x00, 0x00, 0x38, 0x00, 0x80, 0x6B, 0x00, 0x00, 0x79, 0x00, 0x00, 0x1F, 0x00, 0x00, 0x1D, 0x00, 0x00, 0x00, 0x00 +}; + +const unsigned char* const fire_flames_frames[] PROGMEM = { + fire_flames_frame_0, + fire_flames_frame_1, + fire_flames_frame_2, + fire_flames_frame_3, + fire_flames_frame_4, + fire_flames_frame_5, + fire_flames_frame_6, + fire_flames_frame_7, +}; diff --git a/gif2u8g2.py b/gif2u8g2.py new file mode 100644 index 0000000..21ea97e --- /dev/null +++ b/gif2u8g2.py @@ -0,0 +1,60 @@ +import os +import sys +from PIL import Image, ImageSequence + +def gif_to_xbm(gif_path, output_h_path, var_name, target_w=None, target_h=None): + im = Image.open(gif_path) + frames = [] + + for frame in ImageSequence.Iterator(im): + f = frame.convert('RGBA') + # Weißer Hintergrund für transparente GIFs + bg = Image.new('RGBA', f.size, (255, 255, 255)) + f = Image.alpha_composite(bg, f).convert('1') # 1-Bit Schwarz/Weiß + + if target_w and target_h: + f = f.resize((target_w, target_h), Image.Resampling.NEAREST) + frames.append(f) + + w, h = frames[0].size + bytes_per_row = (w + 7) // 8 + + with open(output_h_path, 'w') as out: + out.write(f"#pragma once\n#include \n\n") + out.write(f"// Abmessungen: {w}x{h}, {len(frames)} Frames\n") + out.write(f"#define {var_name.upper()}_WIDTH {w}\n") + out.write(f"#define {var_name.upper()}_HEIGHT {h}\n") + out.write(f"#define {var_name.upper()}_FRAME_COUNT {len(frames)}\n\n") + + # 1. Einzelne Frames als XBM-Arrays schreiben (LSB-first) + for idx, frame in enumerate(frames): + out.write(f"const unsigned char {var_name}_frame_{idx}[] PROGMEM = {{\n ") + pixels = frame.load() + byte_list = [] + + for y in range(h): + for byte_idx in range(bytes_per_row): + byte_val = 0 + for bit in range(8): + x = byte_idx * 8 + bit + if x < w: + # 0 = Schwarz (Pixel an bei XBM), 1 = Weiß + if pixels[x, y] == 0: + byte_val |= (1 << bit) + byte_list.append(f"0x{byte_val:02X}") + + out.write(", ".join(byte_list)) + out.write("\n};\n\n") + + # 2. Master-Array aller Frame-Pointer + out.write(f"const unsigned char* const {var_name}_frames[] PROGMEM = {{\n") + for idx in range(len(frames)): + out.write(f" {var_name}_frame_{idx},\n") + out.write("};\n") + + print(f"Fertig! {len(frames)} Frames exportiert nach: {output_h_path}") + +# Aufruf: Datei, Ausgabedatei, Arrayname, Breite, Höhe +if __name__ == "__main__": + gif_to_xbm("fire.gif", "fire_frames.h", "fire_flames", 21, 32) + gif_to_xbm("clock.gif", "clock_frames.h", "clock", 21, 21) \ No newline at end of file diff --git a/kugelmuehle.ino b/kugelmuehle.ino index 4bb3645..0be01b9 100644 --- a/kugelmuehle.ino +++ b/kugelmuehle.ino @@ -15,7 +15,8 @@ FastAccelStepper *stepper = NULL; // ################ Variabeln ################ const uint32_t MAX_SPEED_HZ = 106000; -const int32_t COLDTEMP_C = 50; +const int32_t COLDTEMP_C = 70; +const int32_t MIKROSTEPS = 1600; bool clickPlus = 0; bool clickMinus = 0; @@ -52,7 +53,7 @@ SystemSettings settings; // Überladung des Präfix-Operators (++timeEditStep) TimeEditStep& operator++(TimeEditStep& step) { - step = (step == EDIT_END_MIN) ? EDIT_NONE : static_cast(step + 1); + step = (step == EDIT_SPEED) ? EDIT_NONE : static_cast(step + 1); return step; } @@ -208,6 +209,51 @@ int getTempInC(uint8_t senTemp){ return ((milliVolt - 500)/10); } +int getFilteredTemp(int rawSensorPin) { + constexpr uint8_t FILTER_SAMPLES = 10; // Puffergröße (10 Messwerte) + static int readings[FILTER_SAMPLES]; + static uint8_t readIndex = 0; + static int32_t total = 0; + static int average = 0; + static bool initialized = false; + static uint32_t lastSampleTime = 0; + + // Abtastrate: Alle 100 ms einen neuen Messwert erfassen + if (millis() - lastSampleTime >= 100 || !initialized) { + lastSampleTime = millis(); + + int rawVal = getTempInC(rawSensorPin); // Messwert in mV + + // Kaltstart: Puffer beim ersten Aufruf vollflächig vorbefüllen + if (!initialized) { + for (uint8_t i = 0; i < FILTER_SAMPLES; i++) { + readings[i] = rawVal; + } + total = (int32_t)rawVal * FILTER_SAMPLES; + average = rawVal; + initialized = true; + return average; + } + + // Ältesten Wert abziehen, neuen Wert einfügen und addieren + total -= readings[readIndex]; + readings[readIndex] = rawVal; + total += rawVal; + + // Index weiterschalten + readIndex = (readIndex + 1) % FILTER_SAMPLES; + + // Ganzzahlige Division mit kaufmännischer Rundung (+ 5 bei 10 Werten) + if (total >= 0) { + average = (total + (FILTER_SAMPLES / 2)) / FILTER_SAMPLES; + } else { + average = (total - (FILTER_SAMPLES / 2)) / FILTER_SAMPLES; + } + } + + return average; +} + // Liefert true wenn der Timer aktuell Active ist und false wenn nicht aktiv bool isTimerActiveNow(int curH, int curM, int startH, int startM, int endH, int endM) { int current = curH * 60 + curM; @@ -243,6 +289,11 @@ void setting(){ case EDIT_END_MIN: settings.endMin = (settings.endMin + 5) % 60; break; + case EDIT_SPEED: + if(settings.autoSpeed < ((MAX_SPEED_HZ * 60)/MIKROSTEPS) - 50){ + settings.autoSpeed += 50; + } + break; default: break; } } @@ -262,6 +313,11 @@ void setting(){ case EDIT_END_MIN: settings.endMin = (settings.endMin < 5) ? 55 : settings.endMin - 5; break; + case EDIT_SPEED: + if(settings.autoSpeed >= 50){ + settings.autoSpeed -= 50; + } + break; default: break; } } @@ -291,6 +347,7 @@ if (settings.editMaxTemp) { } if (clickStop) { + settings.coldTemp = settings.maxTemp - 20; settings.editMaxTemp = false; } return; // Wichtig: Rest der Funktion überspringen, solange editiert wird! @@ -390,94 +447,143 @@ void loop() { return; } - // Inputs + // 1. Eingaben & Sensoren lesen getInputs(clickPlus, clickMinus, clickStop, holdPlus, holdMinus, holdStop); - curTemp = getTempInC(senTemp); + curTemp = getFilteredTemp(senTemp); - // Discord nachricht // BEGREZUNG AUF EINE NACVHRICHT TODO - if(curTemp >= settings.maxTemp && !send){ + // 2. Discord Überhitzungs-Alarm + static bool send = false; + if (curTemp >= settings.maxTemp && !send) { String message = "⚠️ **Kugelmuehle ueberhitzt!** Aktuelle Temp: " + String(curTemp) + " °C"; sendDiscordNotification(message); send = true; - - // Plus 5 als puffer - }else if(curTemp + 5 < settings.maxTemp){ + } else if (curTemp < settings.coldTemp) { send = false; } - // zeitschaltuhr prüfen + // 3. Zeitschaltuhr & NTP prüfen int curH, curM, curS; - if (settings.timerEnabled && getCurrentTime(curH, curM, curS)) { + bool timeIsValid = getCurrentTime(curH, curM, curS); + + if (settings.timerEnabled && timeIsValid) { shouldRun = isTimerActiveNow(curH, curM, settings.startHour, settings.startMin, settings.endHour, settings.endMin); - } - - // Not-Stopp aktivieren bei Überhitzung ODER Zeitschaltuhr aus - if(curTemp >= settings.maxTemp || (!shouldRun && settings.timerEnabled)){ - autoStop = true; - - // Entsperren NUR wenn abgekühlt UND Zeitschaltuhr aktiv - }else if(curTemp <= COLDTEMP_C && shouldRun){ - autoStop = false; + } else { + shouldRun = false; } - // Zeitschaltuhr start - if(settings.timerEnabled && shouldRun){ - - // TODO - // 1. Ziel-Geschwindigkeit vorgeben (z. B. 3200 Steps/s = 120 U/min bei 1/8 Schritt) - //stepper->setSpeedInHz(3200); - - // 2. Beschleunigungsrampe festlegen - //stepper->setAcceleration(settings.accelRate); - - // 3. Dauerfahrt starten (beschleunigt automatisch bis zur Ziel-Geschwindigkeit) - // stepper->runForward(); // oder stepper->runBackward(); + // 4. Schutz-Verriegelung (Überhitzung) + static bool tempOverheat = false; + if (curTemp >= settings.maxTemp) { + tempOverheat = true; + } else if (curTemp <= settings.coldTemp) { + tempOverheat = false; } - // Main Control - - if(holdStop && clickPlus){ + // 5. Menü aufrufen + if (holdStop && clickPlus) { bSettings = true; } - if(bSettings){ - setting(); - }else if(clickStop){ - stopMove = true; - }else if(holdPlus){ - speed = settings.accelRate; - }else if(holdMinus){ - speed = -settings.accelRate; - }else{ - speed = 0; + // HotKey Timer Toggeln + if (holdStop && clickMinus) { + if(settings.timerEnabled){ + settings.timerEnabled = false; + }else{ + settings.timerEnabled = true; + } } - // STOPP - if(stopMove || autoStop){ - // stopp befehl nur senden wenn sich der Motor bewegt - if (stepper->isRunning()) { - stepper->moveByAcceleration(10000, true); + // Sperr-Flag, falls der Nutzer im aktiven Timer-Fenster bewusst Stopp gedrückt hat + static bool manualTimerStopped = false; + if (!shouldRun) { + manualTimerStopped = false; // Reset für den nächsten regulären Zeitzyklus + } + + // 6. Betriebsmodi steuern + if (bSettings) { + setting(); + } + // NOT-AUS BEI ÜBERHITZUNG + else if (tempOverheat) { + if (stepper->isRunning()) { + stepper->setAcceleration(10000); + stepper->applySpeedAcceleration(); + stepper->stopMove(); + lastSpeed = 0; + } + } + // AUTOMATIK-BETRIEB (Zeitschaltuhr) + else if (settings.timerEnabled) { + + // Druch drücken von plus den Timer betrieb vortsetzen + if (manualTimerStopped && clickPlus) { + manualTimerStopped = false; + } + + if (shouldRun && !manualTimerStopped) { + if (!stepper->isRunning()) { + uint32_t autoHz = ((uint32_t)settings.autoSpeed * MIKROSTEPS) / 60; + stepper->setSpeedInHz(autoHz); + stepper->setAcceleration(settings.accelRate); + stepper->runForward(); + } + + // Manuelles Anhalten im laufenden Timer erlauben + if (clickStop) { + manualTimerStopped = true; + stepper->setAcceleration(10000); + stepper->applySpeedAcceleration(); + stepper->stopMove(); + lastSpeed = 0; + } + } else { + // Außerhalb des Fensters oder manuell gestoppt + if (stepper->isRunning()) { + stepper->setAcceleration(10000); + stepper->applySpeedAcceleration(); + stepper->stopMove(); + lastSpeed = 0; + } + } + } + // MANUELLER BETRIEB (Zeitschaltuhr aus) + else { + static bool manualStopped = false; + + if (clickStop) { + if (stepper->isRunning()) { + stepper->setAcceleration(10000); + stepper->applySpeedAcceleration(); // <-- macht die neue Rampe sofort wirksam stepper->stopMove(); } - // MOVE - }else if (speed != lastSpeed ) { + speed = 0; + lastSpeed = 0; + manualStopped = true; + } else if (manualStopped) { + if (!holdPlus && !holdMinus) { + manualStopped = false; // erst freigeben wenn Tasten los sind + } + speed = 0; // während Sperre: nichts tun + } else if (holdPlus) { + speed = settings.accelRate; + } else if (holdMinus) { + speed = -settings.accelRate; + } else { + speed = 0; + } + + if (speed != lastSpeed) { + stepper->setSpeedInHz(MAX_SPEED_HZ); + stepper->setAcceleration(settings.accelRate); stepper->moveByAcceleration(speed, true); lastSpeed = speed; } +} - // Reset der Brems beschleunigung - if (!stepper->isRunning()) { - stepper->setAcceleration(settings.accelRate); - stopMove = false; - } + // 7. Geschwindigkeitsberechnung & UI + int32_t currentSpeed_HZ = (stepper->getCurrentSpeedInUs() == 0) ? 0 : (1000000 / stepper->getCurrentSpeedInUs()); + int32_t currentSpeed = (currentSpeed_HZ * 60) / MIKROSTEPS; - int32_t currentSpeed_HZ = stepper->getCurrentSpeedInUs() == 0 ? 0 : (1000000 / stepper->getCurrentSpeedInUs()); - int32_t currentSpeed = (currentSpeed_HZ * 60)/1600; - - bool timeIsValid = getCurrentTime(curH, curM, curS); updateDisplay(bSettings, settings.settingIdx, timeEditStep, settings, currentSpeed, curH, curM, timeIsValid, curTemp); - - // Status ausgabe auf Terminal printStatus(stepper, speed, clickPlus, clickMinus); - } \ No newline at end of file diff --git a/types.h b/types.h index 0f4a29a..31dfeb6 100644 --- a/types.h +++ b/types.h @@ -28,7 +28,8 @@ struct settingsALT{ int endMin = 0; bool timerEnabled = false; bool editMaxTemp = false; - int16_t maxTemp = 70; //in °C + int16_t maxTemp = 100; //in °C + int16_t coldTemp = 0; bool editAcc = false; int32_t accelRate = 2000; // einheit }; @@ -38,7 +39,8 @@ enum TimeEditStep { EDIT_START_HOUR, // 1. Start-Stunde einstellen (0-23) EDIT_START_MIN, // 2. Start-Minute einstellen (0-59) EDIT_END_HOUR, // 3. End-Stunde einstellen (0-23) - EDIT_END_MIN // 4. End-Minute einstellen (0-59) + EDIT_END_MIN, // 4. End-Minute einstellen (0-59) + EDIT_SPEED }; @@ -52,9 +54,11 @@ struct SystemSettings { int endMin = 0; bool timerEnabled = false; bool editMaxTemp = false; - int16_t maxTemp = 70; //in °C + int16_t maxTemp = 100; //in °C + int16_t coldTemp = 0; bool editAcc = false; int32_t accelRate = 20000; + int32_t autoSpeed = 100; };