Hello guys.
I am Paulo, Brazilian and I am facing a problem related to power control (dimmer).
I am using this tutorial as a reference: Controle PID de Potência em Corrente Alternada - Arduino e TRIAC - Parte III
My circuit is equivalent to this (Fixed the gnd of pin 3 of the MOC 3020):
In the test my circuit controls a simple bulb (60W / 127V AC). However, for several moments, the lamp flashes intermittently.
This is my sketch test (But I used the same sketch as the tutorial above and the result was the same):
#include <TimerOne.h>
#define trigger 4
volatile int power = 100;
void zeroCrossing() {
// Cálculo do ângulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
// (8333us - 8.33us) / 256 = 32 (aprox)
int powertime = (32 * (256 - power));
// Mantém o circuito desligado por powertime microssegundos
Timer1.initialize(powertime);
}
void shot() {
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(trigger, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(trigger, LOW);
// desativa o timer que foi ativado na funcao zeroCrossing.
TCCR1B = 0x00;
}
void setup() {
pinMode(trigger, OUTPUT);
Timer1.attachInterrupt(shot);
// Inicializa interrupção. O número zero indica a porta 2 do Arduino,
// zeroCrossing é a função que será chamada toda vez que o pino 2
// "subir" (RISING) de valor de 0 para 1
attachInterrupt(0, zeroCrossing, RISING);
}
void loop() {
power = 10;
delay(3000);
power = 120;
delay(3000);
power = 240;
delay(3000);
power = 120;
delay(3000);
}
In parallel, I performed a second test, removing the delays from the sketch and declaring a fixed value for power. Follow sketck:
#include <TimerOne.h>
#define trigger 4
volatile int power = 120;
void zeroCrossing() {
// Cálculo do ângulo de disparo: 60Hz-> 8.33ms (1/2 ciclo)
// (8333us - 8.33us) / 256 = 32 (aprox)
int powertime = (32 * (256 - power));
// Mantém o circuito desligado por powertime microssegundos
Timer1.initialize(powertime);
}
void shot() {
// Envia sinal ao TRIAC para que ele passe a conduzir
digitalWrite(trigger, HIGH);
// Espera alguns microssegundos para que o TRIAC perceba o pulso
delayMicroseconds(8.33);
// Desliga o pulso
digitalWrite(trigger, LOW);
// desativa o timer que foi ativado na funcao zeroCrossing.
TCCR1B = 0x00;
}
void setup() {
pinMode(trigger, OUTPUT);
Timer1.attachInterrupt(shot);
// Inicializa interrupção. O número zero indica a porta 2 do Arduino,
// zeroCrossing é a função que será chamada toda vez que o pino 2
// "subir" (RISING) de valor de 0 para 1
attachInterrupt(0, zeroCrossing, RISING);
}
void loop() {
}
In both cases the lamp flashes intermittently.
Could anyone tell me why this occurs? And how to solve?
Thank you.
test.ino (1.18 KB)