From e8168ad40f77028492bdc75734bfffeb34b62151 Mon Sep 17 00:00:00 2001 From: Markus Ransberger Date: Tue, 31 Oct 2023 16:17:27 +0100 Subject: [PATCH] Major refactoring of EEPROM r/w. Add dynamic brightness functionality. --- include/ntp_client_plus.h | 2 +- include/wordclock_constants.h | 53 ++-- include/wordclock_esp8266.h | 41 ++- res/webserver/index.html | 126 +++++++-- src/wordclock_esp8266.cpp | 513 +++++++++++++++++----------------- 5 files changed, 421 insertions(+), 314 deletions(-) diff --git a/include/ntp_client_plus.h b/include/ntp_client_plus.h index b60486e..489a5cd 100644 --- a/include/ntp_client_plus.h +++ b/include/ntp_client_plus.h @@ -29,7 +29,7 @@ class NTPClientPlus public: NTPClientPlus(UDP &udp, const char *pool_server_name, int utcx, bool sw_change); bool is_leap_year(unsigned int year); - bool update_sw_change(); + bool check_daylight_saving_time(); int get_hours_12() const; int get_hours_24() const; int get_minutes() const; diff --git a/include/wordclock_constants.h b/include/wordclock_constants.h index 688ce68..072f2e3 100644 --- a/include/wordclock_constants.h +++ b/include/wordclock_constants.h @@ -10,34 +10,29 @@ #define NTP_SERVER_URL "de.pool.ntp.org" // NTP server address #define HOSTNAME (String("wordclock")) // Local hostname #define LOGGER_MULTICAST_IP (IPAddress(230, 120, 10, 2)) // IP for UDP server -#define LOGGER_MULTICAST_PORT 8123 // Port for UDP server -#define HTTP_PORT 80 // Standard HTTP port +#define LOGGER_MULTICAST_PORT (8123) // Port for UDP server +#define HTTP_PORT (80) // Standard HTTP port -// EEPROM layout -typedef enum -{ - ADR_NM_START_H = 0, - ADR_NM_END_H = 4, - ADR_NM_START_M = 8, - ADR_NM_END_M = 12, - ADR_BRIGHTNESS = 16, - ADR_MC_RED = 20, - ADR_MC_GREEN = 22, - ADR_MC_BLUE = 24, - EEPROM_SIZE = 30 -} EepromLayout_en; +// ESP8266 Pins +#define NEOPIXEL_PIN (14) // pin to which the NeoPixels are attached +#define BUTTON_PIN (5) // pin to which the button is attached -#define NEOPIXEL_PIN 14 // pin to which the NeoPixels are attached -#define BUTTON_PIN 5 // pin to which the button is attached +// Time limits +#define HOUR_MAX (23) +#define MINUTE_MAX (59) + +#define MINUTES_IN_HOUR (60) +#define HOURS_IN_DAY (24) // Night mode -#define NIGHTMODE_START_HR 23 -#define NIGHTMODE_START_MIN 0 -#define NIGHTMODE_END_HR 7 -#define NIGHTMODE_END_MIN 0 +#define NIGHTMODE_START_HR (23) +#define NIGHTMODE_START_MIN (0) +#define NIGHTMODE_END_HR (7) +#define NIGHTMODE_END_MIN (0) // Timings in us #define PERIOD_ANIMATION_US (200 * 1000) // 200ms +#define PERIOD_CLOCK_UPDATE_US (1 * 1000 * 1000) // 1s #define PERIOD_HEARTBEAT_US (1 * 1000 * 1000) // 1s #define PERIOD_MATRIX_UPDATE_US (100 * 1000) // 100ms #define PERIOD_NIGHTMODE_CHECK_US (20 * 1000 * 1000) // 20s @@ -46,7 +41,6 @@ typedef enum #define PERIOD_SNAKE_US (50 * 1000) // 50ms #define PERIOD_STATE_CHANGE_US (10 * 1000 * 1000) // 10s #define PERIOD_TETRIS_US (50 * 1000) // 50ms -#define PERIOD_TIME_VISU_UPDATE_US (1 * 1000 * 1000) // 1s #define TIMEOUT_LEDDIRECT_US (5 * 1000 * 1000) // 5s #define SHORT_PRESS_US (100 * 1000) // 100ms @@ -54,16 +48,21 @@ typedef enum #define VERY_LONG_PRESS_US (10 * 1000 * 1000) // 10s // Current limit -#define CURRENT_LIMIT_LED 2500 // limit the total current consumed by LEDs (mA) +#define CURRENT_LIMIT_LED (2500) // limit the total current consumed by LEDs (mA) + +// Brightness ranges range: 0 - 255 +#define DEFAULT_BRIGHTNESS (40) +#define MIN_BRIGHTNESS (10) +#define MAX_BRIGHTNESS UINT8_MAX // LED smoothing -#define DEFAULT_SMOOTHING_FACTOR 0.5 +#define DEFAULT_SMOOTHING_FACTOR (0.5f) // Number of colors in colors array -#define NUM_COLORS 7 +#define NUM_COLORS (7) // LED matrix size -#define MATRIX_WIDTH 11 -#define MATRIX_HEIGHT 11 +#define MATRIX_WIDTH (11) +#define MATRIX_HEIGHT (11) #endif /* WORDCLOCK_CONSTANTS_H */ diff --git a/include/wordclock_esp8266.h b/include/wordclock_esp8266.h index 2a4eed0..97ae20c 100644 --- a/include/wordclock_esp8266.h +++ b/include/wordclock_esp8266.h @@ -6,9 +6,10 @@ #include "led_matrix.h" #include "udp_logger.h" -extern UDPLogger logger; -extern LEDMatrix led_matrix; -extern ESP8266WebServer webserver; +#define RANGE_LIMIT(X, MIN, MAX) (((X) < (MIN)) ? (MIN) : (((X) > (MAX)) ? (MAX) : (X))) +#define RANGE_LIMIT_SUB(X, MIN, MAX, SUB) (((X) < (MIN)) ? (SUB) : (((X) > (MAX)) ? (SUB) : (X))) + +#define EEPROM_SIZE (sizeof(EepromLayout_st) / sizeof(uint8_t)) typedef struct { @@ -18,6 +19,29 @@ typedef struct int end_min; } NightModeTimes_st; +typedef struct +{ + uint8_t red; + uint8_t green; + uint8_t blue; + uint8_t alpha; +} Color_st; + +typedef struct +{ + uint8_t static_brightness; // user-controlled static brightness of LEDs + uint8_t dyn_brightness_min; // user-controlled min brightness of LEDs + uint8_t dyn_brightness_max; // user-controlled max brightness of LEDs + bool flg_dynamic_brightness; // flag if user wants to use daytime dynamic brightness +} Brightness_st; + +typedef struct +{ + NightModeTimes_st night_mode_times; + Brightness_st brightness_values; + Color_st color_values; +} EepromLayout_st; + typedef enum { ST_CLOCK, @@ -30,25 +54,28 @@ typedef enum NUM_STATES } ClockState_en; -int EEPROM_read_address(int address); String leading_zero2digit(int value); +uint8_t calculate_dynamic_brightness(uint8_t min_brightness, uint8_t max_brightness, int hours, int minutes, bool summertime); +uint8_t update_brightness(void); void check_night_mode(void); void check_wifi_status(void); -void EEPROM_write_to_address(int address, int value); +void draw_main_color(void); void handle_button(void); void handle_command(void); void handle_current_state(void); void handle_data_request(void); void handle_led_direct(void); -void load_main_color(void); +void limit_value_ranges(void); void ntp_time_update(uint32 *last_ntp_update_us); void on_state_entry(uint8_t state); +void read_settings_from_EEPROM(void); void reset_wifi_credentials(void); void send_heartbeat(void); +void set_dynamic_brightness(bool state); void set_main_color(uint8_t red, uint8_t green, uint8_t blue); void set_night_mode(bool on); void state_change(uint8_t newState); void update_matrix(void); -void update_state_machine(void); +void write_settings_to_EEPROM(void); #endif /* WORDCLOCK_ESP8266_H */ diff --git a/res/webserver/index.html b/res/webserver/index.html index 3c0018f..70f42ef 100644 --- a/res/webserver/index.html +++ b/res/webserver/index.html @@ -251,15 +251,23 @@ } .show { - height: 200px; + height: 250px; transition: height 1s; } + .show-container { + display: inline + } + + .hide-container { + display: none + } + .number-container { display: flex; flex-direction: row; justify-content: left; - align-items: center; + /* align-items: center; */ margin: 10px; } @@ -279,9 +287,21 @@

WORDCLOCK 2.0

-
- - +
+
+ + +
+
+
+
+ + +
+
+ + +
@@ -332,14 +352,12 @@
-
- +
+
- +
-
-