/*#include <Arduino.h>
#include <Servo.h>
const int servoPin = 15; // Pin de señal PWM para el servomotor
const int buttonPin1 = 32; // Boton 1
const int buttonPin2 = 33; // Boton 2
Servo servo;
int servoPosition = 90; // Posición inicial del servo (90°)
int minServoPosition = 0; // Posición mínima del servo (0°)
int maxServoPosition = 180; // Posición máxima del servo (180°)
volatile bool button1Pressed = false;
volatile bool button2Pressed = false;
//Verificación de que boton esta presionado
void IRAM_ATTR button1ISR() {
button1Pressed = true;
}
void IRAM_ATTR button2ISR() {
button2Pressed = true;
}
void setup() {
Serial.begin(115200);
servo.attach(servoPin); // Inicializar el servo
servo.write(servoPosition); // Mover el servo a la posición inicial
pinMode(buttonPin1, INPUT_PULLUP);
pinMode(buttonPin2, INPUT_PULLUP);
// Interrupciones para los botones
attachInterrupt(digitalPinToInterrupt(buttonPin1), button1ISR, FALLING);
attachInterrupt(digitalPinToInterrupt(buttonPin2), button2ISR, FALLING);
}
void loop() {
if (button1Pressed) {
servoPosition += servoIncrement;
if (servoPosition > maxServoPosition) {
servoPosition = maxServoPosition;
}
servo.write(servoPosition);
button1Pressed = false;
}
if (button2Pressed) {
servoPosition -= servoIncrement;
if (servoPosition < minServoPosition) {
servoPosition = minServoPosition;
}
servo.write(servoPosition);
button2Pressed = false;
}
}
*/
#include <Arduino.h>
#include "driver/ledc.h"
const int ButtonPinIncrement = 32; //Pin para boton 1
const int ButtonPinDecrement = 33; //Pin para boton 2
volatile bool incremento = true; //Para generar el movimiento
volatile bool decremento = true; //Para generar el movimiento
volatile int dutycicle = 90;
void IRAM_ATTR ISR_1() {
incremento = false;
}
void IRAM_ATTR ISR_2() {
decremento = false;
}
ledc_channel_config_t channel_config; //PMW
void setup() {
// Interrupciones de botones y resistencias internas
pinMode(ButtonPinIncrement, INPUT_PULLUP);
attachInterrupt(ButtonPinIncrement, ISR_1, FALLING);
pinMode(ButtonPinDecrement, INPUT_PULLUP);
attachInterrupt(ButtonPinDecrement, ISR_2, FALLING);
//Configuración del PWM y timer
channel_config.gpio_num = 15;
channel_config.speed_mode = LEDC_HIGH_SPEED_MODE;
channel_config.channel = LEDC_CHANNEL_0;
channel_config.intr_type = LEDC_INTR_DISABLE;
channel_config.timer_sel = LEDC_TIMER_0;
channel_config.duty = 30;
ledc_channel_config(&channel_config);
ledc_timer_config_t timer_config;
ledc_timer_config(&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 = 50; //Frecuencia
ledc_timer_config(&timer_config);
}
void loop() {
// put your main code here, to run repeatedly:
//Se establece el máximo valor al que puede llegar el servomotor
//Si se habilitó la interrucpicón de incrementar, se cambia el valor del ciclo de trabajo para aumentar 45 grados a la posción anterior
// Incrementar o decrementar el contador según el botón presionado se detecta si hay cambios generados por la interrupción y se realiza el movimimiento del ciclo se trabajo
if (!incremento) {
dutycicle = dutycicle +25;
if (dutycicle >= 125) {
dutycicle = 125;
}
else{
dutycicle = dutycicle;
}
delay(200);
incremento = true;
}
//Se establece el minimo valor al que puede llegar el servomotor
//Si se habilitó la interrucpicón de decrementar, se cambia el valor del ciclo de trabajo para disminuit 45 grados a la posción anterior
// Incrementar o decrementar el contador según el botón presionado se detecta si hay cambios generados por la interrupción y se realiza la suma en el contador
if (!decremento) {
dutycicle = dutycicle - 25;
if (dutycicle <= 25) {
dutycicle = 25;
}
else{
dutycicle = dutycicle;
}
delay(200);
decremento = true;
}
//Se actualiza el ciclo de trabajo para poner el servomotor en la posición indicada
ledc_set_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0, dutycicle );
ledc_update_duty(LEDC_HIGH_SPEED_MODE, LEDC_CHANNEL_0);
delay(2000);
}