// Incluir la biblioteca necesaria
#include <TimerOne.h>
// Definir los pines necesarios
#define TRIAC_PIN 9
#define ZERO_CROSSING_PIN 2
// Variables para controlar el voltaje
volatile int voltageLevel = 0;
volatile boolean triacState = LOW;
// Función de interrupción para detectar el cruce por cero
void zeroCrossing() {
triacState = LOW; // Apagar el triac en cada cruce por cero
delayMicroseconds(voltageLevel); // Retardo para controlar el voltaje
triacState = HIGH; // Encender el triac después del retardo
}
void setup() {
pinMode(TRIAC_PIN, OUTPUT); // Configurar el pin del triac como salida
pinMode(ZERO_CROSSING_PIN, INPUT); // Configurar el pin de cruce por cero como entrada
// Configurar la interrupción en el pin de cruce por cero
attachInterrupt(digitalPinToInterrupt(ZERO_CROSSING_PIN), zeroCrossing, RISING);
// Configurar el temporizador para generar una interrupción cada 10 us
Timer1.initialize(10);
Timer1.attachInterrupt([](){
digitalWrite(TRIAC_PIN, triacState); // Controlar el estado del triac
});
}
void loop() {
// Leer el valor del voltaje deseado (0V a 15V)
voltageLevel = analogRead(A0) / 4; // Escalar el valor analógico a un rango de 0 a 15
// Esperar un tiempo antes de leer el siguiente valor
delay(100);
}