//Set the PWM pulse width in microseconds. //A servo typically works between 1000 and 2000us. void pwm_set_microseconds(int usec) { int duty_cycle = usec; ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, duty_cycle); ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0); }
/******************************************************* * 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; }