diff --git a/.DS_Store b/.DS_Store index e7a7537..bea775e 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/ds/PCF8574.pdf b/ds/PCF8574.pdf new file mode 100644 index 0000000..ff34a1e Binary files /dev/null and b/ds/PCF8574.pdf differ diff --git a/main/CMakeLists.txt b/main/CMakeLists.txt index 38af136..35b18b3 100755 --- a/main/CMakeLists.txt +++ b/main/CMakeLists.txt @@ -1 +1 @@ -idf_component_register(SRCS "main.c" INCLUDE_DIRS "" REQUIRES zh_pcf8574) \ No newline at end of file +idf_component_register(SRCS "ate0004.c" INCLUDE_DIRS "" REQUIRES zh_pcf8574) \ No newline at end of file diff --git a/main/ate0004.c b/main/ate0004.c new file mode 100755 index 0000000..038701b --- /dev/null +++ b/main/ate0004.c @@ -0,0 +1,135 @@ +#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); +} \ No newline at end of file diff --git a/main/ate0004.h b/main/ate0004.h new file mode 100644 index 0000000..126aa15 --- /dev/null +++ b/main/ate0004.h @@ -0,0 +1,41 @@ +#pragma once + +#define HIGH true +#define LOW false + +#define LED_OFF LOW +#define LED_ON HIGH + +#define RELAY_OFF LOW +#define RELAY_ON HIGH + +#define TRIAC_GPIO GPIO_NUM_4 + +#define BUTTON_I2C_ADDRESS 0x22 // U7. +#define LED_I2C_ADDRESS 0x21 // U6. +#define RELAY_I2C_ADDRESS 0x20 // U5. + +#define GROUND_RELAY 0x00 // Relay K1. RL1 pin on U5. +#define TS_RELAY 0x04 // Relay K4. RL4 pin on U5. +#define RET_RELAY 0x03 // Relay K3. RL3 pin on U5. +#define EXT_RELAY 0x02 // Relay K2. RL2 pin on U5. + +#define TS_BUTTON 0x00 // Connector BT1. B1-0 on U7. +#define RET_BUTTON 0x01 // Connector BT2. B2-1 on U7. +#define EXT_BUTTON 0x02 // Connector BT3. B3-2 on U7. + +#define TS_LED_RED 0x00 // Connector LE1. 2 PIN. L1-0 pin on U6. +#define TS_LED_GREEN 0x01 // Connector LE1. 1 PIN. L1-1 pin on U6. +#define RET_LED_BLUE 0x02 // Connector LE2. 2 PIN. L2-2 pin on U6. +#define RET_LED_GREEN 0x03 // Connector LE2. 1 PIN. L2-3 pin on U6. +#define EXT_LED_BLUE 0x04 // Connector LE3. 2 PIN. L3-4 pin on U6. +#define EXT_LED_GREEN 0x05 // Connector LE3. 1 PIN. L3-5 pin on U6. + +#ifdef __cplusplus +extern "C" +{ +#endif + +#ifdef __cplusplus +} +#endif \ No newline at end of file diff --git a/main/main.c b/main/main.c deleted file mode 100755 index 7dd4133..0000000 --- a/main/main.c +++ /dev/null @@ -1,93 +0,0 @@ -#include "zh_pcf8574.h" - -#define I2C_PORT (I2C_NUM_MAX - 1) - -#ifndef CONFIG_IDF_TARGET_ESP8266 -i2c_master_bus_handle_t i2c_bus_handle = NULL; -#endif - -zh_pcf8574_handle_t pcf8574_handle = {0}; - -void zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data); // Required only if used input GPIO interrupts. - -void print_gpio_status(const char *message, uint8_t reg) -{ - printf("%s", message); - for (uint8_t i = 0; i < 8; ++i) - { - printf("%c", (reg & 0x80) ? '1' : '0'); - reg <<= 1; - } - printf(".\n"); -} - -void app_main(void) -{ - esp_log_level_set("zh_pcf8574", ESP_LOG_NONE); // For ESP8266 first enable "Component config -> Log output -> Enable log set level" via menuconfig. - esp_log_level_set("zh_vector", ESP_LOG_NONE); // For ESP8266 first enable "Component config -> Log output -> Enable log set level" via menuconfig. -#ifdef CONFIG_IDF_TARGET_ESP8266 - i2c_config_t i2c_config = { - .mode = I2C_MODE_MASTER, - .sda_io_num = GPIO_NUM_4, // In accordance with used chip. - .sda_pullup_en = GPIO_PULLUP_ENABLE, - .scl_io_num = GPIO_NUM_5, // In accordance with used chip. - .scl_pullup_en = GPIO_PULLUP_ENABLE, - }; - i2c_driver_install(I2C_PORT, i2c_config.mode); - i2c_param_config(I2C_PORT, &i2c_config); -#else - i2c_master_bus_config_t i2c_bus_config = { - .clk_source = I2C_CLK_SRC_DEFAULT, - .i2c_port = I2C_PORT, - .scl_io_num = GPIO_NUM_22, // In accordance with used chip. - .sda_io_num = GPIO_NUM_21, // In accordance with used chip. - .glitch_ignore_cnt = 7, - .flags.enable_internal_pullup = true, - }; - i2c_new_master_bus(&i2c_bus_config, &i2c_bus_handle); -#endif - esp_event_loop_create_default(); // Required only if used input GPIO interrupts. -#ifdef CONFIG_IDF_TARGET_ESP8266 - esp_event_handler_register(ZH_PCF8574, ESP_EVENT_ANY_ID, &zh_pcf8574_event_handler, NULL); // Required only if used input GPIO interrupts. -#else - esp_event_handler_instance_register(ZH_PCF8574, ESP_EVENT_ANY_ID, &zh_pcf8574_event_handler, NULL, NULL); // Required only if used input GPIO interrupts. -#endif - zh_pcf8574_init_config_t pcf8574_init_config = ZH_PCF8574_INIT_CONFIG_DEFAULT(); -#ifdef CONFIG_IDF_TARGET_ESP8266 - pcf8574_init_config.i2c_port = I2C_PORT; -#else - pcf8574_init_config.i2c_handle = i2c_bus_handle; -#endif - pcf8574_init_config.i2c_address = 0x38; - pcf8574_init_config.p0_gpio_work_mode = true; // Required only for input GPIO. - pcf8574_init_config.interrupt_gpio = GPIO_NUM_14; // Required only if used input GPIO interrupts. - zh_pcf8574_init(&pcf8574_init_config, &pcf8574_handle); - uint8_t reg = 0; - zh_pcf8574_read(&pcf8574_handle, ®); - print_gpio_status("GPIO status: ", reg); - printf("Set P7 to 1, P1 to 1 and P0 to 0.\n"); - zh_pcf8574_write(&pcf8574_handle, 0b10000010); // GPIO P0 will not be changed because it is operating in input mode. - zh_pcf8574_read(&pcf8574_handle, ®); - print_gpio_status("GPIO status: ", reg); - printf("Sets P0 to 0.\n"); - zh_pcf8574_write_gpio(&pcf8574_handle, 0, false); // GPIO P0 will not be changed because it is operating in input mode. - bool gpio = 0; - zh_pcf8574_read_gpio(&pcf8574_handle, 0, &gpio); - printf("P0 status: %d.\n", gpio); - printf("Set P1 to 0.\n"); - zh_pcf8574_write_gpio(&pcf8574_handle, 1, false); - zh_pcf8574_read_gpio(&pcf8574_handle, 1, &gpio); - printf("P1 status: %d.\n", gpio); - zh_pcf8574_read(&pcf8574_handle, ®); - print_gpio_status("GPIO status: ", reg); - printf("Reset all GPIO.\n"); - zh_pcf8574_reset(&pcf8574_handle); - zh_pcf8574_read(&pcf8574_handle, ®); - print_gpio_status("GPIO status: ", reg); -} - -void zh_pcf8574_event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) // Required only if used input GPIO interrupts. -{ - zh_pcf8574_event_on_isr_t *event = event_data; - 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); -} \ No newline at end of file diff --git a/sdkconfig b/sdkconfig index f29068c..be81497 100644 --- a/sdkconfig +++ b/sdkconfig @@ -254,7 +254,7 @@ CONFIG_IDF_TOOLCHAIN_GCC=y CONFIG_IDF_TARGET_ARCH_XTENSA=y CONFIG_IDF_TARGET_ARCH="xtensa" CONFIG_IDF_TARGET="esp32" -CONFIG_IDF_INIT_VERSION="$IDF_INIT_VERSION" +CONFIG_IDF_INIT_VERSION="5.5.1" CONFIG_IDF_TARGET_ESP32=y CONFIG_IDF_FIRMWARE_CHIP_ID=0x0000