#include <Arduino.h>
#include "driver/ledc.h"
//Se definen los canales del PWM y los leds
#define pwmChannel 0
#define ledRChannel 1
#define ledGChannel 2
#define ledBChannel 3
//Se definen los pines correspondientes al servo, los botones y los leds
const int servoMotorPin = 13;
const int btn1Pin = 2;
const int btn2Pin = 4;
const int btn3Pin = 22;
const int btn4Pin = 23;
const int ledRPin = 33;
const int ledGPin = 25;
const int ledBPin = 32;
//Declaramos como volátiles los botones, ya que pueden cambiar sus valores con las interrupciones
volatile bool btn1Pressed = false;
volatile bool btn2Pressed = false;
volatile bool btn3Pressed = false;
volatile bool btn4Pressed = false;
volatile int ciclo = 80;
int currentLED = 1; //utilizamos esta variable para alternar con el botón B3 los leds
int brightness = 0; //indica que el brillo inicial del led seleccionado es cero
bool ledOn = false; //se utiliza para llevar un registro de que led esta siendo seleccionado
//Declaramos las interrupciones correspondientes cuando se presiona cada botón
void IRAM_ATTR ISR_btn1() {
btn1Pressed = true;
}
void IRAM_ATTR ISR_btn2() {
btn2Pressed = true;
}
void IRAM_ATTR ISR_btn3() {
btn3Pressed = true;
}
void IRAM_ATTR ISR_btn4() {
btn4Pressed = true;
}
//Configuramos los canales del servo
ledc_channel_config_t channel_configs[3];
ledc_channel_config_t servo_channel_config;
void setup() {
//Modo de función de los botones y leds
pinMode(btn1Pin, INPUT_PULLUP);
pinMode(btn2Pin, INPUT_PULLUP);
pinMode(btn3Pin, INPUT_PULLUP);
pinMode(btn4Pin, INPUT_PULLUP);
pinMode(ledRPin, OUTPUT);
pinMode(ledGPin, OUTPUT);
pinMode(ledBPin, OUTPUT);
pinMode(servoMotorPin, OUTPUT);
ledcAttachPin(servoMotorPin, LEDC_CHANNEL_0);
//Configuración de canales LEDC
channel_configs[0].gpio_num = ledRPin;
channel_configs[1].gpio_num = ledGPin;
channel_configs[2].gpio_num = ledBPin;
//Configuración de temporizador
for (int i = 0; i < 3; i++) {
channel_configs[i].speed_mode = LEDC_HIGH_SPEED_MODE;
channel_configs[i].channel = static_cast<ledc_channel_t>(i + 1);
channel_configs[i].intr_type = LEDC_INTR_DISABLE;
channel_configs[i].timer_sel = LEDC_TIMER_0;
channel_configs[i].duty = 0;
ledc_channel_config(&channel_configs[i]);
}
//Configuraciones del servo
servo_channel_config.gpio_num = servoMotorPin;
servo_channel_config.speed_mode = LEDC_HIGH_SPEED_MODE;
servo_channel_config.channel = LEDC_CHANNEL_0;
servo_channel_config.intr_type = LEDC_INTR_DISABLE;
servo_channel_config.timer_sel = LEDC_TIMER_0;
servo_channel_config.duty = ciclo;
ledc_channel_config(&servo_channel_config);
ledc_timer_config_t timer_config;
timer_config.speed_mode = LEDC_HIGH_SPEED_MODE;
timer_config.duty_resolution = LEDC_TIMER_10_BIT;
timer_config.timer_num = LEDC_TIMER_0;
timer_config.freq_hz = 80;
ledc_timer_config(&timer_config);
//Interrupciones de los botones
attachInterrupt(digitalPinToInterrupt(btn1Pin), ISR_btn1, FALLING);
attachInterrupt(digitalPinToInterrupt(btn2Pin), ISR_btn2, FALLING);
attachInterrupt(digitalPinToInterrupt(btn3Pin), ISR_btn3, FALLING);
attachInterrupt(digitalPinToInterrupt(btn4Pin), ISR_btn4, FALLING);
}
void loop() {
//Manejo de interrupciones de botones
if (btn1Pressed) {
if (ciclo < 150) {
ciclo += 10;
}
btn1Pressed = false;
}
if (btn2Pressed) {
if (ciclo > 30) {
ciclo -= 10;
}
btn2Pressed = false;
}
if (btn3Pressed) {
ledcWrite(ledRChannel, 0);
ledcWrite(ledGChannel, 0);
ledcWrite(ledBChannel, 0);
switch(currentLED) {
case 1:
ledcWrite(ledRChannel, brightness);
break;
case 2:
ledcWrite(ledGChannel, brightness);
break;
case 3:
ledcWrite(ledBChannel, brightness);
break;
}
//Actulizar el valor de currentLED de 1 a 2, luego a 3 y de regreso 1
//Aumenta el valor de currentLED en 1, si es mayor a 3 regresa 1, es un efecto circular.
currentLED = (currentLED + 1) > 3 ? : (currentLED + 1);
btn3Pressed = false;
}
if (btn4Pressed) {
brightness = (brightness + 25) % 256;
if (ledOn) {
int brillo = brightness;
if(brillo >= 255) {
brillo = 0;
}
switch (currentLED) {
case 1:
ledcWrite(ledRChannel, brightness);
break;
case 2:
ledcWrite(ledGChannel, brightness);
break;
case 3:
ledcWrite(ledBChannel, brightness);
break;
}
}
btn4Pressed = false;
}
switch (currentLED) {
case 1:
ledcWrite(ledRChannel, brightness);
break;
case 2:
ledcWrite(ledGChannel, brightness);
break;
case 3:
ledcWrite(ledBChannel, brightness);
break;
}
ledcWrite(LEDC_CHANNEL_0, ciclo);
ledcWrite(pwmChannel, ciclo);
delay(1000);
}