#include "ate0004.h" static i2c_master_bus_handle_t i2c_bus_handle = NULL; static httpd_handle_t webserver_handle = NULL; static zh_pcf8574_handle_t button_handle = {0}; static zh_pcf8574_handle_t led_handle = {0}; static zh_pcf8574_handle_t relay_handle = {0}; static bool is_ts = true; static bool is_ret = false; static bool is_ext = false; static void zh_wifi_softap_init(void); static void zh_webserver_init(void); static void zh_gpio_init(void); static void zh_io_expander_init(void); static void zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); void app_main(void) { nvs_flash_init(); esp_event_loop_create_default(); zh_wifi_softap_init(); zh_webserver_init(); zh_gpio_init(); gpio_set_level(TRIAC_GPIO, LOW); zh_io_expander_init(); zh_pcf8574_write_gpio(&led_handle, TS_LED_GREEN, LED_ON); zh_pcf8574_write_gpio(&led_handle, RET_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&led_handle, EXT_LED_BLUE, LED_ON); } static void zh_wifi_softap_init(void) { esp_netif_init(); esp_netif_create_default_wifi_ap(); wifi_init_config_t wifi_config = WIFI_INIT_CONFIG_DEFAULT(); esp_wifi_init(&wifi_config); wifi_config_t ap_config = { .ap = { .ssid = WIFI_SSID, .password = WIFI_PASS, .max_connection = 4, .authmode = WIFI_AUTH_WPA2_PSK, }, }; esp_wifi_set_mode(WIFI_MODE_AP); esp_wifi_set_config(WIFI_IF_AP, &ap_config); esp_wifi_start(); } static void zh_webserver_init(void) { httpd_config_t config = HTTPD_DEFAULT_CONFIG(); httpd_start(&webserver_handle, &config); zh_ota_server_init(webserver_handle); } static void zh_gpio_init(void) { gpio_config_t triac_pin_config = { .intr_type = GPIO_INTR_DISABLE, .mode = GPIO_MODE_OUTPUT, .pin_bit_mask = (1ULL << TRIAC_GPIO), .pull_down_en = GPIO_PULLDOWN_DISABLE, .pull_up_en = GPIO_PULLUP_DISABLE, }; gpio_config(&triac_pin_config); } static void zh_io_expander_init(void) { i2c_master_bus_config_t i2c_bus_config = { .clk_source = I2C_CLK_SRC_DEFAULT, .scl_io_num = GPIO_NUM_22, .sda_io_num = GPIO_NUM_21, .glitch_ignore_cnt = 7, }; i2c_new_master_bus(&i2c_bus_config, &i2c_bus_handle); esp_event_handler_instance_register(ZH_PCF8574, ESP_EVENT_ANY_ID, &zh_pcf8574_event_handler, NULL, NULL); zh_pcf8574_init_config_t config = ZH_PCF8574_INIT_CONFIG_DEFAULT(); config.i2c_handle = i2c_bus_handle; config.i2c_address = LED_I2C_ADDRESS; zh_pcf8574_init(&config, &led_handle); config.i2c_address = RELAY_I2C_ADDRESS; zh_pcf8574_init(&config, &relay_handle); config.i2c_address = BUTTON_I2C_ADDRESS; config.p0_gpio_work_mode = true; config.p1_gpio_work_mode = true; config.p2_gpio_work_mode = true; config.interrupt_gpio = GPIO_NUM_17; zh_pcf8574_init(&config, &button_handle); } static void zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { zh_pcf8574_event_on_isr_t *event = event_data; switch (event->gpio_number) { case TS_BUTTON: if (event->gpio_level == LOW && is_ret == false && is_ext == false) { if (is_ts == true) { zh_pcf8574_write_gpio(&led_handle, TS_LED_RED, LED_ON); zh_pcf8574_write_gpio(&led_handle, TS_LED_GREEN, LED_OFF); zh_pcf8574_write_gpio(&relay_handle, TS_RELAY, RELAY_ON); is_ts = false; } else { zh_pcf8574_write_gpio(&led_handle, TS_LED_RED, LED_OFF); zh_pcf8574_write_gpio(&led_handle, TS_LED_GREEN, LED_ON); zh_pcf8574_write_gpio(&relay_handle, TS_RELAY, RELAY_OFF); is_ts = true; } } break; case RET_BUTTON: if (is_ext == true) { break; } if (event->gpio_level == LOW) { is_ret = true; zh_pcf8574_write_gpio(&led_handle, RET_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&led_handle, RET_LED_GREEN, LED_ON); zh_pcf8574_write_gpio(&relay_handle, RET_RELAY, RELAY_ON); zh_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_ON); vTaskDelay(20 / portTICK_PERIOD_MS); gpio_set_level(TRIAC_GPIO, HIGH); } else { gpio_set_level(TRIAC_GPIO, LOW); vTaskDelay(1 / portTICK_PERIOD_MS); zh_pcf8574_write_gpio(&led_handle, RET_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&led_handle, RET_LED_GREEN, LED_OFF); zh_pcf8574_write_gpio(&relay_handle, RET_RELAY, RELAY_OFF); zh_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_OFF); is_ret = false; } break; case EXT_BUTTON: if (is_ret == true) { break; } if (event->gpio_level == LOW) { is_ext = true; zh_pcf8574_write_gpio(&led_handle, EXT_LED_BLUE, LED_OFF); zh_pcf8574_write_gpio(&led_handle, EXT_LED_GREEN, LED_ON); zh_pcf8574_write_gpio(&relay_handle, EXT_RELAY, RELAY_ON); zh_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_ON); vTaskDelay(20 / portTICK_PERIOD_MS); gpio_set_level(TRIAC_GPIO, HIGH); } else { gpio_set_level(TRIAC_GPIO, LOW); vTaskDelay(1 / portTICK_PERIOD_MS); zh_pcf8574_write_gpio(&led_handle, EXT_LED_BLUE, LED_ON); zh_pcf8574_write_gpio(&led_handle, EXT_LED_GREEN, LED_OFF); zh_pcf8574_write_gpio(&relay_handle, EXT_RELAY, RELAY_OFF); zh_pcf8574_write_gpio(&relay_handle, GROUND_RELAY, RELAY_OFF); is_ext = false; } break; default: break; } }