Estou querendo controlar o brilho de uma lampada usando o Arduino
A questão que queria fazer a interrupção nada borda de subida.
Mudando para RISING a lampada só esta ficando ligada, não variando o brilho. Tem algo de errado com o código?
#include <TimerOne.h>
#define PINO_PASSAGEM_ZERO 2
#define PINO_SAIDA_LAMPADA 8
#define PINO_BOTAO_MAIS 4
#define DELTA_BRILHO_BTN 10
int brilho = 0;
long tempo_acionamento = 0;
bool travamento_btn_mais = false;
void calcula_tempo(){
tempo_acionamento = (long)((100 - brilho) * 83.3333);
}
void liga_lampada(){
digitalWrite(PINO_SAIDA_LAMPADA, HIGH);
Timer1.detachInterrupt();
}
void passagem_zero(){
if(brilho > 0 && brilho < 100){
digitalWrite(PINO_SAIDA_LAMPADA, LOW);
Timer1.attachInterrupt(liga_lampada, tempo_acionamento);
}
}
void setup() {
pinMode(PINO_PASSAGEM_ZERO, INPUT);
pinMode(PINO_BOTAO_MAIS, INPUT);
pinMode(PINO_SAIDA_LAMPADA, OUTPUT);
calcula_tempo();
//Inicializa o temporizador
Timer1.initialize();
//Executa a função passagem_zero na borda de subida
attachInterrupt(digitalPinToInterrupt(PINO_PASSAGEM_ZERO), passagem_zero, RISING);
}
void loop() {
if(digitalRead(PINO_BOTAO_MAIS) == HIGH){
if(travamento_btn_mais == false){
brilho += DELTA_BRILHO_BTN;
if(brilho > 90){
brilho = 100;
//digitalWrite(PINO_SAIDA_LAMPADA, HIGH);
}
calcula_tempo();
travamento_btn_mais = true;
}
}
else{
travamento_btn_mais = false;
}
}
Se eu estou a entender bem a sua ideia, se a lâmpada está a ser ligada é porque a o programa está a executar a rotina de interrupção externa, portanto a subida está a ser detectada. Sendo assim, o problema é que a lâmpada não está a ser desligada, ou seja, ou o tempo é muito grande, ou então, a rotina de interrupção do timer não está a ser executada. A minha sugestão é que execute uma depuração enviando para a porta série o valor do tempo de accionamento e/ou fazendo piscar um LED cada vez que entra dentro da rotina de interrupção do timer. Já agora, tem a certeza que o valor de 8.3 segundos está correcto?
Então.
Meu calculo foi assim.
A frequência da rede é 60Hz
Se consideramos o numero de vez q passa por zero temos 120Hz
Q da 0.00833s
A função Timer1.attachInterrupt tem como entrada o tempo em microsegundos
temos então 8333.33
O Brilho da lampada vai de 0 a 100
tempo = (100 - brilho) /100 * 8333.33 = (100 - brilho) * 83.3333
PauloMatos:
Então.
Meu calculo foi assim.
A frequência da rede é 60Hz
Se consideramos o numero de vez q passa por zero temos 120Hz
Q da 0.00833s
A função Timer1.attachInterrupt tem como entrada o tempo em microsegundos
temos então 8333.33
O Brilho da lampada vai de 0 a 100
tempo = (100 - brilho) /100 * 8333.33 = (100 - brilho) * 83.3333
Certo. O tempo é em microsegundos, não tinha percebido isso.
De qualquer forma o resto mantém-se. Uns LED a piscar quando entra dentro do calback da interrupção externa e da interrupção do timer e fica com uma ideia do que se passa.
Ontem passei algum tempo nisto e acabei por não perceber porque é que a temporização não funcionava.
Dito isto, não olhei com muita atenção ao datasheet nem ao código da Timer1. No entanto, o propósito dessa classe era criar PWM e não usar o temporizador como um temporizador normal... logo não ajuda.