#include <Arduino.h>
// Pines y configuración inicial
const int pinFrecuencia = 27; // Pin para ajustar la frecuencia
const int pinCiclo = 13; // Pin para ajustar el ciclo de trabajo (duty cycle)
const int pinSalida = 33; // Pin de salida de la señal PWM
const int pinEntrada = 32; // Pin de entrada
int leds[] = {21, 14, 15, 18, 19}; // Pines para los LEDs
// Variables de configuración
int puestoLab = 1; // Valor para ajustar la frecuencia
int indiceFrecuencia = 0; // Índice para seleccionar frecuencia
int indiceCiclo = 0; // Índice para seleccionar ciclo de trabajo
int frecuencias[] = {1, 15, 30, 150, 300}; // Posibles frecuencias (Hz)
int ciclos[] = {6, 12, 18, 96}; // Posibles ciclos de trabajo (%)
// Temporizador
hw_timer_t *timer = NULL; // Declaración de un puntero para el temporizador
volatile bool interruptFlag = false; // Bandera para la interrupción
void IRAM_ATTR onTimer() {
// Código de interrupción
interruptFlag = true; // Establece la bandera de interrupción
}
void setup() {
Serial.begin(115200);
// Configurar pines como salida
for (int i = 0; i < 5; i++) {
pinMode(leds[i], OUTPUT);
digitalWrite(leds[i], LOW); // Apaga todos los LEDs al inicio
}
pinMode(pinFrecuencia, INPUT_PULLUP); // Botón para cambiar frecuencia
pinMode(pinCiclo, INPUT_PULLUP); // Botón para cambiar ciclo de trabajo
pinMode(pinEntrada, INPUT_PULLUP); // Pin de entrada para algún sensor
// Configuración del temporizador
timer = timerBegin(0, 80, true); // Temporizador 0 con prescaler 80
timerAttachInterrupt(timer, &onTimer, true); // Asocia la interrupción
timerAlarmWrite(timer, 1000000, true); // Alarma de 1 segundo (1 MHz/1000000)
timerAlarmEnable(timer); // Habilita la alarma
// Configuración de PWM
ledcSetup(0, frecuencias[indiceFrecuencia] + puestoLab, 8); // Canal 0, frecuencia, resolución 8 bits
ledcAttachPin(pinSalida, 0); // Asocia el pin de salida al canal 0
Serial.println("Configuración inicial completada.");
}
void loop() {
// Verifica si ocurrió una interrupción
if (interruptFlag) {
interruptFlag = false; // Reinicia la bandera
digitalWrite(leds[0], !digitalRead(leds[0])); // Cambia el estado del LED
}
// Leer los botones para cambiar frecuencia y ciclo de trabajo
if (digitalRead(pinFrecuencia) == LOW) { // Botón de frecuencia presionado
delay(200); // Anti-rebote
indiceFrecuencia = (indiceFrecuencia + 1) % 5; // Cambia al siguiente índice
ledcSetup(0, frecuencias[indiceFrecuencia] + puestoLab, 8); // Actualiza la frecuencia
Serial.print("Frecuencia cambiada a: ");
Serial.println(frecuencias[indiceFrecuencia] + puestoLab);
}
if (digitalRead(pinCiclo) == LOW) { // Botón de ciclo de trabajo presionado
delay(200); // Anti-rebote
indiceCiclo = (indiceCiclo + 1) % 4; // Cambia al siguiente índice
int dutyCycle = (ciclos[indiceCiclo] * 255) / 100; // Convierte a 8 bits
ledcWrite(0, dutyCycle); // Actualiza el ciclo de trabajo
Serial.print("Ciclo de trabajo cambiado a: ");
Serial.print(ciclos[indiceCiclo]);
Serial.println("%");
}
// Aquí puedes añadir más lógica para manejar otras entradas/salidas
}