#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include "freertos/timers.h"
#include "driver/ledc.h"
#define led1 2
#define ledR 33
#define ledG 25
#define ledB 26
uint8_t led_level = 0;
static const char *tag = "Main";
TimerHandle_t xTimers;
int interval = 100;
int timerID = 1;
int dutyR = 0;
int dutyG = 300;
int dutyB = 600;
esp_err_t init_led(void);
esp_err_t blink_led(void);
esp_err_t set_timer(void);
esp_err_t set_pwm(void);
esp_err_t set_pwm_duty(void);
void vTimerCallback(TimerHandle_t pxTimer){
ESP_LOGI(tag, "Event was called from timer");
dutyR +=10;
if (dutyR > 1023){
dutyR = 0;
}
if(dutyG > 1023){
dutyG = 0;
}
if(dutyB > 1023){
dutyB = 0;
}
blink_led();
set_pwm_duty();
}
void app_main (void) {
init_led();
set_pwm();
set_timer();
}
esp_err_t init_led(void) {
gpio_set_direction(led1, GPIO_MODE_OUTPUT);
gpio_set_direction(ledR, GPIO_MODE_OUTPUT);
gpio_set_direction(ledG, GPIO_MODE_OUTPUT);
gpio_set_direction(ledB, GPIO_MODE_OUTPUT);
return ESP_OK;
}
esp_err_t blink_led(void){
led_level = !led_level;
gpio_set_level(led1, led_level);
return ESP_OK;
}
esp_err_t set_timer(void){
ESP_LOGI(tag, "The timer init configuration");
xTimers = xTimerCreate("Timer",
(pdMS_TO_TICKS(interval)),
pdTRUE,
(void *)timerID,
vTimerCallback
);
if (xTimers == NULL){
//the timer was not created
ESP_LOGI(tag,"The timer was not created.");
} else{
if(xTimerStart(xTimers,0)!= pdPASS){
//the timer could not be set into the active state
ESP_LOGI(tag, "The timer could not be set into the active state");
}
}
return ESP_OK;
}
esp_err_t set_pwm(void){
ledc_channel_config_t channelConfigR = {0};
channelConfigR.gpio_num = 33;
channelConfigR.speed_mode = LEDC_HIGH_SPEED_MODE;
channelConfigR.channel = LEDC_CHANNEL_0;
channelConfigR.intr_type = LEDC_INTR_DISABLE;
channelConfigR.timer_sel = LEDC_TIMER_0;
channelConfigR.duty = 0;
ledc_channel_config_t channelConfigG = {0};
channelConfigG.gpio_num = 25;
channelConfigG.speed_mode = LEDC_HIGH_SPEED_MODE;
channelConfigG.channel = LEDC_CHANNEL_1;
channelConfigG.intr_type = LEDC_INTR_DISABLE;
channelConfigG.timer_sel = LEDC_TIMER_0;
channelConfigG.duty = 0;
ledc_channel_config_t channelConfigB = {0};
channelConfigB.gpio_num = 26;
channelConfigB.speed_mode = LEDC_HIGH_SPEED_MODE;
channelConfigB.channel = LEDC_CHANNEL_2;
channelConfigB.intr_type = LEDC_INTR_DISABLE;
channelConfigB.timer_sel = LEDC_TIMER_0;
channelConfigB.duty = 0;
ledc_channel_config(&channelConfigR);
ledc_channel_config(&channelConfigG);
ledc_channel_config(&channelConfigB);
ledc_timer_config_t timerConfig = {0};
timerConfig.speed_mode = LEDC_HIGH_SPEED_MODE;
timerConfig.duty_resolution = LEDC_TIMER_10_BIT;
timerConfig.timer_num = LEDC_CHANNEL_0;
timerConfig.freq_hz = 20000;
ledc_timer_config(&timerConfig);
return ESP_OK;
}
esp_err_t set_pwm_duty(void){
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, dutyR);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_1, dutyR);
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_2, dutyR);
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;
}