/** * 板载rgb灯初始化 * @param[in] timer_config :填充驱动rgb所需要的定时器相关参数 * @param[in] channel_config :填充rgb对应的gpio以及选择相对应的PWM口驱动等参数 * @param[in] rgb_led_counts :rgb灯的个数,即对应控制的rgb灯需要多少个gpio口 * @retval * - ESP_OK * - 其他错误 * @par 修改日志 * Ver0.0.1: Helon_Chan, 2018/06/24, 初始化版本\n */ esp_err_t rgb_init(ledc_timer_config_t *timer_config, ledc_channel_config_t *channel_config, uint8_t rgb_led_counts) { esp_err_t err_code; if ((timer_config == NULL) || (channel_config == NULL) || (rgb_led_counts == 0)) { ESP_LOGI("rgb_init", "ERR_INVALID_ARG is %d\n", ESP_ERR_INVALID_ARG); err_code = ESP_ERR_INVALID_ARG; return err_code; } /* 保存用户填充的时间和通道参数 */ gs_m_lec_timer_config = timer_config; gs_m_ledc_channel_config = channel_config; /* 设置驱动RGB的PWM相关参数 */ err_code = ledc_timer_config(timer_config); if(err_code != ESP_OK) { ESP_LOGI("rgb_init", "ledc_timer_config fail,reason is %d\n", err_code); return err_code; } /* 根据rgb的个数配置 */ for (uint8_t i = 0; i < rgb_led_counts; i++) { ledc_channel_config_t *s_ledc_channel_config = (ledc_channel_config_t *)(channel_config + i); err_code = ledc_channel_config(s_ledc_channel_config); if (err_code != ESP_OK) { ESP_LOGI("rgb_init", "ledc_channel_config fail,reason is %d\n", err_code); return err_code; } err_code = ledc_stop(s_ledc_channel_config->speed_mode, s_ledc_channel_config->channel, 1); if (err_code != ESP_OK) { ESP_LOGI("rgb_init", "ledc_stop fail,reason is %d\n", err_code); return err_code; } } /* 初始化fade服务 */ err_code = ledc_fade_func_install(0); if(err_code != ESP_OK) { ESP_LOGI("rgb_init", "ledc_fade_func_install fail,reason is %d\n", err_code); return err_code; } return err_code; }
void pwm_configure(int pin) { //Configure timer for PWM ledc_timer_config_t timer_conf; timer_conf.bit_num = LEDC_TIMER_15_BIT; timer_conf.freq_hz = 50; //50 = 20ms timer_conf.speed_mode = LEDC_HIGH_SPEED_MODE; timer_conf.timer_num = LEDC_TIMER_0; ledc_timer_config(&timer_conf); //Set a LEDC channel for PWM ledc_channel_config_t ledc_conf; ledc_conf.channel = LEDC_CHANNEL_0; ledc_conf.duty = 3276; ledc_conf.gpio_num = pin; ledc_conf.intr_type = LEDC_INTR_DISABLE; ledc_conf.speed_mode = LEDC_HIGH_SPEED_MODE; ledc_conf.timer_sel = LEDC_TIMER_0; ledc_channel_config(&ledc_conf); }
/******************************************************* * Function Definitions *******************************************************/ esp_err_t mesh_light_init(void) { if (s_light_inited == true) { return ESP_OK; } s_light_inited = true; ledc_timer_config_t ledc_timer = { .bit_num = LEDC_TIMER_13_BIT, .freq_hz = 5000, .speed_mode = LEDC_HIGH_SPEED_MODE, .timer_num = LEDC_TIMER_0 }; ledc_timer_config(&ledc_timer); ledc_channel_config_t ledc_channel = { .channel = LEDC_CHANNEL_0, .duty = 100, .gpio_num = LEDC_IO_0, .intr_type = LEDC_INTR_FADE_END, .speed_mode = LEDC_HIGH_SPEED_MODE, .timer_sel = LEDC_TIMER_0 }; ledc_channel_config(&ledc_channel); ledc_channel.channel = LEDC_CHANNEL_1; ledc_channel.gpio_num = LEDC_IO_1; ledc_channel_config(&ledc_channel); ledc_channel.channel = LEDC_CHANNEL_2; ledc_channel.gpio_num = LEDC_IO_2; ledc_channel_config(&ledc_channel); ledc_channel.channel = LEDC_CHANNEL_3; ledc_channel.gpio_num = LEDC_IO_3; ledc_channel_config(&ledc_channel); ledc_fade_func_install(0); mesh_light_set(MESH_LIGHT_INIT); return ESP_OK; } esp_err_t mesh_light_set(int color) { switch (color) { case MESH_LIGHT_RED: /* Red */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 0); break; case MESH_LIGHT_GREEN: /* Green */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 0); break; case MESH_LIGHT_BLUE: /* Blue */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 3000); break; case MESH_LIGHT_YELLOW: /* Yellow */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 0); break; case MESH_LIGHT_PINK: /* Pink */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 3000); break; case MESH_LIGHT_INIT: /* can't say */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 3000); break; case MESH_LIGHT_WARNING: /* warning */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 3000); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 3000); break; default: /* off */ ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, 0); ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, 0); } ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2); return ESP_OK; } void mesh_connected_indicator(int layer) { switch (layer) { case 1: mesh_light_set(MESH_LIGHT_PINK); break; case 2: mesh_light_set(MESH_LIGHT_YELLOW); break; case 3: mesh_light_set(MESH_LIGHT_RED); break; case 4: mesh_light_set(MESH_LIGHT_BLUE); break; case 5: mesh_light_set(MESH_LIGHT_GREEN); break; case 6: mesh_light_set(MESH_LIGHT_WARNING); break; default: mesh_light_set(0); } } void mesh_disconnected_indicator(void) { mesh_light_set(MESH_LIGHT_WARNING); } esp_err_t mesh_light_process(mesh_addr_t *from, uint8_t *buf, uint16_t len) { mesh_light_ctl_t *in = (mesh_light_ctl_t *) buf; if (!from || !buf || len < sizeof(mesh_light_ctl_t)) { return ESP_FAIL; } if (in->token_id != MESH_TOKEN_ID || in->token_value != MESH_TOKEN_VALUE) { return ESP_FAIL; } if (in->cmd == MESH_CONTROL_CMD) { if (in->on) { mesh_connected_indicator(esp_mesh_get_layer()); } else { mesh_light_set(0); } } return ESP_OK; }