#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_enabled = true; static bool _is_ret_enabled = false; static bool _is_ext_enabled = false; static void _zh_wifi_softap_init(void); static void _zh_webserver_init(void); static void _zh_gpio_init(void); static void _zh_pcf8574_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_pcf8574_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_pcf8574_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_enabled == false && _is_ext_enabled == false) { if (_is_ts_enabled == 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_enabled = 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_enabled = true; } } break; case RET_BUTTON: if (_is_ext_enabled == true) { break; } if (event->gpio_level == LOW) { _is_ret_enabled = 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(5 / 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_enabled = false; } break; case EXT_BUTTON: if (_is_ret_enabled == true) { break; } if (event->gpio_level == LOW) { _is_ext_enabled = 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(5 / 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_enabled = false; } break; default: break; } }