#include "ate0004.h" #include "zh_pcf8574.h" static i2c_master_bus_handle_t i2c_bus_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; void zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); void app_main(void) { esp_log_level_set("zh_pcf8574", ESP_LOG_ERROR); esp_log_level_set("zh_vector", ESP_LOG_ERROR); 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); gpio_set_level(TRIAC_GPIO, LOW); 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_loop_create_default(); esp_event_handler_instance_register(ZH_PCF8574, ESP_EVENT_ANY_ID, &zh_pcf8574_event_handler, NULL, NULL); zh_pcf8574_init_config_t pcf8574_init_config = ZH_PCF8574_INIT_CONFIG_DEFAULT(); pcf8574_init_config.i2c_handle = i2c_bus_handle; pcf8574_init_config.i2c_address = LED_I2C_ADDRESS; zh_pcf8574_init(&pcf8574_init_config, &led_handle); pcf8574_init_config.i2c_address = RELAY_I2C_ADDRESS; zh_pcf8574_init(&pcf8574_init_config, &relay_handle); pcf8574_init_config.i2c_address = BUTTON_I2C_ADDRESS; pcf8574_init_config.p0_gpio_work_mode = true; pcf8574_init_config.p1_gpio_work_mode = true; pcf8574_init_config.p2_gpio_work_mode = true; pcf8574_init_config.interrupt_gpio = GPIO_NUM_17; zh_pcf8574_init(&pcf8574_init_config, &button_handle); 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); } 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_OFF); 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_ON); 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; } printf("Interrupt happened on device address 0x%02X on GPIO number %d at level %d.\n", event->i2c_address, event->gpio_number, event->gpio_level); }