Skip to content

Instantly share code, notes, and snippets.

@tkroo
Last active December 19, 2024 22:05
Show Gist options
  • Save tkroo/9664227d2ff2203588087164e81ddc5e to your computer and use it in GitHub Desktop.
Save tkroo/9664227d2ff2203588087164e81ddc5e to your computer and use it in GitHub Desktop.
substitutions:
name: esphome-web-012583
internal_name: ESPHOME_012583
friendly_name: epaper clock
board_name: esp32dev
comment: "E-paper"
esphome:
name: ${name}
friendly_name: ${friendly_name}
comment: "${board_name} - ${comment}"
min_version: 2024.6.0
name_add_mac_suffix: false
project:
name: esphome.web
version: dev
includes:
- time_functions.h
# on_boot:
# priority: -100.0
# then:
# - component.update: epaper
esp32:
board: esp32dev
framework:
type: esp-idf
packages:
common: !include ../common/common.yaml
font:
- file:
type: gfonts
family: "Ubuntu Mono"
weight: 700
id: font1
size: 18
- file:
type: gfonts
family: "Arvo"
weight: 700
id: font_num
size: 12
spi:
mosi_pin: GPIO21
clk_pin: GPIO22
time:
- platform: sntp
id: sntp_time
display:
- platform: waveshare_epaper
id: epaper
model: 2.90inv2
rotation: 270
full_update_every: 21600
cs_pin:
number: 16
dc_pin:
number: 17
busy_pin:
number: 18
reset_pin:
number: 5
lambda: |-
auto my_time = id(sntp_time).now();
if (my_time.is_valid()) {
int offset_angle = 90;
int center_x = (it.get_width()) / 2;
int center_y = (it.get_height()) / 2;
int r = center_y - 4;
float hour_angle_D = calculate_hour_angle(my_time.hour, my_time.minute, offset_angle);
float minute_angle_D = calculate_minute_angle(my_time.minute, offset_angle);
float second_angle_D = calculate_second_angle(my_time.second, offset_angle);
it.strftime(0, 0, id(font1), "%I:%M:%S %p", my_time);
// outer ring
it.filled_ring(center_x, center_y, r, r + 2);
// center dot
it.filled_circle(center_x, center_y, 3);
// clock numbers
for (int i = 0; i < 12; i++) {
float angle = ((i * 30) - offset_angle) * PI / 180;
float x = (r - 14) * cos(angle) + center_x;
float y = (r - 14) * sin(angle) + center_y;
it.printf(x, y, id(font_num), TextAlign::CENTER, i == 0 ? "12" : "%.0d", i);
}
// tick marks
for (int i = 0; i < 60; i++) {
float angle = ((i * 6) - offset_angle);
bool is_major_tick = (i % 5 == 0);
int inner_r = is_major_tick ? r - 3 : r - 5;
int outer_r = is_major_tick ? r : r - 3;
if (is_major_tick) {
it.line_at_angle(center_x, center_y, angle - 1, inner_r, outer_r);
it.line_at_angle(center_x, center_y, angle, inner_r - 1, outer_r);
it.line_at_angle(center_x, center_y, angle + 1, inner_r, outer_r);
} else {
it.line_at_angle(center_x, center_y, angle, inner_r, outer_r);
}
}
// clock hands
it.line_at_angle(center_x, center_y, hour_angle_D, 2, r - 30);
it.line_at_angle(center_x, center_y, minute_angle_D, 2, r - 18);
it.line_at_angle(center_x, center_y, second_angle_D, 2, r - 8);
}
float calculate_hour_angle(int hour, int minute, int offset_angle) {
return (hour * 30) + (minute * 0.5f) - offset_angle;
}
float calculate_minute_angle(int minute, int offset_angle) {
return (minute * 6.0f) - offset_angle;
}
float calculate_second_angle(int second, int offset_angle) {
return (second * 6.0f) - offset_angle;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment