From d5609c8cf06c5b950c35d3a88a3128601ad9b429 Mon Sep 17 00:00:00 2001 From: Alexey Zholtikov Date: Mon, 8 Dec 2025 13:11:58 +0300 Subject: [PATCH] wip: --- components/zh_ac_dimmer | 2 +- components/zh_encoder | 2 +- components/zh_pcf8574 | 2 +- main/ate0003.c | 35 +++++++++++++------------------ main/ate0003.h | 8 +++---- pcb/BOM_ATE0003.000.001_v.3.xlsx | Bin 11964 -> 11756 bytes 6 files changed, 21 insertions(+), 28 deletions(-) diff --git a/components/zh_ac_dimmer b/components/zh_ac_dimmer index d395814..77ba8e5 160000 --- a/components/zh_ac_dimmer +++ b/components/zh_ac_dimmer @@ -1 +1 @@ -Subproject commit d395814812536bf4dd4c1eeb260de4562bdd2fdb +Subproject commit 77ba8e58b99440ca1e80be7c1dccb716f8b60685 diff --git a/components/zh_encoder b/components/zh_encoder index e133e5a..d5c9415 160000 --- a/components/zh_encoder +++ b/components/zh_encoder @@ -1 +1 @@ -Subproject commit e133e5a8076dfc47c2796eaf52ff810b93fda34a +Subproject commit d5c94158c2acdf7fe1ab279ca48c79901c7cff57 diff --git a/components/zh_pcf8574 b/components/zh_pcf8574 index 379fae9..1a8f471 160000 --- a/components/zh_pcf8574 +++ b/components/zh_pcf8574 @@ -1 +1 @@ -Subproject commit 379fae940b1ded3ac0a655e4ba48d997e7b1b09f +Subproject commit 1a8f4711e8a1e2005860d8ffaee13bb37af73e58 diff --git a/main/ate0003.c b/main/ate0003.c index 3603d50..c035915 100644 --- a/main/ate0003.c +++ b/main/ate0003.c @@ -47,18 +47,10 @@ void app_main(void) _zh_system_load(); _zh_encoder_init(); _zh_ac_dimmer_init(); - // gpio_set_level(GPIO_NUM_4, 1); - // zh_pcf8574_write_gpio(&_led_1_handle, DMM_LED_RED, LED_ON); - // zh_pcf8574_write_gpio(&_led_1_handle, FIX_LED_BLUE, LED_ON); + zh_pcf8574_write_gpio(&_led_1_handle, DMM_LED_RED, LED_ON); + zh_pcf8574_write_gpio(&_led_1_handle, FIX_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&_relay_handle, DMM_RELAY, RELAY_ON); - zh_pcf8574_write_gpio(&_relay_handle, GROUND_RELAY, RELAY_ON); - zh_pcf8574_write_gpio(&_relay_handle, L1_RELAY, RELAY_ON); - zh_pcf8574_write_gpio(&_relay_handle, L2_RELAY, RELAY_ON); - zh_pcf8574_write_gpio(&_relay_handle, L3_RELAY, RELAY_ON); - zh_pcf8574_write_gpio(&_relay_handle, L4_RELAY, RELAY_ON); - vTaskDelay(20); - zh_ac_dimmer_start(); - // _zh_component_select(0); + _zh_component_select(0); } static void _zh_wifi_softap_init(void) @@ -95,7 +87,7 @@ static void _zh_encoder_init(void) config.b_gpio_number = GPIO_NUM_26; config.encoder_min_value = 0; config.encoder_max_value = 100; - config.encoder_step = 5; + config.encoder_step = 1; config.encoder_number = POWER_ENCODER; zh_encoder_init(&config, &_power_encoder_handle); zh_encoder_set(&_power_encoder_handle, 100); @@ -115,6 +107,7 @@ static void _zh_ac_dimmer_init(void) config.zero_cross_gpio = GPIO_NUM_16; config.triac_gpio = GPIO_NUM_4; zh_ac_dimmer_init(&config); + zh_ac_dimmer_set(100); } static void _zh_pcf8574_init(void) @@ -226,7 +219,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_1_handle, NUM_1_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&_led_1_handle, NUM_1_LED_GREEN, LED_ON); - _zh_relay_on(L1_RELAY); + _zh_relay_on(L_1_RELAY); } else { @@ -237,7 +230,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_1_handle, NUM_1_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&_led_1_handle, NUM_1_LED_GREEN, LED_OFF); - _zh_relay_off(L1_RELAY); + _zh_relay_off(L_1_RELAY); _is_num_1_fixed = false; } break; @@ -254,7 +247,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_1_handle, NUM_2_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&_led_1_handle, NUM_2_LED_GREEN, LED_ON); - _zh_relay_on(L2_RELAY); + _zh_relay_on(L_2_RELAY); } else { @@ -265,7 +258,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_1_handle, NUM_2_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&_led_1_handle, NUM_2_LED_GREEN, LED_OFF); - _zh_relay_off(L2_RELAY); + _zh_relay_off(L_2_RELAY); _is_num_2_fixed = false; } break; @@ -282,7 +275,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_2_handle, NUM_3_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&_led_2_handle, NUM_3_LED_GREEN, LED_ON); - _zh_relay_on(L3_RELAY); + _zh_relay_on(L_3_RELAY); } else { @@ -293,7 +286,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_2_handle, NUM_3_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&_led_2_handle, NUM_3_LED_GREEN, LED_OFF); - _zh_relay_off(L3_RELAY); + _zh_relay_off(L_3_RELAY); _is_num_3_fixed = false; } break; @@ -310,7 +303,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_2_handle, NUM_4_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&_led_2_handle, NUM_4_LED_GREEN, LED_ON); - _zh_relay_on(L4_RELAY); + _zh_relay_on(L_4_RELAY); } else { @@ -321,7 +314,7 @@ static void _zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, in } zh_pcf8574_write_gpio(&_led_2_handle, NUM_4_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&_led_2_handle, NUM_4_LED_GREEN, LED_OFF); - _zh_relay_off(L4_RELAY); + _zh_relay_off(L_4_RELAY); _is_num_4_fixed = false; } break; @@ -339,7 +332,7 @@ static void _zh_encoder_event_handler(void *arg, esp_event_base_t event_base, in zh_160x_set_cursor(&_lcd_handle, 1, 2); zh_160x_print_int(&_lcd_handle, (uint8_t)event->encoder_position); zh_160x_print_char(&_lcd_handle, "% "); - zh_ac_dimmer_set(event->encoder_position); + zh_ac_dimmer_set((uint8_t)event->encoder_position); break; case COMPONENT_ENCODER: if (_is_work == true) diff --git a/main/ate0003.h b/main/ate0003.h index 86b7f17..282d804 100644 --- a/main/ate0003.h +++ b/main/ate0003.h @@ -33,10 +33,10 @@ #define GROUND_RELAY 0x00 /*!< Relay K1. RL1 pin on U8. */ #define DMM_RELAY 0x01 /*!< Relay K2. RL2 pin on U8. */ -#define L1_RELAY 0x03 /*!< Relay K4. RL4 pin on U8. */ -#define L2_RELAY 0x04 /*!< Relay K3. RL3 pin on U8. */ -#define L3_RELAY 0x05 /*!< Relay K6. RL6 pin on U8. */ -#define L4_RELAY 0x02 /*!< Relay K5. RL5 pin on U8. */ +#define L_1_RELAY 0x03 /*!< Relay K4. RL4 pin on U8. */ +#define L_2_RELAY 0x04 /*!< Relay K3. RL3 pin on U8. */ +#define L_3_RELAY 0x05 /*!< Relay K6. RL6 pin on U8. */ +#define L_4_RELAY 0x02 /*!< Relay K5. RL5 pin on U8. */ #define L5_RELAY 0x06 /*!< Relay K7. RL7 pin on U8. */ #define POWER_ENCODER 0x01 /*!< Connector EN2. */ diff --git a/pcb/BOM_ATE0003.000.001_v.3.xlsx b/pcb/BOM_ATE0003.000.001_v.3.xlsx index 51f267783143e05ded14de81058921cba8f99545..cf59fc074898e739a2124d2ae69aae36b3eccbde 100644 GIT binary patch delta 6576 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 BT{{2( delta 6813 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